diff --git a/Sources/XcodeGen/main.swift b/Sources/XcodeGen/main.swift index ff334e8c..ee9f8611 100644 --- a/Sources/XcodeGen/main.swift +++ b/Sources/XcodeGen/main.swift @@ -15,28 +15,29 @@ import xcodeproj func generate(spec: String) { - let specPath = Path("~/Developer/XcodeGen/TestProject/spec.yml").normalize() + let specPath = Path(spec).normalize() + let projectPath = specPath.parent() + "\(specPath.lastComponent).xcodeproj" let spec: Spec do { spec = try Spec(path: specPath) - print(spec) - print("") - + print("Loaded spec: \(spec.targets.count) targets, \(spec.schemes.count) schemes, \(spec.configs.count) configs") } catch { print("Parsing spec failed: \(error)") return } do { - try Generator.generate(spec: spec, path: Path("~/Developer/XcodeGen/TestProject/spec.xcodeproj").normalize()) - print("Generated Xcode Project") + let projectGenerator = ProjectGenerator(spec: spec, path: projectPath) + let project = try projectGenerator.generate() + print("Generated project") + try project.write(override: true) + print("Wrote project to file \(projectPath.string)") } catch { - print("Generation failed: \(error)") + print("Project Generation failed: \(error)") } } - command( Option("spec", "", flag: "p", description: "The path to the spec file"), generate) diff --git a/Sources/XcodeGenKit/ProjectExtensions.swift b/Sources/XcodeGenKit/ProjectExtensions.swift new file mode 100644 index 00000000..7dd0a86b --- /dev/null +++ b/Sources/XcodeGenKit/ProjectExtensions.swift @@ -0,0 +1,21 @@ +// +// ProjectExtensions.swift +// XcodeGen +// +// Created by Yonas Kolb on 19/7/17. +// +// + +import Foundation +import xcodeproj + +extension Array where Element: ProjectElement { + + var referenceList: [String] { + return map { $0.reference } + } + + var referenceSet: Set { + return Set(referenceList) + } +} diff --git a/Sources/XcodeGenKit/Generator.swift b/Sources/XcodeGenKit/ProjectGenerator.swift similarity index 67% rename from Sources/XcodeGenKit/Generator.swift rename to Sources/XcodeGenKit/ProjectGenerator.swift index 5d72c248..9d595a8c 100644 --- a/Sources/XcodeGenKit/Generator.swift +++ b/Sources/XcodeGenKit/ProjectGenerator.swift @@ -11,15 +11,24 @@ import PathKit import xcodeproj import xcodeprojprotocols -public struct Generator { +public class ProjectGenerator { - public static func generate(spec: Spec, path: Path) throws { + let spec: Spec + let path: Path + + public init(spec: Spec, path: Path) { + self.spec = spec + self.path = path + } + + public func generate() throws -> XcodeProj { let workspaceReferences: [XCWorkspace.Data.FileRef] = [XCWorkspace.Data.FileRef.project(path: path)] let workspaceData = XCWorkspace.Data(path: path + "project.xcworkspace/contents.xcworkspacedata", references: workspaceReferences) let workspace = XCWorkspace(path: path + "project.xcworkspace", data: workspaceData) var objects: [PBXObject] = [] + var groupsByPath: [String: String] = [:] var ids = 0 func id() -> String { @@ -28,47 +37,77 @@ public struct Generator { // return "OBJECT_\(ids)" } - let mainGroup = PBXGroup(reference: id(), children: [], sourceTree: .group) - let buildConfigs = spec.configs.map { config in XCBuildConfiguration(reference: id(), name: config.name, baseConfigurationReference: nil, buildSettings: BuildSettings(dictionary: config.settings)) } - let buildConfigList = XCConfigurationList(reference: id(), buildConfigurations: Set(buildConfigs.map { $0.reference }), defaultConfigurationName: buildConfigs.first?.name ?? "", defaultConfigurationIsVisible: 0) + let buildConfigList = XCConfigurationList(reference: id(), buildConfigurations: buildConfigs.referenceSet, defaultConfigurationName: buildConfigs.first?.name ?? "", defaultConfigurationIsVisible: 0) objects += buildConfigs.map { .xcBuildConfiguration($0) } objects.append(.xcConfigurationList(buildConfigList)) + + var groups: [PBXGroup] = [] + var fileReferences: [PBXFileReference] = [] + var topLevelGroups: [PBXGroup] = [] + + func getGroup(path: Path) throws -> PBXGroup { + + let directories = try path.children().filter { $0.isDirectory } + let files = try path.children().filter { $0.isFile } + var children: [String] = [] + + for path in files { + let fileReference = PBXFileReference(reference: id(), sourceTree: .group, path: path.lastComponent) + fileReferences.append(fileReference) + children.append(fileReference.reference) + } + + for path in directories { + let group = try getGroup(path: path) + children.append(group.reference) + } + + let group = PBXGroup(reference: id(), children: Set(children), sourceTree: .group, name: path.lastComponent, path: path.lastComponent) + groups.append(group) + return group + } + var targets: [String] = [] for target in spec.targets { - let sourcePaths: [Path] = try target.sources.reduce([]) { paths, source in -// $0 + spec.path.parent().glob($1) - let sourcePaths = spec.path.parent() + source - let sourceFiles = try sourcePaths.recursiveChildren().filter { $0.isFile } - return paths + sourceFiles - } - let fileReferences = sourcePaths.map { PBXFileReference(reference: id(), sourceTree: .group, path: $0.lastComponent) } - let buildFiles = fileReferences.map { PBXBuildFile(reference: id(), fileRef: $0.reference) } - let buildPhase = PBXSourcesBuildPhase(reference: id(), files: Set(buildFiles.map { $0.reference })) - let buildPhases = [buildPhase] + let source = spec.path.parent() + target.sources.first! - let productReference = PBXFileReference(reference: id(), sourceTree: .buildProductsDir, path: target.name, includeInIndex: 0) - - let buildConfigList = XCConfigurationList(reference: id(), buildConfigurations: [], defaultConfigurationName: "") - let nativeTarget = PBXNativeTarget(reference: id(), buildConfigurationList: buildConfigList.reference, buildPhases: buildPhases.map{ $0.reference }, buildRules: [], dependencies: [], name: target.name, productReference: productReference.reference, productType: target.type) - - objects += buildFiles.map { .pbxBuildFile($0) } + groups = [] + fileReferences = [] + let sourceGroup = try getGroup(path: source) + topLevelGroups.append(sourceGroup) + objects += groups.map { .pbxGroup($0) } objects += fileReferences.map { .pbxFileReference($0) } + + let buildFiles = fileReferences.map { PBXBuildFile(reference: id(), fileRef: $0.reference) } + objects += buildFiles.map { .pbxBuildFile($0) } + let buildPhase = PBXSourcesBuildPhase(reference: id(), files: buildFiles.referenceSet) + let buildPhases = [buildPhase] objects += buildPhases.map { .pbxSourcesBuildPhase($0) } + + let buildConfigList = XCConfigurationList(reference: id(), buildConfigurations: [], defaultConfigurationName: "") objects.append(.xcConfigurationList(buildConfigList)) - objects.append(.pbxNativeTarget(nativeTarget)) + + + let productReference = PBXFileReference(reference: id(), sourceTree: .buildProductsDir, path: target.name, includeInIndex: 0) objects.append(.pbxFileReference(productReference)) + let nativeTarget = PBXNativeTarget(reference: id(), buildConfigurationList: buildConfigList.reference, buildPhases: buildPhases.referenceList, buildRules: [], dependencies: [], name: target.name, productReference: productReference.reference, productType: target.type) + objects.append(.pbxNativeTarget(nativeTarget)) + targets.append(nativeTarget.reference) } + let mainGroup = PBXGroup(reference: id(), children: topLevelGroups.referenceSet, sourceTree: .group) + objects.append(.pbxGroup(mainGroup)) + let pbxProjectRoot = PBXProject(reference: id(), buildConfigurationList: buildConfigList.reference, compatibilityVersion: "Xcode 3.2", mainGroup: mainGroup.reference, targets: targets) objects.append(.pbxProject(pbxProjectRoot)) @@ -87,7 +126,7 @@ public struct Generator { let sharedData = XCSharedData(path: path + "xcshareddata", schemes: schemes) let project = XcodeProj(path: path, workspace: workspace, pbxproj: pbxProject, sharedData: sharedData) - try project.write(override: true) + return project } } diff --git a/Sources/XcodeGenKit/Spec.swift b/Sources/XcodeGenKit/Spec.swift deleted file mode 100644 index da65768c..00000000 --- a/Sources/XcodeGenKit/Spec.swift +++ /dev/null @@ -1,137 +0,0 @@ -// -// Spec.swift -// XcodeGen -// -// Created by Yonas Kolb on 19/5/17. -// -// - -import Foundation -import xcodeproj -import JSONUtilities -import PathKit -import Yams - -extension Spec { - - public init(path: Path) throws { - var url = URL(string: path.string)! - if url.scheme == nil { - url = URL(fileURLWithPath: path.string) - } - - let data = try Data(contentsOf: url) - let string = String(data: data, encoding: .utf8)! - - try self.init(path: path, string: string) - } - - public init(path: Path, string: String) throws { - let yaml = try Yams.load(yaml: string) - let json = yaml as! JSONDictionary - - try self.init(path: path, jsonDictionary: json) - } - - public init(path: Path, jsonDictionary: JSONDictionary) throws { - self.path = path - settingGroups = try jsonDictionary.json(atKeyPath: "settingGroups") - configs = try jsonDictionary.json(atKeyPath: "configs") - targets = try jsonDictionary.json(atKeyPath: "targets") - schemes = try jsonDictionary.json(atKeyPath: "schemes") - } -} - - -public struct Spec { - - public var settingGroups: [BuildSettingGroup] - public var configs: [Config] - public var targets: [TargetSpec] - public var schemes: [SchemeSpec] - public var path: Path -} - -public struct TargetSpec { - public var name: String - public var type: PBXProductType - public var localizedSource: String? - public var sources: [String] - public var sourceExludes: [String] - public var dependancies: [Dependancy] - public var prebuildScripts: [String] - public var postbuildScripts: [String] -} - -extension TargetSpec: NamedJSONObjectConvertible { - - public init(name: String, jsonDictionary: JSONDictionary) throws { - self.name = name - let typeString: String = try jsonDictionary.json(atKeyPath: "type") - if let type = PBXProductType(rawValue: typeString) { - self.type = type - } else { - switch typeString { - case "application": type = .application - case "framework": type = .framework - default: throw SpecError.unknownTargetType(typeString) - } - } - sources = jsonDictionary.json(atKeyPath: "sources") ?? [] - sourceExludes = jsonDictionary.json(atKeyPath: "sourceExludes") ?? [] - dependancies = jsonDictionary.json(atKeyPath: "dependancies") ?? [] - prebuildScripts = jsonDictionary.json(atKeyPath: "prebuildScripts") ?? [] - postbuildScripts = jsonDictionary.json(atKeyPath: "postbuildScripts") ?? [] - } -} - - -public struct Dependancy { - - public var path: String - public var type: DependancyType - - public enum DependancyType: String { - case target - case system - } -} - -extension Dependancy: JSONObjectConvertible { - - public init(jsonDictionary: JSONDictionary) throws { - path = try jsonDictionary.json(atKeyPath: "path") - type = try jsonDictionary.json(atKeyPath: "type") - } -} - -public struct Config { - public var name: String - public var buildSettingGroups: [BuildSettingGroup] - public var settings: [String: String] -} - -extension Config: NamedJSONObjectConvertible { - - public init(name: String, jsonDictionary: JSONDictionary) throws { - self.name = name - buildSettingGroups = try jsonDictionary.json(atKeyPath: "settingGroups") - settings = jsonDictionary.json(atKeyPath: "settings") ?? [:] - } -} - -public struct BuildSettingGroup { - public var name: String - public var buildSettings: [String: String] -} - -extension BuildSettingGroup: NamedJSONObjectConvertible { - - public init(name: String, jsonDictionary: JSONDictionary) throws { - self.name = name - buildSettings = [:] - for (key, value) in jsonDictionary { - buildSettings[key] = String(describing: value) - } - } -} diff --git a/Sources/XcodeGenKit/Spec/BuildSettingGroup.swift b/Sources/XcodeGenKit/Spec/BuildSettingGroup.swift new file mode 100644 index 00000000..75f0e3fd --- /dev/null +++ b/Sources/XcodeGenKit/Spec/BuildSettingGroup.swift @@ -0,0 +1,27 @@ +// +// BuildSettings.swift +// XcodeGen +// +// Created by Yonas Kolb on 20/7/17. +// +// + +import Foundation +import xcodeproj +import JSONUtilities + +public struct BuildSettingGroup { + public var name: String + public var buildSettings: [String: String] +} + +extension BuildSettingGroup: NamedJSONObjectConvertible { + + public init(name: String, jsonDictionary: JSONDictionary) throws { + self.name = name + buildSettings = [:] + for (key, value) in jsonDictionary { + buildSettings[key] = String(describing: value) + } + } +} diff --git a/Sources/XcodeGenKit/Spec/Config.swift b/Sources/XcodeGenKit/Spec/Config.swift new file mode 100644 index 00000000..e2a62d90 --- /dev/null +++ b/Sources/XcodeGenKit/Spec/Config.swift @@ -0,0 +1,26 @@ +// +// Config.swift +// XcodeGen +// +// Created by Yonas Kolb on 20/7/17. +// +// + +import Foundation +import xcodeproj +import JSONUtilities + +public struct Config { + public var name: String + public var buildSettingGroups: [BuildSettingGroup] + public var settings: [String: String] +} + +extension Config: NamedJSONObjectConvertible { + + public init(name: String, jsonDictionary: JSONDictionary) throws { + self.name = name + buildSettingGroups = try jsonDictionary.json(atKeyPath: "settingGroups") + settings = jsonDictionary.json(atKeyPath: "settings") ?? [:] + } +} diff --git a/Sources/XcodeGenKit/Scheme.swift b/Sources/XcodeGenKit/Spec/Scheme.swift similarity index 85% rename from Sources/XcodeGenKit/Scheme.swift rename to Sources/XcodeGenKit/Spec/Scheme.swift index 85afd97b..4f31acaa 100644 --- a/Sources/XcodeGenKit/Scheme.swift +++ b/Sources/XcodeGenKit/Spec/Scheme.swift @@ -10,7 +10,7 @@ import Foundation import xcodeproj import JSONUtilities -public struct SchemeSpec { +public struct Scheme { public var name: String public var build: Build @@ -25,7 +25,7 @@ public struct SchemeSpec { } } -extension SchemeSpec: NamedJSONObjectConvertible { +extension Scheme: NamedJSONObjectConvertible { public init(name: String, jsonDictionary: JSONDictionary) throws { self.name = name @@ -33,14 +33,14 @@ extension SchemeSpec: NamedJSONObjectConvertible { } } -extension SchemeSpec.Build: JSONObjectConvertible { +extension Scheme.Build: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { entries = try jsonDictionary.json(atKeyPath: "targets") } } -extension SchemeSpec.BuildEntry: NamedJSONObjectConvertible { +extension Scheme.BuildEntry: NamedJSONObjectConvertible { public init(name: String, jsonDictionary: JSONDictionary) throws { target = name diff --git a/Sources/XcodeGenKit/Spec/Spec.swift b/Sources/XcodeGenKit/Spec/Spec.swift new file mode 100644 index 00000000..497663d2 --- /dev/null +++ b/Sources/XcodeGenKit/Spec/Spec.swift @@ -0,0 +1,77 @@ +// +// Spec.swift +// XcodeGen +// +// Created by Yonas Kolb on 19/5/17. +// +// + +import Foundation +import xcodeproj +import JSONUtilities +import PathKit +import Yams + +extension Spec { + + public init(path: Path) throws { + var url = URL(string: path.string)! + if url.scheme == nil { + url = URL(fileURLWithPath: path.string) + } + + let data = try Data(contentsOf: url) + let string = String(data: data, encoding: .utf8)! + + try self.init(path: path, string: string) + } + + public init(path: Path, string: String) throws { + let yaml = try Yams.load(yaml: string) + let json = yaml as! JSONDictionary + + try self.init(path: path, jsonDictionary: json) + } + + public init(path: Path, jsonDictionary: JSONDictionary) throws { + self.path = path + settingGroups = try jsonDictionary.json(atKeyPath: "settingGroups") + configs = try jsonDictionary.json(atKeyPath: "configs") + targets = try jsonDictionary.json(atKeyPath: "targets") + schemes = try jsonDictionary.json(atKeyPath: "schemes") + } +} + + +public struct Spec { + + public var settingGroups: [BuildSettingGroup] + public var configs: [Config] + public var targets: [Target] + public var schemes: [Scheme] + public var path: Path +} + + +public struct Dependancy { + + public var path: String + public var type: DependancyType + + public enum DependancyType: String { + case target + case system + } +} + +extension Dependancy: JSONObjectConvertible { + + public init(jsonDictionary: JSONDictionary) throws { + path = try jsonDictionary.json(atKeyPath: "path") + type = try jsonDictionary.json(atKeyPath: "type") + } +} + + + + diff --git a/Sources/XcodeGenKit/SpecError.swift b/Sources/XcodeGenKit/Spec/SpecError.swift similarity index 100% rename from Sources/XcodeGenKit/SpecError.swift rename to Sources/XcodeGenKit/Spec/SpecError.swift diff --git a/Sources/XcodeGenKit/Spec/Target.swift b/Sources/XcodeGenKit/Spec/Target.swift new file mode 100644 index 00000000..aaa2e6c5 --- /dev/null +++ b/Sources/XcodeGenKit/Spec/Target.swift @@ -0,0 +1,44 @@ +// +// Target.swift +// XcodeGen +// +// Created by Yonas Kolb on 20/7/17. +// +// + +import Foundation +import xcodeproj +import JSONUtilities + +public struct Target { + public var name: String + public var type: PBXProductType + public var localizedSource: String? + public var sources: [String] + public var sourceExludes: [String] + public var dependancies: [Dependancy] + public var prebuildScripts: [String] + public var postbuildScripts: [String] +} + +extension Target: NamedJSONObjectConvertible { + + public init(name: String, jsonDictionary: JSONDictionary) throws { + self.name = name + let typeString: String = try jsonDictionary.json(atKeyPath: "type") + if let type = PBXProductType(rawValue: typeString) { + self.type = type + } else { + switch typeString { + case "application": type = .application + case "framework": type = .framework + default: throw SpecError.unknownTargetType(typeString) + } + } + sources = jsonDictionary.json(atKeyPath: "sources") ?? [] + sourceExludes = jsonDictionary.json(atKeyPath: "sourceExludes") ?? [] + dependancies = jsonDictionary.json(atKeyPath: "dependancies") ?? [] + prebuildScripts = jsonDictionary.json(atKeyPath: "prebuildScripts") ?? [] + postbuildScripts = jsonDictionary.json(atKeyPath: "postbuildScripts") ?? [] + } +} diff --git a/TestProject/spec.xcodeproj/project.pbxproj b/TestProject/spec.xcodeproj/project.pbxproj new file mode 100644 index 00000000..a545e7c2 --- /dev/null +++ b/TestProject/spec.xcodeproj/project.pbxproj @@ -0,0 +1,156 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = ( + ); + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6F4922F45568161A8CDF4AD2299F6D23 /* Main.storyboard in Sources */ = {isa = PBXBuildFile; fileRef = D3D9446802A44259755D38E6D163E820 /* Main.storyboard */; }; + 70EFDF2EC9B086079795C442636B55FB /* LaunchScreen.storyboard in Sources */ = {isa = PBXBuildFile; fileRef = 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */; }; + 9BF31C7FF062936A96D3C8BD1F8F2FF3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */; }; + AAB3238922BCC25A6F606EB525FFDC56 /* Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = A87FF679A2F3E71D9181A67B7542122C /* Info.plist */; }; + C51CE410C124A10E0DB5E4B97FC2AF39 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */; }; + C74D97B01EAE257E44AA9D5BADE97BAF /* Contents.json in Sources */ = {isa = PBXBuildFile; fileRef = 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */ = {isa = PBXFileReference; path = Contents.json; sourceTree = ""; }; + 3C59DC048E8850243BE8079A5C74D079 /* Axis iOS */ = {isa = PBXFileReference; includeInIndex = 0; path = "Axis iOS"; sourceTree = BUILT_PRODUCTS_DIR; }; + 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; path = LaunchScreen.storyboard; sourceTree = ""; }; + A87FF679A2F3E71D9181A67B7542122C /* Info.plist */ = {isa = PBXFileReference; path = Info.plist; sourceTree = ""; }; + D3D9446802A44259755D38E6D163E820 /* Main.storyboard */ = {isa = PBXFileReference; path = Main.storyboard; sourceTree = ""; }; + E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */ = {isa = PBXFileReference; path = ViewController.swift; sourceTree = ""; }; + ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */ = {isa = PBXFileReference; path = AppDelegate.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 37693CFC748049E45D87B8C7D8B9AACD = { + isa = PBXGroup; + children = ( + C20AD4D76FE97759AA27A0C99BFF6710 /* TestProject */, + ); + sourceTree = ""; + }; + 6512BD43D9CAA6E02C990B0A82652DCA /* Base.lproj */ = { + isa = PBXGroup; + children = ( + 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */, + D3D9446802A44259755D38E6D163E820 /* Main.storyboard */, + ); + name = Base.lproj; + path = Base.lproj; + sourceTree = ""; + }; + 8F14E45FCEEA167A5A36DEDD4BEA2543 /* AppIcon.appiconset */ = { + isa = PBXGroup; + children = ( + 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */, + ); + name = AppIcon.appiconset; + path = AppIcon.appiconset; + sourceTree = ""; + }; + C20AD4D76FE97759AA27A0C99BFF6710 /* TestProject */ = { + isa = PBXGroup; + children = ( + E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */, + ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */, + C9F0F895FB98AB9159F51FD0297E236D /* Assets.xcassets */, + 6512BD43D9CAA6E02C990B0A82652DCA /* Base.lproj */, + A87FF679A2F3E71D9181A67B7542122C /* Info.plist */, + ); + name = TestProject; + path = TestProject; + sourceTree = ""; + }; + C9F0F895FB98AB9159F51FD0297E236D /* Assets.xcassets */ = { + isa = PBXGroup; + children = ( + 8F14E45FCEEA167A5A36DEDD4BEA2543 /* AppIcon.appiconset */, + ); + name = Assets.xcassets; + path = Assets.xcassets; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B6D767D2F8ED5D21A44B0E5886680CB9 /* Axis iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 98F13708210194C475687BE6106A3B84 /* Build configuration list for PBXNativeTarget "Axis iOS" */; + buildPhases = ( + 1F0E3DAD99908345F7439F8FFABDFFC4 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Axis iOS"; + productReference = 3C59DC048E8850243BE8079A5C74D079; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1FF1DE774005F8DA13F42943881C655F /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = C81E728D9D4C2F636F067F89CC14862C /* Build configuration list for PBXProject "Generated_Project" */; + compatibilityVersion = "Xcode 3.2"; + knownRegions = ( + ); + mainGroup = 37693CFC748049E45D87B8C7D8B9AACD; + targets = ( + B6D767D2F8ED5D21A44B0E5886680CB9 /* Axis iOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 1F0E3DAD99908345F7439F8FFABDFFC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C51CE410C124A10E0DB5E4B97FC2AF39 /* AppDelegate.swift in Sources */, + 6F4922F45568161A8CDF4AD2299F6D23 /* Main.storyboard in Sources */, + 9BF31C7FF062936A96D3C8BD1F8F2FF3 /* ViewController.swift in Sources */, + AAB3238922BCC25A6F606EB525FFDC56 /* Info.plist in Sources */, + 70EFDF2EC9B086079795C442636B55FB /* LaunchScreen.storyboard in Sources */, + C74D97B01EAE257E44AA9D5BADE97BAF /* Contents.json in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C4CA4238A0B923820DCC509A6F75849B /* Staging Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = "Staging Test"; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 98F13708210194C475687BE6106A3B84 /* Build configuration list for PBXNativeTarget "Axis iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + C81E728D9D4C2F636F067F89CC14862C /* Build configuration list for PBXProject "Generated_Project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C4CA4238A0B923820DCC509A6F75849B /* Staging Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Staging Test"; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1FF1DE774005F8DA13F42943881C655F /* Project object */; +} diff --git a/TestProject/spec.xcodeproj/xcshareddata/xcschemes/iOS Test b/TestProject/spec.xcodeproj/xcshareddata/xcschemes/iOS Test new file mode 100644 index 00000000..1011bc8e --- /dev/null +++ b/TestProject/spec.xcodeproj/xcshareddata/xcschemes/iOS Test @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestProject/spec.yml.xcodeproj/project.pbxproj b/TestProject/spec.yml.xcodeproj/project.pbxproj new file mode 100644 index 00000000..a545e7c2 --- /dev/null +++ b/TestProject/spec.yml.xcodeproj/project.pbxproj @@ -0,0 +1,156 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = ( + ); + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6F4922F45568161A8CDF4AD2299F6D23 /* Main.storyboard in Sources */ = {isa = PBXBuildFile; fileRef = D3D9446802A44259755D38E6D163E820 /* Main.storyboard */; }; + 70EFDF2EC9B086079795C442636B55FB /* LaunchScreen.storyboard in Sources */ = {isa = PBXBuildFile; fileRef = 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */; }; + 9BF31C7FF062936A96D3C8BD1F8F2FF3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */; }; + AAB3238922BCC25A6F606EB525FFDC56 /* Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = A87FF679A2F3E71D9181A67B7542122C /* Info.plist */; }; + C51CE410C124A10E0DB5E4B97FC2AF39 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */; }; + C74D97B01EAE257E44AA9D5BADE97BAF /* Contents.json in Sources */ = {isa = PBXBuildFile; fileRef = 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */ = {isa = PBXFileReference; path = Contents.json; sourceTree = ""; }; + 3C59DC048E8850243BE8079A5C74D079 /* Axis iOS */ = {isa = PBXFileReference; includeInIndex = 0; path = "Axis iOS"; sourceTree = BUILT_PRODUCTS_DIR; }; + 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; path = LaunchScreen.storyboard; sourceTree = ""; }; + A87FF679A2F3E71D9181A67B7542122C /* Info.plist */ = {isa = PBXFileReference; path = Info.plist; sourceTree = ""; }; + D3D9446802A44259755D38E6D163E820 /* Main.storyboard */ = {isa = PBXFileReference; path = Main.storyboard; sourceTree = ""; }; + E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */ = {isa = PBXFileReference; path = ViewController.swift; sourceTree = ""; }; + ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */ = {isa = PBXFileReference; path = AppDelegate.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 37693CFC748049E45D87B8C7D8B9AACD = { + isa = PBXGroup; + children = ( + C20AD4D76FE97759AA27A0C99BFF6710 /* TestProject */, + ); + sourceTree = ""; + }; + 6512BD43D9CAA6E02C990B0A82652DCA /* Base.lproj */ = { + isa = PBXGroup; + children = ( + 45C48CCE2E2D7FBDEA1AFC51C7C6AD26 /* LaunchScreen.storyboard */, + D3D9446802A44259755D38E6D163E820 /* Main.storyboard */, + ); + name = Base.lproj; + path = Base.lproj; + sourceTree = ""; + }; + 8F14E45FCEEA167A5A36DEDD4BEA2543 /* AppIcon.appiconset */ = { + isa = PBXGroup; + children = ( + 1679091C5A880FAF6FB5E6087EB1B2DC /* Contents.json */, + ); + name = AppIcon.appiconset; + path = AppIcon.appiconset; + sourceTree = ""; + }; + C20AD4D76FE97759AA27A0C99BFF6710 /* TestProject */ = { + isa = PBXGroup; + children = ( + E4DA3B7FBBCE2345D7772B0674A318D5 /* ViewController.swift */, + ECCBC87E4B5CE2FE28308FD9F2A7BAF3 /* AppDelegate.swift */, + C9F0F895FB98AB9159F51FD0297E236D /* Assets.xcassets */, + 6512BD43D9CAA6E02C990B0A82652DCA /* Base.lproj */, + A87FF679A2F3E71D9181A67B7542122C /* Info.plist */, + ); + name = TestProject; + path = TestProject; + sourceTree = ""; + }; + C9F0F895FB98AB9159F51FD0297E236D /* Assets.xcassets */ = { + isa = PBXGroup; + children = ( + 8F14E45FCEEA167A5A36DEDD4BEA2543 /* AppIcon.appiconset */, + ); + name = Assets.xcassets; + path = Assets.xcassets; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B6D767D2F8ED5D21A44B0E5886680CB9 /* Axis iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 98F13708210194C475687BE6106A3B84 /* Build configuration list for PBXNativeTarget "Axis iOS" */; + buildPhases = ( + 1F0E3DAD99908345F7439F8FFABDFFC4 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Axis iOS"; + productReference = 3C59DC048E8850243BE8079A5C74D079; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1FF1DE774005F8DA13F42943881C655F /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = C81E728D9D4C2F636F067F89CC14862C /* Build configuration list for PBXProject "Generated_Project" */; + compatibilityVersion = "Xcode 3.2"; + knownRegions = ( + ); + mainGroup = 37693CFC748049E45D87B8C7D8B9AACD; + targets = ( + B6D767D2F8ED5D21A44B0E5886680CB9 /* Axis iOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 1F0E3DAD99908345F7439F8FFABDFFC4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C51CE410C124A10E0DB5E4B97FC2AF39 /* AppDelegate.swift in Sources */, + 6F4922F45568161A8CDF4AD2299F6D23 /* Main.storyboard in Sources */, + 9BF31C7FF062936A96D3C8BD1F8F2FF3 /* ViewController.swift in Sources */, + AAB3238922BCC25A6F606EB525FFDC56 /* Info.plist in Sources */, + 70EFDF2EC9B086079795C442636B55FB /* LaunchScreen.storyboard in Sources */, + C74D97B01EAE257E44AA9D5BADE97BAF /* Contents.json in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C4CA4238A0B923820DCC509A6F75849B /* Staging Test */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = "Staging Test"; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 98F13708210194C475687BE6106A3B84 /* Build configuration list for PBXNativeTarget "Axis iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = ""; + }; + C81E728D9D4C2F636F067F89CC14862C /* Build configuration list for PBXProject "Generated_Project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C4CA4238A0B923820DCC509A6F75849B /* Staging Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Staging Test"; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1FF1DE774005F8DA13F42943881C655F /* Project object */; +} diff --git a/TestProject/spec.yml.xcodeproj/xcshareddata/xcschemes/iOS Test b/TestProject/spec.yml.xcodeproj/xcshareddata/xcschemes/iOS Test new file mode 100644 index 00000000..1011bc8e --- /dev/null +++ b/TestProject/spec.yml.xcodeproj/xcshareddata/xcschemes/iOS Test @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file