From 9a41bb9ab62eccb3c767a5cf7899b78e2b2400ac Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 20:32:23 +0100 Subject: [PATCH 01/23] minor refactoring of spec validation --- Sources/ProjectSpec/Config.swift | 2 + Sources/ProjectSpec/ProjectSpec.swift | 4 +- .../ProjectSpecValidation.swift} | 57 +++++++++---------- Sources/ProjectSpec/Target.swift | 4 +- Sources/XcodeGenKit/ProjectGenerator.swift | 2 +- 5 files changed, 34 insertions(+), 35 deletions(-) rename Sources/{XcodeGenKit/SpecValidation.swift => ProjectSpec/ProjectSpecValidation.swift} (85%) diff --git a/Sources/ProjectSpec/Config.swift b/Sources/ProjectSpec/Config.swift index 2b4edf9b..474894f4 100644 --- a/Sources/ProjectSpec/Config.swift +++ b/Sources/ProjectSpec/Config.swift @@ -22,6 +22,8 @@ public struct Config: Equatable { public static func ==(lhs: Config, rhs: Config) -> Bool { return lhs.name == rhs.name && lhs.type == rhs.type } + + public static var defaultConfigs: [Config] = [Config(name: "Debug", type: .debug), Config(name: "Release", type: .release)] } public enum ConfigType: String { diff --git a/Sources/ProjectSpec/ProjectSpec.swift b/Sources/ProjectSpec/ProjectSpec.swift index 7789f9fe..5fb3e319 100644 --- a/Sources/ProjectSpec/ProjectSpec.swift +++ b/Sources/ProjectSpec/ProjectSpec.swift @@ -57,7 +57,7 @@ public struct ProjectSpec { } } - public init(basePath: Path, name: String, configs: [Config] = [], targets: [Target] = [], settings: Settings = .empty, settingGroups: [String: Settings] = [:], schemes: [Scheme] = [], options: Options = Options(), fileGroups: [String] = [], configFiles: [String: String] = [:], attributes: [String: Any] = [:]) { + public init(basePath: Path, name: String, configs: [Config] = Config.defaultConfigs, targets: [Target] = [], settings: Settings = .empty, settingGroups: [String: Settings] = [:], schemes: [Scheme] = [], options: Options = Options(), fileGroups: [String] = [], configFiles: [String: String] = [:], attributes: [String: Any] = [:]) { self.basePath = basePath self.name = name self.targets = targets @@ -135,7 +135,7 @@ extension ProjectSpec { settings = jsonDictionary.json(atKeyPath: "settings") ?? .empty settingGroups = jsonDictionary.json(atKeyPath: "settingGroups") ?? jsonDictionary.json(atKeyPath: "settingPresets") ?? [:] let configs: [String: String] = jsonDictionary.json(atKeyPath: "configs") ?? [:] - self.configs = configs.map { Config(name: $0, type: ConfigType(rawValue: $1)) }.sorted { $0.name < $1.name } + self.configs = configs.isEmpty ? Config.defaultConfigs : configs.map { Config(name: $0, type: ConfigType(rawValue: $1)) }.sorted { $0.name < $1.name } targets = try jsonDictionary.json(atKeyPath: "targets").sorted { $0.name < $1.name } schemes = try jsonDictionary.json(atKeyPath: "schemes") fileGroups = jsonDictionary.json(atKeyPath: "fileGroups") ?? [] diff --git a/Sources/XcodeGenKit/SpecValidation.swift b/Sources/ProjectSpec/ProjectSpecValidation.swift similarity index 85% rename from Sources/XcodeGenKit/SpecValidation.swift rename to Sources/ProjectSpec/ProjectSpecValidation.swift index d2841cdc..84cbd726 100644 --- a/Sources/XcodeGenKit/SpecValidation.swift +++ b/Sources/ProjectSpec/ProjectSpecValidation.swift @@ -6,21 +6,16 @@ // import Foundation -import ProjectSpec import PathKit extension ProjectSpec { - public mutating func validate() throws { + public func validate() throws { - if configs.isEmpty { - configs = [Config(name: "Debug", type: .debug), Config(name: "Release", type: .release)] - } + var errors: [SpecValidationError.ValidationError] = [] - var errors: [SpecValidationError.Error] = [] - - func validateSettings(_ settings: Settings) -> [SpecValidationError.Error] { - var errors: [SpecValidationError.Error] = [] + func validateSettings(_ settings: Settings) -> [SpecValidationError.ValidationError] { + var errors: [SpecValidationError.ValidationError] = [] for group in settings.groups { if let settings = settingGroups[group] { errors += validateSettings(settings) @@ -30,12 +25,14 @@ extension ProjectSpec { } for config in settings.configSettings.keys { if !configs.contains(where: { $0.name.lowercased().contains(config.lowercased())}) { - errors.append(.invalidConfigReference(config)) + errors.append(.invalidBuildSettingConfig(config)) } } return errors } + errors += validateSettings(settings) + for fileGroup in fileGroups { if !(basePath + fileGroup).exists { errors.append(.invalidFileGroup(fileGroup)) @@ -46,6 +43,9 @@ extension ProjectSpec { if !(basePath + configFile).exists { errors.append(.invalidConfigFile(configFile: configFile, config: config)) } + if getConfig(config) == nil { + errors.append(.invalidConfigFileConfig(config)) + } } for settings in settingGroups.values { @@ -61,13 +61,10 @@ extension ProjectSpec { for (config, configFile) in target.configFiles { if !(basePath + configFile).exists { - errors.append(.invalidTargetConfigFile(configFile: configFile, config: config, target: target.name)) + errors.append(.invalidTargetConfigFile(target: target.name, configFile: configFile, config: config)) } - } - - for config in target.settings.configSettings.keys { if getConfig(config) == nil { - errors.append(.invalidBuildSettingConfig(config)) + errors.append(.invalidConfigFileConfig(config)) } } @@ -110,7 +107,7 @@ extension ProjectSpec { if case let .path(pathString) = script.script { let scriptPath = basePath + pathString if !scriptPath.exists { - errors.append(.invalidBuildScriptPath(target: target.name, path: pathString)) + errors.append(.invalidBuildScriptPath(target: target.name, name: script.name, path: pathString)) } } } @@ -149,39 +146,39 @@ extension ProjectSpec { public struct SpecValidationError: Error, CustomStringConvertible { - public var errors: [Error] + public var errors: [ValidationError] - public enum Error: CustomStringConvertible { + public enum ValidationError: Error, CustomStringConvertible { case invalidTargetDependency(target: String, dependency: String) + case missingTargetSource(target: String, source: String) + case invalidTargetConfigFile(target: String, configFile: String, config: String) + case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType) + case invalidTargetSchemeTest(target: String, testTarget: String) case invalidSchemeTarget(scheme: String, target: String) case invalidSchemeConfig(scheme: String, config: String) case invalidConfigFile(configFile: String, config: String) - case invalidTargetConfigFile(configFile: String, config: String, target: String) case invalidBuildSettingConfig(String) case invalidSettingsGroup(String) - case missingTargetSource(target: String, source: String) - case invalidBuildScriptPath(target: String, path: String) - case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType) - case invalidTargetSchemeTest(target: String, testTarget: String) + case invalidBuildScriptPath(target: String, name: String?, path: String) case invalidFileGroup(String) - case invalidConfigReference(String) + case invalidConfigFileConfig(String) case missingConfigTypeForGeneratedTargetScheme(target: String, configType: ConfigType) public var description: String { switch self { case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)" - case let .invalidTargetConfigFile(configFile, config, target): return "Target \(target.quoted) has invalid config file \(configFile.quoted) for config \(config.quoted)" + case let .invalidTargetConfigFile(target, configFile, config): return "Target \(target.quoted) has invalid config file \(configFile.quoted) for config \(config.quoted)" + case let .missingTargetSource(target, source): return "Target \(target.quoted) has a missing source directory \(source.quoted)" + case let .invalidTargetSchemeConfigVariant(target, configVariant, configType): return "Target \(target.quoted) has an invalid scheme config variant which requires a config that has a \(configType.rawValue.quoted) type and contains the name \(configVariant.quoted)" + case let .invalidTargetSchemeTest(target, test): return "Target \(target.quoted) scheme has invalid test \(test.quoted)" case let .invalidConfigFile(configFile, config): return "Invalid config file \(configFile.quoted) for config \(config.quoted)" case let .invalidSchemeTarget(scheme, target): return "Scheme \(scheme.quoted) has invalid build target \(target.quoted)" case let .invalidSchemeConfig(scheme, config): return "Scheme \(scheme.quoted) has invalid build configuration \(config.quoted)" case let .invalidBuildSettingConfig(config): return "Build setting has invalid build configuration \(config.quoted)" - case let .missingTargetSource(target, source): return "Target \(target.quoted) has a missing source directory \(source.quoted)" case let .invalidSettingsGroup(group): return "Invalid settings group \(group.quoted)" - case let .invalidBuildScriptPath(target, path): return "Target \(target.quoted) has a script path that doesn't exist \(path.quoted)" - case let .invalidTargetSchemeConfigVariant(target, configVariant, configType): return "Target \(target.quoted) has an invalid scheme config variant which requires a config that has a \(configType.rawValue.quoted) type and contains the name \(configVariant.quoted)" - case let .invalidTargetSchemeTest(target, test): return "Target \(target.quoted) scheme has invalid test \(test.quoted)" + case let .invalidBuildScriptPath(target, name, path): return "Target \(target.quoted) has a script \(name != nil ? "\(name!.quoted) which has a " : "")path that doesn't exist \(path.quoted)" case let .invalidFileGroup(group): return "Invalid file group \(group.quoted)" - case let .invalidConfigReference(config): return "Invalid config reference \(config.quoted)" + case let .invalidConfigFileConfig(config): return "Config file has invalid config \(config.quoted)" case let .missingConfigTypeForGeneratedTargetScheme(target, configType): return "Target \(target.quoted) is missing a config of type \(configType.rawValue) to generate its scheme" } } diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index d0277b98..d5667faa 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -135,8 +135,8 @@ extension Target: Equatable { } public struct TargetScheme { - public let testTargets: [String] - public let configVariants: [String] + public var testTargets: [String] + public var configVariants: [String] public init(testTargets: [String] = [], configVariants: [String] = []) { self.testTargets = testTargets diff --git a/Sources/XcodeGenKit/ProjectGenerator.swift b/Sources/XcodeGenKit/ProjectGenerator.swift index 1670e7a8..bf647892 100644 --- a/Sources/XcodeGenKit/ProjectGenerator.swift +++ b/Sources/XcodeGenKit/ProjectGenerator.swift @@ -15,7 +15,7 @@ import ProjectSpec public class ProjectGenerator { - var spec: ProjectSpec + let spec: ProjectSpec let currentXcodeVersion = "0900" public init(spec: ProjectSpec) { From 4fe9a061481725c1244aa3eafab9177cc8383101 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 20:32:31 +0100 Subject: [PATCH 02/23] add spec validation tests --- Tests/XcodeGenKitTests/ProjectSpecTests.swift | 81 +++++++++++++++++++ Tests/XcodeGenKitTests/SpecLoadingTests.swift | 2 +- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift index ae5ec8ad..dc16db9e 100644 --- a/Tests/XcodeGenKitTests/ProjectSpecTests.swift +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -24,5 +24,86 @@ func projectSpecTests() { try expect(dynamicLibrary.type.isLibrary).to.beTrue() } } + + func expectValidationError(_ spec: ProjectSpec, _ expectedError: SpecValidationError.ValidationError) throws { + do { + try spec.validate() + } catch let error as SpecValidationError { + if !error.errors.contains( where: { $0.description == expectedError.description }) { + throw failure("Supposed to fail with:\n\(expectedError)\nbut got:\n\(error.errors.map { $0.description }.joined(separator: "\n"))") + } + return + } catch { + throw failure("Supposed to fail with \"\(expectedError)\"") + } + throw failure("Supposed to fail with \"\(expectedError)\"") + } + + $0.describe("Validation") { + + let baseSpec = ProjectSpec(basePath: "", name: "", configs: [Config(name: "invalid")]) + let invalidSettings = Settings(configSettings: ["invalidConfig": [:]], + groups: ["invalidSettingGroup"]) + $0.it("fails with invalid project") { + var spec = baseSpec + spec.settings = invalidSettings + spec.configFiles = ["invalidConfig": "invalidConfigFile"] + spec.fileGroups = ["invalidFileGroup"] + spec.settingGroups = ["settingGroup1": Settings(configSettings: ["invalidSettingGroupConfig": [:]], + groups: ["invalidSettingGroupSettingGroup"])] + + try expectValidationError(spec, .invalidConfigFileConfig("invalidConfig")) + try expectValidationError(spec, .invalidBuildSettingConfig("invalidConfig")) + try expectValidationError(spec, .invalidConfigFile(configFile: "invalidConfigFile", config: "invalidConfig")) + try expectValidationError(spec, .invalidSettingsGroup("invalidSettingGroup")) + try expectValidationError(spec, .invalidFileGroup("invalidFileGroup")) + try expectValidationError(spec, .invalidSettingsGroup("invalidSettingGroupSettingGroup")) + try expectValidationError(spec, .invalidBuildSettingConfig("invalidSettingGroupConfig")) + } + + $0.it("fails with invalid target") { + var spec = baseSpec + spec.targets = [Target(name: "target1", + type: .application, + platform: .iOS, + settings: invalidSettings, + configFiles: ["invalidConfig": "invalidConfigFile"], + sources: ["invalidSource"], + dependencies: [Dependency(type: .target, reference: "invalidDependency")], + prebuildScripts: [BuildScript(script: .path("invalidPrebuildScript"), name: "prebuildScript1", inputFiles: + [], outputFiles: [])], + postbuildScripts: [BuildScript(script: .path("invalidPostbuildScript"), inputFiles: + [], outputFiles: [])], + scheme: TargetScheme(testTargets: ["invalidTarget"]) + )] + + try expectValidationError(spec, .invalidTargetDependency(target: "target1", dependency: "invalidDependency")) + try expectValidationError(spec, .invalidTargetConfigFile(target: "target1", configFile: "invalidConfigFile", config: "invalidConfig")) + try expectValidationError(spec, .invalidTargetSchemeTest(target: "target1", testTarget: "invalidTarget")) + try expectValidationError(spec, .missingTargetSource(target: "target1", source: "invalidSource")) + try expectValidationError(spec, .invalidBuildSettingConfig("invalidConfig")) + try expectValidationError(spec, .invalidSettingsGroup("invalidSettingGroup")) + try expectValidationError(spec, .invalidBuildScriptPath(target:"target1", name: "prebuildScript1", path: "invalidPrebuildScript")) + try expectValidationError(spec, .invalidBuildScriptPath(target:"target1", name: nil, path: "invalidPostbuildScript")) + + try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target:"target1", configType: .debug)) + try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target:"target1", configType: .release)) + + spec.targets[0].scheme?.configVariants = ["invalidVariant"] + try expectValidationError(spec, .invalidTargetSchemeConfigVariant(target: "target1", configVariant: "invalidVariant", configType: .debug)) + } + + $0.it("fails with invalid scheme") { + var spec = baseSpec + spec.schemes = [Scheme(name: "scheme1", + targets: [Scheme.BuildTarget(target: "invalidTarget")], + debugConfig: "debugInvalid", + releaseConfig: "releaseInvalid")] + + try expectValidationError(spec, .invalidSchemeTarget(scheme: "scheme1", target: "invalidTarget")) + try expectValidationError(spec, .invalidSchemeConfig(scheme: "scheme1", config: "debugInvalid")) + try expectValidationError(spec, .invalidSchemeConfig(scheme: "scheme1", config: "releaseInvalid")) + } + } } } diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index 60279410..f2827e26 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -48,7 +48,7 @@ func specLoadingTests() { } } - describe("Project Spec") { + describe("Project Spec Parser") { $0.it("fails with incorrect platform") { var target = validTarget From f8b4b5792e71a2235882657e68f0c36771efce70 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 22:15:02 +0100 Subject: [PATCH 03/23] move and rename files --- Sources/ProjectSpec/Dependency.swift | 82 +++++++++++++++++++ Sources/ProjectSpec/Settings.swift | 25 +++++- .../SpecLoader.swift | 9 +- ...SpecError.swift => SpecParsingError.swift} | 2 +- ...cValidation.swift => SpecValidation.swift} | 53 +----------- Sources/ProjectSpec/SpecValidationError.swift | 59 +++++++++++++ Sources/ProjectSpec/Target.swift | 76 +---------------- ...xtensions.swift => XCProjExtensions.swift} | 24 ------ .../{XcodeGenKit => ProjectSpec}/Yaml.swift | 2 +- Sources/XcodeGen/main.swift | 2 +- Tests/XcodeGenKitTests/FixtureTests.swift | 2 +- .../ProjectGeneratorTests.swift | 2 +- Tests/XcodeGenKitTests/ProjectSpecTests.swift | 2 +- Tests/XcodeGenKitTests/SpecLoadingTests.swift | 8 +- 14 files changed, 182 insertions(+), 166 deletions(-) create mode 100644 Sources/ProjectSpec/Dependency.swift rename Sources/{XcodeGenKit => ProjectSpec}/SpecLoader.swift (87%) rename Sources/ProjectSpec/{ProjectSpecError.swift => SpecParsingError.swift} (90%) rename Sources/ProjectSpec/{ProjectSpecValidation.swift => SpecValidation.swift} (61%) create mode 100644 Sources/ProjectSpec/SpecValidationError.swift rename Sources/ProjectSpec/{ProjectExtensions.swift => XCProjExtensions.swift} (63%) rename Sources/{XcodeGenKit => ProjectSpec}/Yaml.swift (93%) diff --git a/Sources/ProjectSpec/Dependency.swift b/Sources/ProjectSpec/Dependency.swift new file mode 100644 index 00000000..a22eb302 --- /dev/null +++ b/Sources/ProjectSpec/Dependency.swift @@ -0,0 +1,82 @@ +// +// Dependency.swift +// ProjectSpec +// +// Created by Yonas Kolb on 29/10/17. +// + +import Foundation +import xcproj +import JSONUtilities + +public struct Dependency: Equatable { + + public var type: DependencyType + public var reference: String + public var embed: Bool? + public var codeSign: Bool = true + public var removeHeaders: Bool = true + public var link: Bool = true + + public init(type: DependencyType, reference: String, embed: Bool? = nil) { + self.type = type + self.reference = reference + self.embed = embed + } + + public enum DependencyType { + case target + case framework + case carthage + } + + public static func ==(lhs: Dependency, rhs: Dependency) -> Bool { + return lhs.reference == rhs.reference && + lhs.type == rhs.type && + lhs.codeSign == rhs.codeSign && + lhs.removeHeaders == rhs.removeHeaders && + lhs.embed == rhs.embed && + lhs.link == rhs.link + } + + public var buildSettings: [String: Any] { + var attributes: [String] = [] + if codeSign { + attributes.append("CodeSignOnCopy") + } + if removeHeaders { + attributes.append("RemoveHeadersOnCopy") + } + return ["ATTRIBUTES": attributes] + } +} + +extension Dependency: JSONObjectConvertible { + + public init(jsonDictionary: JSONDictionary) throws { + if let target: String = jsonDictionary.json(atKeyPath: "target") { + type = .target + reference = target + } else if let framework: String = jsonDictionary.json(atKeyPath: "framework") { + type = .framework + reference = framework + } else if let carthage: String = jsonDictionary.json(atKeyPath: "carthage") { + type = .carthage + reference = carthage + } else { + throw SpecParsingError.invalidDependency(jsonDictionary) + } + + embed = jsonDictionary.json(atKeyPath: "embed") + + if let bool: Bool = jsonDictionary.json(atKeyPath: "link") { + link = bool + } + if let bool: Bool = jsonDictionary.json(atKeyPath: "codeSign") { + codeSign = bool + } + if let bool: Bool = jsonDictionary.json(atKeyPath: "removeHeaders") { + removeHeaders = bool + } + } +} diff --git a/Sources/ProjectSpec/Settings.swift b/Sources/ProjectSpec/Settings.swift index 3682a2f8..cf6cbb8a 100644 --- a/Sources/ProjectSpec/Settings.swift +++ b/Sources/ProjectSpec/Settings.swift @@ -10,7 +10,6 @@ import Foundation import JSONUtilities import xcproj import PathKit -import Yams public struct Settings: Equatable, JSONObjectConvertible, CustomStringConvertible { @@ -90,3 +89,27 @@ extension Settings: ExpressibleByDictionaryLiteral { self.init(dictionary: dictionary) } } + +extension Dictionary where Key == String, Value: Any { + + public func merged(_ dictionary: [Key: Value]) -> [Key: Value] { + var mergedDictionary = self + mergedDictionary.merge(dictionary) + return mergedDictionary + } + + public mutating func merge(_ dictionary: [Key: Value]) { + for (key, value) in dictionary { + self[key] = value + } + } + + public func equals(_ dictionary: BuildSettings) -> Bool { + return NSDictionary(dictionary: self).isEqual(to: dictionary) + } +} + +public func +=(lhs: inout BuildSettings, rhs: BuildSettings?) { + guard let rhs = rhs else { return } + lhs.merge(rhs) +} diff --git a/Sources/XcodeGenKit/SpecLoader.swift b/Sources/ProjectSpec/SpecLoader.swift similarity index 87% rename from Sources/XcodeGenKit/SpecLoader.swift rename to Sources/ProjectSpec/SpecLoader.swift index 51f10c29..bda53a4a 100644 --- a/Sources/XcodeGenKit/SpecLoader.swift +++ b/Sources/ProjectSpec/SpecLoader.swift @@ -7,16 +7,15 @@ // import Foundation -import ProjectSpec import PathKit import Yams import JSONUtilities -public struct SpecLoader { +extension ProjectSpec { - public static func loadSpec(path: Path) throws -> ProjectSpec { - let dictionary = try loadDictionary(path: path) - return try ProjectSpec(basePath: path.parent(), jsonDictionary: dictionary) + public init(path: Path) throws { + let dictionary = try ProjectSpec.loadDictionary(path: path) + try self.init(basePath: path.parent(), jsonDictionary: dictionary) } private static func loadDictionary(path: Path) throws -> JSONDictionary { diff --git a/Sources/ProjectSpec/ProjectSpecError.swift b/Sources/ProjectSpec/SpecParsingError.swift similarity index 90% rename from Sources/ProjectSpec/ProjectSpecError.swift rename to Sources/ProjectSpec/SpecParsingError.swift index 400c1921..49a82d1e 100644 --- a/Sources/ProjectSpec/ProjectSpecError.swift +++ b/Sources/ProjectSpec/SpecParsingError.swift @@ -8,7 +8,7 @@ import Foundation -public enum ProjectSpecError: Error, CustomStringConvertible { +public enum SpecParsingError: Error, CustomStringConvertible { case unknownTargetType(String) case unknownTargetPlatform(String) case invalidDependency([String: Any]) diff --git a/Sources/ProjectSpec/ProjectSpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift similarity index 61% rename from Sources/ProjectSpec/ProjectSpecValidation.swift rename to Sources/ProjectSpec/SpecValidation.swift index 84cbd726..4b309fe8 100644 --- a/Sources/ProjectSpec/ProjectSpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -71,7 +71,7 @@ extension ProjectSpec { for source in target.sources { let sourcePath = basePath + source if !sourcePath.exists { - errors.append(.missingTargetSource(target: target.name, source: sourcePath.string)) + errors.append(.invalidTargetSource(target: target.name, source: sourcePath.string)) } } @@ -143,54 +143,3 @@ extension ProjectSpec { } } } - -public struct SpecValidationError: Error, CustomStringConvertible { - - public var errors: [ValidationError] - - public enum ValidationError: Error, CustomStringConvertible { - case invalidTargetDependency(target: String, dependency: String) - case missingTargetSource(target: String, source: String) - case invalidTargetConfigFile(target: String, configFile: String, config: String) - case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType) - case invalidTargetSchemeTest(target: String, testTarget: String) - case invalidSchemeTarget(scheme: String, target: String) - case invalidSchemeConfig(scheme: String, config: String) - case invalidConfigFile(configFile: String, config: String) - case invalidBuildSettingConfig(String) - case invalidSettingsGroup(String) - case invalidBuildScriptPath(target: String, name: String?, path: String) - case invalidFileGroup(String) - case invalidConfigFileConfig(String) - case missingConfigTypeForGeneratedTargetScheme(target: String, configType: ConfigType) - - public var description: String { - switch self { - case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)" - case let .invalidTargetConfigFile(target, configFile, config): return "Target \(target.quoted) has invalid config file \(configFile.quoted) for config \(config.quoted)" - case let .missingTargetSource(target, source): return "Target \(target.quoted) has a missing source directory \(source.quoted)" - case let .invalidTargetSchemeConfigVariant(target, configVariant, configType): return "Target \(target.quoted) has an invalid scheme config variant which requires a config that has a \(configType.rawValue.quoted) type and contains the name \(configVariant.quoted)" - case let .invalidTargetSchemeTest(target, test): return "Target \(target.quoted) scheme has invalid test \(test.quoted)" - case let .invalidConfigFile(configFile, config): return "Invalid config file \(configFile.quoted) for config \(config.quoted)" - case let .invalidSchemeTarget(scheme, target): return "Scheme \(scheme.quoted) has invalid build target \(target.quoted)" - case let .invalidSchemeConfig(scheme, config): return "Scheme \(scheme.quoted) has invalid build configuration \(config.quoted)" - case let .invalidBuildSettingConfig(config): return "Build setting has invalid build configuration \(config.quoted)" - case let .invalidSettingsGroup(group): return "Invalid settings group \(group.quoted)" - case let .invalidBuildScriptPath(target, name, path): return "Target \(target.quoted) has a script \(name != nil ? "\(name!.quoted) which has a " : "")path that doesn't exist \(path.quoted)" - case let .invalidFileGroup(group): return "Invalid file group \(group.quoted)" - case let .invalidConfigFileConfig(config): return "Config file has invalid config \(config.quoted)" - case let .missingConfigTypeForGeneratedTargetScheme(target, configType): return "Target \(target.quoted) is missing a config of type \(configType.rawValue) to generate its scheme" - } - } - } - - public var description: String { - let title: String - if errors.count == 1 { - title = "Spec validation error: " - } else { - title = "\(errors.count) Spec validations errors:\n\t- " - } - return "\(title)" + errors.map { $0.description }.joined(separator: "\n\t- ") - } -} diff --git a/Sources/ProjectSpec/SpecValidationError.swift b/Sources/ProjectSpec/SpecValidationError.swift new file mode 100644 index 00000000..9d064a85 --- /dev/null +++ b/Sources/ProjectSpec/SpecValidationError.swift @@ -0,0 +1,59 @@ +// +// SpecValidationError.swift +// ProjectSpec +// +// Created by Yonas Kolb on 29/10/17. +// + +import Foundation + +public struct SpecValidationError: Error, CustomStringConvertible { + + public var errors: [ValidationError] + + public enum ValidationError: Error, CustomStringConvertible { + case invalidTargetDependency(target: String, dependency: String) + case invalidTargetSource(target: String, source: String) + case invalidTargetConfigFile(target: String, configFile: String, config: String) + case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType) + case invalidTargetSchemeTest(target: String, testTarget: String) + case invalidSchemeTarget(scheme: String, target: String) + case invalidSchemeConfig(scheme: String, config: String) + case invalidConfigFile(configFile: String, config: String) + case invalidBuildSettingConfig(String) + case invalidSettingsGroup(String) + case invalidBuildScriptPath(target: String, name: String?, path: String) + case invalidFileGroup(String) + case invalidConfigFileConfig(String) + case missingConfigTypeForGeneratedTargetScheme(target: String, configType: ConfigType) + + public var description: String { + switch self { + case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)" + case let .invalidTargetConfigFile(target, configFile, config): return "Target \(target.quoted) has invalid config file \(configFile.quoted) for config \(config.quoted)" + case let .invalidTargetSource(target, source): return "Target \(target.quoted) has a missing source directory \(source.quoted)" + case let .invalidTargetSchemeConfigVariant(target, configVariant, configType): return "Target \(target.quoted) has an invalid scheme config variant which requires a config that has a \(configType.rawValue.quoted) type and contains the name \(configVariant.quoted)" + case let .invalidTargetSchemeTest(target, test): return "Target \(target.quoted) scheme has invalid test \(test.quoted)" + case let .invalidConfigFile(configFile, config): return "Invalid config file \(configFile.quoted) for config \(config.quoted)" + case let .invalidSchemeTarget(scheme, target): return "Scheme \(scheme.quoted) has invalid build target \(target.quoted)" + case let .invalidSchemeConfig(scheme, config): return "Scheme \(scheme.quoted) has invalid build configuration \(config.quoted)" + case let .invalidBuildSettingConfig(config): return "Build setting has invalid build configuration \(config.quoted)" + case let .invalidSettingsGroup(group): return "Invalid settings group \(group.quoted)" + case let .invalidBuildScriptPath(target, name, path): return "Target \(target.quoted) has a script \(name != nil ? "\(name!.quoted) which has a " : "")path that doesn't exist \(path.quoted)" + case let .invalidFileGroup(group): return "Invalid file group \(group.quoted)" + case let .invalidConfigFileConfig(config): return "Config file has invalid config \(config.quoted)" + case let .missingConfigTypeForGeneratedTargetScheme(target, configType): return "Target \(target.quoted) is missing a config of type \(configType.rawValue) to generate its scheme" + } + } + } + + public var description: String { + let title: String + if errors.count == 1 { + title = "Spec validation error: " + } else { + title = "\(errors.count) Spec validations errors:\n\t- " + } + return "\(title)" + errors.map { $0.description }.joined(separator: "\n\t- ") + } +} diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index d5667faa..12c5e4e4 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -168,13 +168,13 @@ extension Target: NamedJSONDictionaryConvertible { if let type = PBXProductType(string: typeString) { self.type = type } else { - throw ProjectSpecError.unknownTargetType(typeString) + throw SpecParsingError.unknownTargetType(typeString) } let platformString: String = try jsonDictionary.json(atKeyPath: "platform") if let platform = Platform(rawValue: platformString) { self.platform = platform } else { - throw ProjectSpecError.unknownTargetPlatform(platformString) + throw SpecParsingError.unknownTargetPlatform(platformString) } settings = jsonDictionary.json(atKeyPath: "settings") ?? .empty configFiles = jsonDictionary.json(atKeyPath: "configFiles") ?? [:] @@ -193,75 +193,3 @@ extension Target: NamedJSONDictionaryConvertible { scheme = jsonDictionary.json(atKeyPath: "scheme") } } - -public struct Dependency: Equatable { - - public var type: DependencyType - public var reference: String - public var embed: Bool? - public var codeSign: Bool = true - public var removeHeaders: Bool = true - public var link: Bool = true - - public init(type: DependencyType, reference: String, embed: Bool? = nil) { - self.type = type - self.reference = reference - self.embed = embed - } - - public enum DependencyType { - case target - case framework - case carthage - } - - public static func ==(lhs: Dependency, rhs: Dependency) -> Bool { - return lhs.reference == rhs.reference && - lhs.type == rhs.type && - lhs.codeSign == rhs.codeSign && - lhs.removeHeaders == rhs.removeHeaders && - lhs.embed == rhs.embed && - lhs.link == rhs.link - } - - public var buildSettings: [String: Any] { - var attributes: [String] = [] - if codeSign { - attributes.append("CodeSignOnCopy") - } - if removeHeaders { - attributes.append("RemoveHeadersOnCopy") - } - return ["ATTRIBUTES": attributes] - } -} - -extension Dependency: JSONObjectConvertible { - - public init(jsonDictionary: JSONDictionary) throws { - if let target: String = jsonDictionary.json(atKeyPath: "target") { - type = .target - reference = target - } else if let framework: String = jsonDictionary.json(atKeyPath: "framework") { - type = .framework - reference = framework - } else if let carthage: String = jsonDictionary.json(atKeyPath: "carthage") { - type = .carthage - reference = carthage - } else { - throw ProjectSpecError.invalidDependency(jsonDictionary) - } - - embed = jsonDictionary.json(atKeyPath: "embed") - - if let bool: Bool = jsonDictionary.json(atKeyPath: "link") { - link = bool - } - if let bool: Bool = jsonDictionary.json(atKeyPath: "codeSign") { - codeSign = bool - } - if let bool: Bool = jsonDictionary.json(atKeyPath: "removeHeaders") { - removeHeaders = bool - } - } -} diff --git a/Sources/ProjectSpec/ProjectExtensions.swift b/Sources/ProjectSpec/XCProjExtensions.swift similarity index 63% rename from Sources/ProjectSpec/ProjectExtensions.swift rename to Sources/ProjectSpec/XCProjExtensions.swift index 93317b58..272e7c3e 100644 --- a/Sources/ProjectSpec/ProjectExtensions.swift +++ b/Sources/ProjectSpec/XCProjExtensions.swift @@ -10,30 +10,6 @@ import Foundation import xcproj import PathKit -extension Dictionary where Key == String, Value: Any { - - public func merged(_ dictionary: [Key: Value]) -> [Key: Value] { - var mergedDictionary = self - mergedDictionary.merge(dictionary) - return mergedDictionary - } - - public mutating func merge(_ dictionary: [Key: Value]) { - for (key, value) in dictionary { - self[key] = value - } - } - - public func equals(_ dictionary: BuildSettings) -> Bool { - return NSDictionary(dictionary: self).isEqual(to: dictionary) - } -} - -public func +=(lhs: inout BuildSettings, rhs: BuildSettings?) { - guard let rhs = rhs else { return } - lhs.merge(rhs) -} - extension PBXProductType { init?(string: String) { diff --git a/Sources/XcodeGenKit/Yaml.swift b/Sources/ProjectSpec/Yaml.swift similarity index 93% rename from Sources/XcodeGenKit/Yaml.swift rename to Sources/ProjectSpec/Yaml.swift index 76fefd77..f96ff302 100644 --- a/Sources/XcodeGenKit/Yaml.swift +++ b/Sources/ProjectSpec/Yaml.swift @@ -9,7 +9,7 @@ import Foundation import Yams import PathKit -func loadYamlDictionary(path: Path) throws -> [String: Any] { +public func loadYamlDictionary(path: Path) throws -> [String: Any] { let string: String = try path.read() if string == "" { return [:] diff --git a/Sources/XcodeGen/main.swift b/Sources/XcodeGen/main.swift index 4a37ea08..97602d0d 100644 --- a/Sources/XcodeGen/main.swift +++ b/Sources/XcodeGen/main.swift @@ -29,7 +29,7 @@ func generate(spec: String, project: String) { let spec: ProjectSpec do { - spec = try SpecLoader.loadSpec(path: specPath) + spec = try ProjectSpec(path: specPath) print("📋 Loaded spec:\n \(spec.debugDescription.replacingOccurrences(of: "\n", with: "\n "))") } catch let error as JSONUtilities.DecodingError { print("Parsing spec failed: \(error.description)".red) diff --git a/Tests/XcodeGenKitTests/FixtureTests.swift b/Tests/XcodeGenKitTests/FixtureTests.swift index fe808cbc..40e47e8d 100644 --- a/Tests/XcodeGenKitTests/FixtureTests.swift +++ b/Tests/XcodeGenKitTests/FixtureTests.swift @@ -7,7 +7,7 @@ import ProjectSpec let fixturePath = Path(#file).parent().parent().parent() + "Fixtures" func generate(specPath: Path, projectPath: Path) throws -> XcodeProj { - let spec = try SpecLoader.loadSpec(path: specPath) + let spec = try ProjectSpec(path: specPath) let generator = ProjectGenerator(spec: spec) let project = try generator.generateProject() let oldProject = try XcodeProj(path: projectPath) diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 19ca62a1..59deae27 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -84,7 +84,7 @@ func projectGeneratorTests() { } $0.it("merges settings") { - let spec = try SpecLoader.loadSpec(path: fixturePath + "settings_test.yml") + let spec = try ProjectSpec(path: fixturePath + "settings_test.yml") guard let config = spec.getConfig("config1") else { throw failure("Couldn't find config1") } let debugProjectSettings = spec.getProjectBuildSettings(config: config) diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift index dc16db9e..46c0b492 100644 --- a/Tests/XcodeGenKitTests/ProjectSpecTests.swift +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -80,7 +80,7 @@ func projectSpecTests() { try expectValidationError(spec, .invalidTargetDependency(target: "target1", dependency: "invalidDependency")) try expectValidationError(spec, .invalidTargetConfigFile(target: "target1", configFile: "invalidConfigFile", config: "invalidConfig")) try expectValidationError(spec, .invalidTargetSchemeTest(target: "target1", testTarget: "invalidTarget")) - try expectValidationError(spec, .missingTargetSource(target: "target1", source: "invalidSource")) + try expectValidationError(spec, .invalidTargetSource(target: "target1", source: "invalidSource")) try expectValidationError(spec, .invalidBuildSettingConfig("invalidConfig")) try expectValidationError(spec, .invalidSettingsGroup("invalidSettingGroup")) try expectValidationError(spec, .invalidBuildScriptPath(target:"target1", name: "prebuildScript1", path: "invalidPrebuildScript")) diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index f2827e26..b6a39a41 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -15,13 +15,13 @@ func specLoadingTests() { return try ProjectSpec(basePath: "", jsonDictionary: specDictionary) } - func expectProjectSpecError(_ spec: [String: Any], _ expectedError: ProjectSpecError) throws { + func expectProjectSpecError(_ spec: [String: Any], _ expectedError: SpecParsingError) throws { try expectError(expectedError) { try getProjectSpec(spec) } } - func expectTargetError(_ target: [String: Any], _ expectedError: ProjectSpecError) throws { + func expectTargetError(_ target: [String: Any], _ expectedError: SpecParsingError) throws { try expectError(expectedError) { _ = try Target(name: "test", jsonDictionary: target) } @@ -33,7 +33,7 @@ func specLoadingTests() { describe("Spec Loader") { $0.it("merges includes") { let path = fixturePath + "include_test.yml" - let spec = try SpecLoader.loadSpec(path: path) + let spec = try ProjectSpec(path: path) try expect(spec.name) == "NewName" try expect(spec.settingGroups) == [ @@ -128,7 +128,7 @@ func specLoadingTests() { } $0.it("parses settings") { - let spec = try SpecLoader.loadSpec(path: fixturePath + "settings_test.yml") + let spec = try ProjectSpec(path: fixturePath + "settings_test.yml") let buildSettings: BuildSettings = ["SETTING": "value"] let configSettings: [String: Settings] = ["config1": Settings(buildSettings: ["SETTING1": "value"])] let groups = ["preset1"] From 92c2e5c5b5f9fe234923b1a8d0e346652e1e8759 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 22:27:05 +0100 Subject: [PATCH 04/23] run format-code.sh --- Sources/ProjectSpec/BuildScript.swift | 4 ++-- Sources/ProjectSpec/Config.swift | 2 +- Sources/ProjectSpec/Dependency.swift | 2 +- Sources/ProjectSpec/Platform.swift | 2 +- Sources/ProjectSpec/ProjectSpec.swift | 10 ++++----- Sources/ProjectSpec/Scheme.swift | 16 +++++++------- Sources/ProjectSpec/Settings.swift | 4 ++-- Sources/ProjectSpec/SpecValidation.swift | 2 +- Sources/ProjectSpec/Target.swift | 4 ++-- Sources/XcodeGenKit/SettingsBuilder.swift | 2 +- .../ProjectGeneratorTests.swift | 14 ++++++------- Tests/XcodeGenKitTests/ProjectSpecTests.swift | 21 ++++++++----------- 12 files changed, 40 insertions(+), 43 deletions(-) diff --git a/Sources/ProjectSpec/BuildScript.swift b/Sources/ProjectSpec/BuildScript.swift index 115f7e1b..4eb25f9c 100644 --- a/Sources/ProjectSpec/BuildScript.swift +++ b/Sources/ProjectSpec/BuildScript.swift @@ -22,7 +22,7 @@ public struct BuildScript: Equatable { case path(String) case script(String) - public static func ==(lhs: ScriptType, rhs: ScriptType) -> Bool { + public static func == (lhs: ScriptType, rhs: ScriptType) -> Bool { switch (lhs, rhs) { case let (.path(lhs), .path(rhs)): return lhs == rhs case let (.script(lhs), .script(rhs)): return lhs == rhs @@ -40,7 +40,7 @@ public struct BuildScript: Equatable { self.runOnlyWhenInstalling = runOnlyWhenInstalling } - public static func ==(lhs: BuildScript, rhs: BuildScript) -> Bool { + public static func == (lhs: BuildScript, rhs: BuildScript) -> Bool { return lhs.script == rhs.script && lhs.name == rhs.name && lhs.script == rhs.script && diff --git a/Sources/ProjectSpec/Config.swift b/Sources/ProjectSpec/Config.swift index 474894f4..36789af4 100644 --- a/Sources/ProjectSpec/Config.swift +++ b/Sources/ProjectSpec/Config.swift @@ -19,7 +19,7 @@ public struct Config: Equatable { self.type = type } - public static func ==(lhs: Config, rhs: Config) -> Bool { + public static func == (lhs: Config, rhs: Config) -> Bool { return lhs.name == rhs.name && lhs.type == rhs.type } diff --git a/Sources/ProjectSpec/Dependency.swift b/Sources/ProjectSpec/Dependency.swift index a22eb302..5ddfcd2f 100644 --- a/Sources/ProjectSpec/Dependency.swift +++ b/Sources/ProjectSpec/Dependency.swift @@ -30,7 +30,7 @@ public struct Dependency: Equatable { case carthage } - public static func ==(lhs: Dependency, rhs: Dependency) -> Bool { + public static func == (lhs: Dependency, rhs: Dependency) -> Bool { return lhs.reference == rhs.reference && lhs.type == rhs.type && lhs.codeSign == rhs.codeSign && diff --git a/Sources/ProjectSpec/Platform.swift b/Sources/ProjectSpec/Platform.swift index 67f2ff64..a29c1a90 100644 --- a/Sources/ProjectSpec/Platform.swift +++ b/Sources/ProjectSpec/Platform.swift @@ -18,7 +18,7 @@ public enum Platform: String { case .macOS: return "Mac" default: - return self.rawValue + return rawValue } } } diff --git a/Sources/ProjectSpec/ProjectSpec.swift b/Sources/ProjectSpec/ProjectSpec.swift index 5fb3e319..1cf01830 100644 --- a/Sources/ProjectSpec/ProjectSpec.swift +++ b/Sources/ProjectSpec/ProjectSpec.swift @@ -31,20 +31,20 @@ public struct ProjectSpec { public var carthageBuildPath: String? public var bundleIdPrefix: String? public var settingPresets: SettingPresets = .all - + public enum SettingPresets: String { case all case none case project case targets - + public var applyTarget: Bool { switch self { case .all, .targets: return true default: return false } } - + public var applyProject: Bool { switch self { case .all, .project: return true @@ -103,7 +103,7 @@ extension ProjectSpec: CustomDebugStringConvertible { extension ProjectSpec: Equatable { - public static func ==(lhs: ProjectSpec, rhs: ProjectSpec) -> Bool { + public static func == (lhs: ProjectSpec, rhs: ProjectSpec) -> Bool { return lhs.name == rhs.name && lhs.targets == rhs.targets && lhs.settings == rhs.settings && @@ -119,7 +119,7 @@ extension ProjectSpec: Equatable { extension ProjectSpec.Options: Equatable { - public static func ==(lhs: ProjectSpec.Options, rhs: ProjectSpec.Options) -> Bool { + public static func == (lhs: ProjectSpec.Options, rhs: ProjectSpec.Options) -> Bool { return lhs.carthageBuildPath == rhs.carthageBuildPath && lhs.bundleIdPrefix == rhs.bundleIdPrefix && lhs.settingPresets == rhs.settingPresets diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index 9c699d88..e43fd6f5 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -48,7 +48,7 @@ public struct Scheme: Equatable { self.targets = targets } - public static func ==(lhs: Build, rhs: Build) -> Bool { + public static func == (lhs: Build, rhs: Build) -> Bool { return lhs.targets == rhs.targets } } @@ -59,7 +59,7 @@ public struct Scheme: Equatable { self.config = config } - public static func ==(lhs: Run, rhs: Run) -> Bool { + public static func == (lhs: Run, rhs: Run) -> Bool { return lhs.config == rhs.config } } @@ -70,7 +70,7 @@ public struct Scheme: Equatable { self.config = config } - public static func ==(lhs: Test, rhs: Test) -> Bool { + public static func == (lhs: Test, rhs: Test) -> Bool { return lhs.config == rhs.config } } @@ -81,7 +81,7 @@ public struct Scheme: Equatable { self.config = config } - public static func ==(lhs: Analyze, rhs: Analyze) -> Bool { + public static func == (lhs: Analyze, rhs: Analyze) -> Bool { return lhs.config == rhs.config } } @@ -92,7 +92,7 @@ public struct Scheme: Equatable { self.config = config } - public static func ==(lhs: Profile, rhs: Profile) -> Bool { + public static func == (lhs: Profile, rhs: Profile) -> Bool { return lhs.config == rhs.config } } @@ -103,7 +103,7 @@ public struct Scheme: Equatable { self.config = config } - public static func ==(lhs: Archive, rhs: Archive) -> Bool { + public static func == (lhs: Archive, rhs: Archive) -> Bool { return lhs.config == rhs.config } } @@ -117,12 +117,12 @@ public struct Scheme: Equatable { self.buildTypes = buildTypes } - public static func ==(lhs: BuildTarget, rhs: BuildTarget) -> Bool { + public static func == (lhs: BuildTarget, rhs: BuildTarget) -> Bool { return lhs.target == rhs.target && lhs.buildTypes == rhs.buildTypes } } - public static func ==(lhs: Scheme, rhs: Scheme) -> Bool { + public static func == (lhs: Scheme, rhs: Scheme) -> Bool { return lhs.build == rhs.build && lhs.run == rhs.run && lhs.test == rhs.test && diff --git a/Sources/ProjectSpec/Settings.swift b/Sources/ProjectSpec/Settings.swift index cf6cbb8a..5c705a66 100644 --- a/Sources/ProjectSpec/Settings.swift +++ b/Sources/ProjectSpec/Settings.swift @@ -44,7 +44,7 @@ public struct Settings: Equatable, JSONObjectConvertible, CustomStringConvertibl } } - public static func ==(lhs: Settings, rhs: Settings) -> Bool { + public static func == (lhs: Settings, rhs: Settings) -> Bool { return NSDictionary(dictionary: lhs.buildSettings).isEqual(to: rhs.buildSettings) && lhs.configSettings == rhs.configSettings && lhs.groups == rhs.groups @@ -109,7 +109,7 @@ extension Dictionary where Key == String, Value: Any { } } -public func +=(lhs: inout BuildSettings, rhs: BuildSettings?) { +public func += (lhs: inout BuildSettings, rhs: BuildSettings?) { guard let rhs = rhs else { return } lhs.merge(rhs) } diff --git a/Sources/ProjectSpec/SpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift index 4b309fe8..caa79e6a 100644 --- a/Sources/ProjectSpec/SpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -24,7 +24,7 @@ extension ProjectSpec { } } for config in settings.configSettings.keys { - if !configs.contains(where: { $0.name.lowercased().contains(config.lowercased())}) { + if !configs.contains(where: { $0.name.lowercased().contains(config.lowercased()) }) { errors.append(.invalidBuildSettingConfig(config)) } } diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index 12c5e4e4..e9943aa0 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -120,7 +120,7 @@ extension Target { extension Target: Equatable { - public static func ==(lhs: Target, rhs: Target) -> Bool { + public static func == (lhs: Target, rhs: Target) -> Bool { return lhs.name == rhs.name && lhs.type == rhs.type && lhs.platform == rhs.platform && @@ -146,7 +146,7 @@ public struct TargetScheme { extension TargetScheme: Equatable { - public static func ==(lhs: TargetScheme, rhs: TargetScheme) -> Bool { + public static func == (lhs: TargetScheme, rhs: TargetScheme) -> Bool { return lhs.testTargets == rhs.testTargets && lhs.configVariants == rhs.configVariants } diff --git a/Sources/XcodeGenKit/SettingsBuilder.swift b/Sources/XcodeGenKit/SettingsBuilder.swift index 26b2b78e..3af2f829 100644 --- a/Sources/XcodeGenKit/SettingsBuilder.swift +++ b/Sources/XcodeGenKit/SettingsBuilder.swift @@ -30,7 +30,7 @@ extension ProjectSpec { public func getTargetBuildSettings(target: Target, config: Config) -> BuildSettings { var buildSettings = BuildSettings() - + if options.settingPresets.applyTarget { buildSettings += SettingsPresetFile.platform(target.platform).getBuildSettings() buildSettings += SettingsPresetFile.product(target.type).getBuildSettings() diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 59deae27..83dfd235 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -38,20 +38,19 @@ func projectGeneratorTests() { let buildConfigs = project.pbxproj.configurationLists.getReference(buildConfigList), let buildConfigReference = buildConfigs.buildConfigurations.first, let buildConfig = project.pbxproj.buildConfigurations.getReference(buildConfigReference) else { - throw failure("Build Config not found") + throw failure("Build Config not found") } try expect(buildConfig.buildSettings["PRODUCT_BUNDLE_IDENTIFIER"] as? String) == "com.test.MyFramework" } - + $0.it("clears setting presets") { var options = ProjectSpec.Options() options.settingPresets = .none let spec = ProjectSpec(basePath: "", name: "test", targets: [framework], options: options) let project = try getProject(spec) - let allSettings = project.pbxproj.buildConfigurations.reduce([:]) { $0.merged($1.buildSettings)}.keys.sorted() + let allSettings = project.pbxproj.buildConfigurations.reduce([:]) { $0.merged($1.buildSettings) }.keys.sorted() try expect(allSettings) == ["SETTING_2"] } - } $0.describe("Config") { @@ -73,7 +72,7 @@ func projectGeneratorTests() { try expect(configs).contains(name: "config1") try expect(configs).contains(name: "config2") } - + $0.it("clears config settings when missing type") { let spec = ProjectSpec(basePath: "", name: "test", configs: [Config(name: "config")]) let project = try getProject(spec) @@ -114,8 +113,9 @@ func projectGeneratorTests() { $0.it("applies partial config settings") { let spec = ProjectSpec(basePath: "", name: "test", configs: [ Config(name: "Staging Debug", type: .debug), - Config(name: "Staging Release", type: .release)], - settings: Settings(configSettings: ["staging": ["SETTING1": "VALUE1"], "debug": ["SETTING2": "VALUE2"]])) + Config(name: "Staging Release", type: .release), + ], + settings: Settings(configSettings: ["staging": ["SETTING1": "VALUE1"], "debug": ["SETTING2": "VALUE2"]])) var buildSettings = spec.getProjectBuildSettings(config: spec.configs.first!) try expect(buildSettings["SETTING1"] as? String) == "VALUE1" diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift index 46c0b492..d8393335 100644 --- a/Tests/XcodeGenKitTests/ProjectSpecTests.swift +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -29,7 +29,7 @@ func projectSpecTests() { do { try spec.validate() } catch let error as SpecValidationError { - if !error.errors.contains( where: { $0.description == expectedError.description }) { + if !error.errors.contains(where: { $0.description == expectedError.description }) { throw failure("Supposed to fail with:\n\(expectedError)\nbut got:\n\(error.errors.map { $0.description }.joined(separator: "\n"))") } return @@ -49,8 +49,7 @@ func projectSpecTests() { spec.settings = invalidSettings spec.configFiles = ["invalidConfig": "invalidConfigFile"] spec.fileGroups = ["invalidFileGroup"] - spec.settingGroups = ["settingGroup1": Settings(configSettings: ["invalidSettingGroupConfig": [:]], - groups: ["invalidSettingGroupSettingGroup"])] + spec.settingGroups = ["settingGroup1": Settings(configSettings: ["invalidSettingGroupConfig": [:]], groups: ["invalidSettingGroupSettingGroup"])] try expectValidationError(spec, .invalidConfigFileConfig("invalidConfig")) try expectValidationError(spec, .invalidBuildSettingConfig("invalidConfig")) @@ -70,12 +69,10 @@ func projectSpecTests() { configFiles: ["invalidConfig": "invalidConfigFile"], sources: ["invalidSource"], dependencies: [Dependency(type: .target, reference: "invalidDependency")], - prebuildScripts: [BuildScript(script: .path("invalidPrebuildScript"), name: "prebuildScript1", inputFiles: - [], outputFiles: [])], - postbuildScripts: [BuildScript(script: .path("invalidPostbuildScript"), inputFiles: - [], outputFiles: [])], + prebuildScripts: [BuildScript(script: .path("invalidPrebuildScript"), name: "prebuildScript1")], + postbuildScripts: [BuildScript(script: .path("invalidPostbuildScript"))], scheme: TargetScheme(testTargets: ["invalidTarget"]) - )] + )] try expectValidationError(spec, .invalidTargetDependency(target: "target1", dependency: "invalidDependency")) try expectValidationError(spec, .invalidTargetConfigFile(target: "target1", configFile: "invalidConfigFile", config: "invalidConfig")) @@ -83,11 +80,11 @@ func projectSpecTests() { try expectValidationError(spec, .invalidTargetSource(target: "target1", source: "invalidSource")) try expectValidationError(spec, .invalidBuildSettingConfig("invalidConfig")) try expectValidationError(spec, .invalidSettingsGroup("invalidSettingGroup")) - try expectValidationError(spec, .invalidBuildScriptPath(target:"target1", name: "prebuildScript1", path: "invalidPrebuildScript")) - try expectValidationError(spec, .invalidBuildScriptPath(target:"target1", name: nil, path: "invalidPostbuildScript")) + try expectValidationError(spec, .invalidBuildScriptPath(target: "target1", name: "prebuildScript1", path: "invalidPrebuildScript")) + try expectValidationError(spec, .invalidBuildScriptPath(target: "target1", name: nil, path: "invalidPostbuildScript")) - try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target:"target1", configType: .debug)) - try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target:"target1", configType: .release)) + try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target: "target1", configType: .debug)) + try expectValidationError(spec, .missingConfigTypeForGeneratedTargetScheme(target: "target1", configType: .release)) spec.targets[0].scheme?.configVariants = ["invalidVariant"] try expectValidationError(spec, .invalidTargetSchemeConfigVariant(target: "target1", configVariant: "invalidVariant", configType: .debug)) From 43bacd4626d864695b2e39fa2b51827289c9791d Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 22:42:35 +0100 Subject: [PATCH 05/23] don't run later fixture tests if changed, so it's clearer in logs what happened --- Tests/XcodeGenKitTests/FixtureTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/XcodeGenKitTests/FixtureTests.swift b/Tests/XcodeGenKitTests/FixtureTests.swift index 40e47e8d..7697741c 100644 --- a/Tests/XcodeGenKitTests/FixtureTests.swift +++ b/Tests/XcodeGenKitTests/FixtureTests.swift @@ -31,7 +31,7 @@ func fixtureTests() { } $0.it("generates variant group") { - guard let project = project else { throw failure("Project is not generated") } + guard let project = project else { return } func getFileReferences(_ path: String) -> [PBXFileReference] { return project.pbxproj.fileReferences.filter { $0.path == path } From 17b32e6a1a9f1643e65173950014a7e497bb0156 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sun, 29 Oct 2017 22:46:35 +0100 Subject: [PATCH 06/23] refactored TestProject Fixture - renamed things - made framework multiplatform - integrate carthage --- Fixtures/TestProject/.gitignore | 1 + .../AppDelegate.swift | 4 +- .../AppIcon.appiconset/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../Base.lproj/LocalizedStoryboard.storyboard | 0 .../Base.lproj/Main.storyboard | 0 .../{TestProject => App_iOS}/Info.plist | 0 .../ViewController.swift | 0 .../en.lproj/LocalizedStoryboard.strings | 0 .../Info.plist | 0 .../TestProjectTests.swift | 0 Fixtures/TestProject/Cartfile | 1 + Fixtures/TestProject/Cartfile.resolved | 1 + .../FrameworkFile.swift | 0 .../{MyFramework => Framework}/Info.plist | 0 Fixtures/TestProject/Framework/MyFramework.h | 9 + .../project.pbxproj | 725 ------ .../xcschemes/TestProject.xcscheme | 35 - .../TestProject/MyFramework/MyFramework.h | 19 - .../Project.xcodeproj/project.pbxproj | 2065 +++++++++++++++++ .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/App_iOS.xcscheme | 35 + .../TestProject.xcodeproj/project.pbxproj | 640 ----- .../contents.xcworkspacedata | 7 - Fixtures/TestProject/environment_test.yml | 24 - Fixtures/TestProject/environments.yml | 13 + Fixtures/TestProject/scripts/script.sh | 1 + Fixtures/TestProject/scripts/swiftlint.sh | 5 - Fixtures/TestProject/spec.yml | 50 +- Tests/XcodeGenKitTests/FixtureTests.swift | 2 +- 30 files changed, 2153 insertions(+), 1484 deletions(-) create mode 100644 Fixtures/TestProject/.gitignore rename Fixtures/TestProject/{TestProject => App_iOS}/AppDelegate.swift (88%) rename Fixtures/TestProject/{TestProject => App_iOS}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/Base.lproj/LaunchScreen.storyboard (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/Base.lproj/LocalizedStoryboard.storyboard (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/Base.lproj/Main.storyboard (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/Info.plist (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/ViewController.swift (100%) rename Fixtures/TestProject/{TestProject => App_iOS}/en.lproj/LocalizedStoryboard.strings (100%) rename Fixtures/TestProject/{TestProjectTests => App_iOS_Tests}/Info.plist (100%) rename Fixtures/TestProject/{TestProjectTests => App_iOS_Tests}/TestProjectTests.swift (100%) create mode 100644 Fixtures/TestProject/Cartfile create mode 100644 Fixtures/TestProject/Cartfile.resolved rename Fixtures/TestProject/{MyFramework => Framework}/FrameworkFile.swift (100%) rename Fixtures/TestProject/{MyFramework => Framework}/Info.plist (100%) create mode 100644 Fixtures/TestProject/Framework/MyFramework.h delete mode 100644 Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj delete mode 100644 Fixtures/TestProject/GeneratedProject.xcodeproj/xcshareddata/xcschemes/TestProject.xcscheme delete mode 100644 Fixtures/TestProject/MyFramework/MyFramework.h create mode 100644 Fixtures/TestProject/Project.xcodeproj/project.pbxproj rename Fixtures/TestProject/{GeneratedProject.xcodeproj => Project.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme delete mode 100644 Fixtures/TestProject/TestProject.xcodeproj/project.pbxproj delete mode 100644 Fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Fixtures/TestProject/environment_test.yml create mode 100644 Fixtures/TestProject/environments.yml create mode 100644 Fixtures/TestProject/scripts/script.sh delete mode 100644 Fixtures/TestProject/scripts/swiftlint.sh diff --git a/Fixtures/TestProject/.gitignore b/Fixtures/TestProject/.gitignore new file mode 100644 index 00000000..b08b1c9e --- /dev/null +++ b/Fixtures/TestProject/.gitignore @@ -0,0 +1 @@ +Carthage diff --git a/Fixtures/TestProject/TestProject/AppDelegate.swift b/Fixtures/TestProject/App_iOS/AppDelegate.swift similarity index 88% rename from Fixtures/TestProject/TestProject/AppDelegate.swift rename to Fixtures/TestProject/App_iOS/AppDelegate.swift index e5c4cd64..bc2428a6 100644 --- a/Fixtures/TestProject/TestProject/AppDelegate.swift +++ b/Fixtures/TestProject/App_iOS/AppDelegate.swift @@ -7,7 +7,7 @@ // import UIKit -import MyFramework +import Framework @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -17,7 +17,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. - let frameworkStruct = FrameworkStruct() + _ = FrameworkStruct() return true } diff --git a/Fixtures/TestProject/TestProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/Fixtures/TestProject/App_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Fixtures/TestProject/TestProject/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Fixtures/TestProject/App_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Fixtures/TestProject/TestProject/Base.lproj/LaunchScreen.storyboard b/Fixtures/TestProject/App_iOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Fixtures/TestProject/TestProject/Base.lproj/LaunchScreen.storyboard rename to Fixtures/TestProject/App_iOS/Base.lproj/LaunchScreen.storyboard diff --git a/Fixtures/TestProject/TestProject/Base.lproj/LocalizedStoryboard.storyboard b/Fixtures/TestProject/App_iOS/Base.lproj/LocalizedStoryboard.storyboard similarity index 100% rename from Fixtures/TestProject/TestProject/Base.lproj/LocalizedStoryboard.storyboard rename to Fixtures/TestProject/App_iOS/Base.lproj/LocalizedStoryboard.storyboard diff --git a/Fixtures/TestProject/TestProject/Base.lproj/Main.storyboard b/Fixtures/TestProject/App_iOS/Base.lproj/Main.storyboard similarity index 100% rename from Fixtures/TestProject/TestProject/Base.lproj/Main.storyboard rename to Fixtures/TestProject/App_iOS/Base.lproj/Main.storyboard diff --git a/Fixtures/TestProject/TestProject/Info.plist b/Fixtures/TestProject/App_iOS/Info.plist similarity index 100% rename from Fixtures/TestProject/TestProject/Info.plist rename to Fixtures/TestProject/App_iOS/Info.plist diff --git a/Fixtures/TestProject/TestProject/ViewController.swift b/Fixtures/TestProject/App_iOS/ViewController.swift similarity index 100% rename from Fixtures/TestProject/TestProject/ViewController.swift rename to Fixtures/TestProject/App_iOS/ViewController.swift diff --git a/Fixtures/TestProject/TestProject/en.lproj/LocalizedStoryboard.strings b/Fixtures/TestProject/App_iOS/en.lproj/LocalizedStoryboard.strings similarity index 100% rename from Fixtures/TestProject/TestProject/en.lproj/LocalizedStoryboard.strings rename to Fixtures/TestProject/App_iOS/en.lproj/LocalizedStoryboard.strings diff --git a/Fixtures/TestProject/TestProjectTests/Info.plist b/Fixtures/TestProject/App_iOS_Tests/Info.plist similarity index 100% rename from Fixtures/TestProject/TestProjectTests/Info.plist rename to Fixtures/TestProject/App_iOS_Tests/Info.plist diff --git a/Fixtures/TestProject/TestProjectTests/TestProjectTests.swift b/Fixtures/TestProject/App_iOS_Tests/TestProjectTests.swift similarity index 100% rename from Fixtures/TestProject/TestProjectTests/TestProjectTests.swift rename to Fixtures/TestProject/App_iOS_Tests/TestProjectTests.swift diff --git a/Fixtures/TestProject/Cartfile b/Fixtures/TestProject/Cartfile new file mode 100644 index 00000000..821b0ae3 --- /dev/null +++ b/Fixtures/TestProject/Cartfile @@ -0,0 +1 @@ +github "Alamofire/Alamofire" diff --git a/Fixtures/TestProject/Cartfile.resolved b/Fixtures/TestProject/Cartfile.resolved new file mode 100644 index 00000000..a8c2ced7 --- /dev/null +++ b/Fixtures/TestProject/Cartfile.resolved @@ -0,0 +1 @@ +github "Alamofire/Alamofire" "4.5.1" diff --git a/Fixtures/TestProject/MyFramework/FrameworkFile.swift b/Fixtures/TestProject/Framework/FrameworkFile.swift similarity index 100% rename from Fixtures/TestProject/MyFramework/FrameworkFile.swift rename to Fixtures/TestProject/Framework/FrameworkFile.swift diff --git a/Fixtures/TestProject/MyFramework/Info.plist b/Fixtures/TestProject/Framework/Info.plist similarity index 100% rename from Fixtures/TestProject/MyFramework/Info.plist rename to Fixtures/TestProject/Framework/Info.plist diff --git a/Fixtures/TestProject/Framework/MyFramework.h b/Fixtures/TestProject/Framework/MyFramework.h new file mode 100644 index 00000000..739f2414 --- /dev/null +++ b/Fixtures/TestProject/Framework/MyFramework.h @@ -0,0 +1,9 @@ +// +// MyFramework.h +// MyFramework +// +// Created by Yonas Kolb on 21/7/17. +// Copyright © 2017 Yonas Kolb. All rights reserved. +// + + diff --git a/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj b/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj deleted file mode 100644 index e3d1e4c9..00000000 --- a/Fixtures/TestProject/GeneratedProject.xcodeproj/project.pbxproj +++ /dev/null @@ -1,725 +0,0 @@ -// !$*UTF8*$! -{ - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; }; - BF1462768401 = {isa = PBXBuildFile; fileRef = FR2653659501 /* TestProjectTests.xctest */; }; - BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; }; - BF2250910101 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2043127501 /* Main.storyboard */; }; - BF2445564001 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2858723001 /* LaunchScreen.storyboard */; }; - BF2513089601 /* LocalizedStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG3182922801 /* LocalizedStoryboard.storyboard */; }; - BF2753556301 = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; }; - BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; }; - BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF3862341101 /* MyFramework.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - BF5986511201 = {isa = PBXBuildFile; fileRef = FR6523263101 /* TestProject.app */; }; - BF6182896901 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR9215298301 /* Result.framework */; }; - BF7015992001 /* MyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR2993497801 /* MyFramework.framework */; }; - BF9001417701 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6877173101 /* TestProjectTests.swift */; }; - BF9155249601 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - CIP265365901 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P81399456601 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT6523263101; - remoteInfo = TestProject; - }; - CIP652326301 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = P81399456601 /* Project object */; - proxyType = 1; - remoteGlobalIDString = NT2993497801; - remoteInfo = MyFramework; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CFBP50493301 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - BF3862341101 /* MyFramework.framework in CopyFiles */, - ); - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - FR1332263601 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - FR1345298501 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR1345298502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR1345298503 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FR1473702401 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - FR2653659501 /* TestProjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = xctest; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = TestProjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - FR2993497801 /* MyFramework.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = MyFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FR3546283901 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; - FR4822987701 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; - FR5980633301 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - FR6218091901 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - FR6334256101 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; - FR6405436301 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - FR6523263101 /* TestProject.app */ = {isa = PBXFileReference; explicitFileType = app; includeInIndex = 0; lastKnownFileType = wrapper.application; path = TestProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FR6877173101 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = ""; }; - FR7078510801 /* FrameworkFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkFile.swift; sourceTree = ""; }; - FR7740960501 /* MyFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFramework.h; sourceTree = ""; }; - FR8182352201 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; - FR9215298301 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - FBP652326301 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BF7015992001 /* MyFramework.framework in Frameworks */, - BF6182896901 /* Result.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - G19527407101 /* Frameworks */ = { - isa = PBXGroup; - children = ( - G28836901501 /* Carthage */, - ); - name = Frameworks; - sourceTree = ""; - }; - G26536595301 /* TestProjectTests */ = { - isa = PBXGroup; - children = ( - FR1345298503 /* Info.plist */, - FR6877173101 /* TestProjectTests.swift */, - ); - name = TestProjectTests; - path = TestProjectTests; - sourceTree = ""; - }; - G28836901501 /* Carthage */ = { - isa = PBXGroup; - children = ( - G47994500501 /* iOS */, - ); - name = Carthage; - path = Carthage/Build; - sourceTree = ""; - }; - G29934978701 /* MyFramework */ = { - isa = PBXGroup; - children = ( - FR7078510801 /* FrameworkFile.swift */, - FR1345298501 /* Info.plist */, - FR7740960501 /* MyFramework.h */, - ); - name = MyFramework; - path = MyFramework; - sourceTree = ""; - }; - G47994500501 /* iOS */ = { - isa = PBXGroup; - children = ( - FR9215298301 /* Result.framework */, - ); - name = iOS; - path = iOS; - sourceTree = ""; - }; - G65232631501 /* TestProject */ = { - isa = PBXGroup; - children = ( - FR1332263601 /* AppDelegate.swift */, - FR5980633301 /* Assets.xcassets */, - FR1345298502 /* Info.plist */, - FR6218091901 /* ViewController.swift */, - VG2858723001 /* LaunchScreen.storyboard */, - VG3182922801 /* LocalizedStoryboard.storyboard */, - VG2043127501 /* Main.storyboard */, - ); - name = TestProject; - path = TestProject; - sourceTree = ""; - }; - G83406189501 /* Configs */ = { - isa = PBXGroup; - children = ( - FR3546283901 /* base.xcconfig */, - FR6334256101 /* config.xcconfig */, - ); - name = Configs; - path = Configs; - sourceTree = ""; - }; - G84487712001 = { - isa = PBXGroup; - children = ( - G83406189501 /* Configs */, - G29934978701 /* MyFramework */, - G65232631501 /* TestProject */, - G26536595301 /* TestProjectTests */, - G86202385201 /* Products */, - G19527407101 /* Frameworks */, - ); - sourceTree = ""; - }; - G86202385201 /* Products */ = { - isa = PBXGroup; - children = ( - FR2993497801 /* MyFramework.framework */, - FR2653659501 /* TestProjectTests.xctest */, - FR6523263101 /* TestProject.app */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - HBP265365901 /* Frameworks */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; - HBP299349701 /* Frameworks */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - BF3515549501 /* MyFramework.h in Headers */, - ); - }; - HBP652326301 /* Frameworks */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - NT2653659501 /* TestProjectTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = XCCL26536501 /* Build configuration list for PBXNativeTarget "TestProjectTests" */; - buildPhases = ( - SBP265365901 /* Sources */, - RBP265365901 /* Resources */, - HBP265365901 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - TD8877980201 /* PBXTargetDependency */, - ); - name = TestProjectTests; - productReference = FR2653659501; - productType = "com.apple.product-type.bundle.unit-test"; - }; - NT2993497801 /* MyFramework */ = { - isa = PBXNativeTarget; - buildConfigurationList = XCCL29934901 /* Build configuration list for PBXNativeTarget "MyFramework" */; - buildPhases = ( - SBP299349701 /* Sources */, - RBP299349701 /* Resources */, - HBP299349701 /* Headers */, - SSBP35382101 /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MyFramework; - productReference = FR2993497801; - productType = "com.apple.product-type.framework"; - }; - NT6523263101 /* TestProject */ = { - isa = PBXNativeTarget; - buildConfigurationList = XCCL65232601 /* Build configuration list for PBXNativeTarget "TestProject" */; - buildPhases = ( - SBP652326301 /* Sources */, - RBP652326301 /* Resources */, - HBP652326301 /* Headers */, - FBP652326301 /* Frameworks */, - CFBP50493301 /* CopyFiles */, - SSBP58567701 /* Carthage */, - SSBP24648001 /* Strip Unused Architectures from Frameworks */, - SSBP19207501 /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - TD6170761801 /* PBXTargetDependency */, - ); - name = TestProject; - productReference = FR6523263101; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - P81399456601 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0900; - }; - buildConfigurationList = XCCL81399401 /* Build configuration list for PBXProject "GeneratedProject" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - knownRegions = ( - en, - Base, - ); - mainGroup = G84487712001; - targets = ( - NT2993497801 /* MyFramework */, - NT6523263101 /* TestProject */, - NT2653659501 /* TestProjectTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - RBP265365901 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; - RBP299349701 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; - RBP652326301 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF3154421201 /* Assets.xcassets in Resources */, - BF2445564001 /* LaunchScreen.storyboard in Resources */, - BF2513089601 /* LocalizedStoryboard.storyboard in Resources */, - BF2250910101 /* Main.storyboard in Resources */, - ); - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - SSBP19207501 /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - SSBP24648001 /* Strip Unused Architectures from Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Strip Unused Architectures from Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; - shellPath = /bin/sh; - shellScript = "################################################################################\n#\n# Copyright 2015 Realm Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n################################################################################\n\n# This script strips all non-valid architectures from dynamic libraries in\n# the application's `Frameworks` directory.\n#\n# The following environment variables are required:\n#\n# BUILT_PRODUCTS_DIR\n# FRAMEWORKS_FOLDER_PATH\n# VALID_ARCHS\n# EXPANDED_CODE_SIGN_IDENTITY\n\n\n# Signs a framework with the provided identity\ncode_sign() {\n # Use the current code_sign_identitiy\n echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n echo \"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1\"\n /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"\n}\n\n# Set working directory to product’s embedded frameworks\ncd \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nif [ \"$ACTION\" = \"install\" ]; then\n echo \"Copy .bcsymbolmap files to .xcarchive\"\n find . -name '*.bcsymbolmap' -type f -exec mv {} \"${CONFIGURATION_BUILD_DIR}\" \;\nelse\n # Delete *.bcsymbolmap files from framework bundle unless archiving\n find . -name '*.bcsymbolmap' -type f -exec rm -rf \"{}\" +\;\nfi\n\necho \"Stripping frameworks\"\n\nfor file in $(find . -type f -perm +111); do\n # Skip non-dynamic libraries\n if ! [[ \"$(file \"$file\")\" == *\"dynamically linked shared library\"* ]]; then\n continue\n fi\n # Get architectures for current file\n archs=\"$(lipo -info \"${file}\" | rev | cut -d ':' -f1 | rev)\"\n stripped=\"\"\n for arch in $archs; do\n if ! [[ \"${VALID_ARCHS}\" == *\"$arch\"* ]]; then\n # Strip non-valid architectures in-place\n lipo -remove \"$arch\" -output \"$file\" \"$file\" || exit 1\n stripped=\"$stripped $arch\"\n fi\n done\n if [[ \"$stripped\" != \"\" ]]; then\n echo \"Stripped $file of architectures:$stripped\"\n if [ \"${CODE_SIGNING_REQUIRED}\" == \"YES\" ]; then\n code_sign \"${file}\"\n fi\n fi\ndone\n"; - }; - SSBP35382101 /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; - SSBP58567701 /* Carthage */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/Carthage/Build/iOS/Result.framework", - ); - name = Carthage; - outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/usr/local/bin/carthage copy-frameworks\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - SBP265365901 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF9001417701 /* TestProjectTests.swift in Sources */, - ); - }; - SBP299349701 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF9155249601 /* FrameworkFile.swift in Sources */, - ); - }; - SBP652326301 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BF1073850101 /* AppDelegate.swift in Sources */, - BF1744565901 /* ViewController.swift in Sources */, - ); - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - TD6170761801 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = NT2993497801 /* MyFramework */; - targetProxy = CIP652326301 /* PBXContainerItemProxy */; - }; - TD8877980201 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = NT6523263101 /* TestProject */; - targetProxy = CIP265365901 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - VG2043127501 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR1473702401 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - VG2858723001 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR6405436301 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - VG3182922801 /* LocalizedStoryboard.storyboard */ = { - isa = PBXVariantGroup; - children = ( - FR4822987701 /* Base */, - FR8182352201 /* en */, - ); - name = LocalizedStoryboard.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - XCBC19846901 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_TESTABILITY = YES; - INFOPLIST_FILE = MyFramework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.MyFramework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - XCBC37128501 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FR6334256101 /* config.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = TestProject/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.TestProject; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - XCBC47994501 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - }; - name = Debug; - }; - XCBC60448901 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = TestProjectTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks @loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.TestProjectTests; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; - }; - name = Release; - }; - XCBC86437501 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = TestProject/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.TestProject; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - XCBC88111401 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - XCBC89077001 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); - INFOPLIST_FILE = TestProjectTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks @loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.TestProjectTests; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; - }; - name = Debug; - }; - XCBC89204001 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_TESTABILITY = YES; - INFOPLIST_FILE = MyFramework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.test.MyFramework; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - XCCL26536501 /* Build configuration list for PBXNativeTarget "TestProjectTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - XCBC89077001 /* Debug */, - XCBC60448901 /* Release */, - ); - defaultConfigurationName = ""; - }; - XCCL29934901 /* Build configuration list for PBXNativeTarget "MyFramework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - XCBC19846901 /* Debug */, - XCBC89204001 /* Release */, - ); - defaultConfigurationName = ""; - }; - XCCL65232601 /* Build configuration list for PBXNativeTarget "TestProject" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - XCBC37128501 /* Debug */, - XCBC86437501 /* Release */, - ); - defaultConfigurationName = ""; - }; - XCCL81399401 /* Build configuration list for PBXProject "GeneratedProject" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - XCBC47994501 /* Debug */, - XCBC88111401 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = P81399456601 /* Project object */; -} diff --git a/Fixtures/TestProject/GeneratedProject.xcodeproj/xcshareddata/xcschemes/TestProject.xcscheme b/Fixtures/TestProject/GeneratedProject.xcodeproj/xcshareddata/xcschemes/TestProject.xcscheme deleted file mode 100644 index 7faa7c9a..00000000 --- a/Fixtures/TestProject/GeneratedProject.xcodeproj/xcshareddata/xcschemes/TestProject.xcscheme +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Fixtures/TestProject/MyFramework/MyFramework.h b/Fixtures/TestProject/MyFramework/MyFramework.h deleted file mode 100644 index 027312f4..00000000 --- a/Fixtures/TestProject/MyFramework/MyFramework.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// MyFramework.h -// MyFramework -// -// Created by Yonas Kolb on 21/7/17. -// Copyright © 2017 Yonas Kolb. All rights reserved. -// - -#import - -//! Project version number for MyFramework. -FOUNDATION_EXPORT double MyFrameworkVersionNumber; - -//! Project version string for MyFramework. -FOUNDATION_EXPORT const unsigned char MyFrameworkVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj new file mode 100644 index 00000000..08d74392 --- /dev/null +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -0,0 +1,2065 @@ +// !$*UTF8*$! +{ + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; }; + BF1401236301 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072501 /* Alamofire.framework */; }; + BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; }; + BF2018435801 /* Framework_iOS.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BF2250910101 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2043127501 /* Main.storyboard */; }; + BF2445564001 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2858723001 /* LaunchScreen.storyboard */; }; + BF2513089601 /* LocalizedStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG3182922801 /* LocalizedStoryboard.storyboard */; }; + BF2535278401 = {isa = PBXBuildFile; fileRef = FR4387045301 /* Framework_watchOS.framework */; }; + BF3008399601 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072503 /* Alamofire.framework */; }; + BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; }; + BF3314441201 = {isa = PBXBuildFile; fileRef = FR5251191201 /* Framework_macOS.framework */; }; + BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF3515549502 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF3515549503 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF3515549504 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF4530793601 /* Framework_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; }; + BF5539436901 = {isa = PBXBuildFile; fileRef = FR6623158301 /* Framework_tvOS.framework */; }; + BF6380159901 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072502 /* Alamofire.framework */; }; + BF7121748201 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072504 /* Alamofire.framework */; }; + BF7642939101 = {isa = PBXBuildFile; fileRef = FR8252321101 /* App_iOS.app */; }; + BF8298265901 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072501 /* Alamofire.framework */; }; + BF8660115801 = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; }; + BF9001417701 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6877173101 /* TestProjectTests.swift */; }; + BF9155249601 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; + BF9155249602 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; + BF9155249603 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; + BF9155249604 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR7078510801 /* FrameworkFile.swift */; }; + BF9552530301 = {isa = PBXBuildFile; fileRef = FR7831228901 /* App_iOS_Tests.xctest */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + CIP783122801 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P84487712001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT8252321101; + remoteInfo = App_iOS; + }; + CIP825232101 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = P84487712001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = NT4722960401; + remoteInfo = Framework_iOS; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + CFBP64939301 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + BF2018435801 /* Framework_iOS.framework in CopyFiles */, + ); + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + FR1332263601 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + FR1345298501 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR1345298502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR1345298503 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FR1473702401 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FR3032072501 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; + FR3032072502 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; + FR3032072503 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; + FR3032072504 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; + FR3546283901 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; + FR4387045301 /* Framework_watchOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_watchOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR4722960401 /* Framework_iOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR4822987701 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; + FR5251191201 /* Framework_macOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR5980633301 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FR6218091901 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + FR6334256101 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; + FR6405436301 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + FR6623158301 /* Framework_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FR6877173101 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = ""; }; + FR7078510801 /* FrameworkFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkFile.swift; sourceTree = ""; }; + FR7740960501 /* MyFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFramework.h; sourceTree = ""; }; + FR7831228901 /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = xctest; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + FR8182352201 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; + FR8252321101 /* App_iOS.app */ = {isa = PBXFileReference; explicitFileType = app; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FBP438704501 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF7121748201 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBP472296001 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF8298265901 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBP525119101 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF6380159901 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBP662315801 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3008399601 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBP825232101 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BF4530793601 /* Framework_iOS.framework in Frameworks */, + BF1401236301 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + G19527407101 /* Frameworks */ = { + isa = PBXGroup; + children = ( + G28836901501 /* Carthage */, + ); + name = Frameworks; + sourceTree = ""; + }; + G28836901501 /* Carthage */ = { + isa = PBXGroup; + children = ( + G47994500501 /* iOS */, + G47994500502 /* Mac */, + G47994500901 /* tvOS */, + G67871650901 /* watchOS */, + ); + name = Carthage; + path = Carthage/Build; + sourceTree = ""; + }; + G46615002701 /* Framework */ = { + isa = PBXGroup; + children = ( + FR7078510801 /* FrameworkFile.swift */, + FR1345298503 /* Info.plist */, + FR7740960501 /* MyFramework.h */, + ); + name = Framework; + path = Framework; + sourceTree = ""; + }; + G47994500501 /* iOS */ = { + isa = PBXGroup; + children = ( + FR3032072501 /* Alamofire.framework */, + ); + name = iOS; + path = iOS; + sourceTree = ""; + }; + G47994500502 /* Mac */ = { + isa = PBXGroup; + children = ( + FR3032072502 /* Alamofire.framework */, + ); + name = Mac; + path = Mac; + sourceTree = ""; + }; + G47994500901 /* tvOS */ = { + isa = PBXGroup; + children = ( + FR3032072503 /* Alamofire.framework */, + ); + name = tvOS; + path = tvOS; + sourceTree = ""; + }; + G67871650901 /* watchOS */ = { + isa = PBXGroup; + children = ( + FR3032072504 /* Alamofire.framework */, + ); + name = watchOS; + path = watchOS; + sourceTree = ""; + }; + G78312289901 /* App_iOS_Tests */ = { + isa = PBXGroup; + children = ( + FR1345298502 /* Info.plist */, + FR6877173101 /* TestProjectTests.swift */, + ); + name = App_iOS_Tests; + path = App_iOS_Tests; + sourceTree = ""; + }; + G82523211001 /* App_iOS */ = { + isa = PBXGroup; + children = ( + FR1332263601 /* AppDelegate.swift */, + FR5980633301 /* Assets.xcassets */, + FR1345298501 /* Info.plist */, + FR6218091901 /* ViewController.swift */, + VG2858723001 /* LaunchScreen.storyboard */, + VG3182922801 /* LocalizedStoryboard.storyboard */, + VG2043127501 /* Main.storyboard */, + ); + name = App_iOS; + path = App_iOS; + sourceTree = ""; + }; + G83406189501 /* Configs */ = { + isa = PBXGroup; + children = ( + FR3546283901 /* base.xcconfig */, + FR6334256101 /* config.xcconfig */, + ); + name = Configs; + path = Configs; + sourceTree = ""; + }; + G84487712001 = { + isa = PBXGroup; + children = ( + G83406189501 /* Configs */, + G82523211001 /* App_iOS */, + G78312289901 /* App_iOS_Tests */, + G46615002701 /* Framework */, + G86202385201 /* Products */, + G19527407101 /* Frameworks */, + ); + sourceTree = ""; + }; + G86202385201 /* Products */ = { + isa = PBXGroup; + children = ( + FR5251191201 /* Framework_macOS.framework */, + FR7831228901 /* App_iOS_Tests.xctest */, + FR4722960401 /* Framework_iOS.framework */, + FR6623158301 /* Framework_tvOS.framework */, + FR4387045301 /* Framework_watchOS.framework */, + FR8252321101 /* App_iOS.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + HBP438704501 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3515549504 /* MyFramework.h in Headers */, + ); + }; + HBP472296001 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3515549501 /* MyFramework.h in Headers */, + ); + }; + HBP525119101 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3515549502 /* MyFramework.h in Headers */, + ); + }; + HBP662315801 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3515549503 /* MyFramework.h in Headers */, + ); + }; + HBP783122801 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + HBP825232101 /* Frameworks */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + NT4387045301 /* Framework_watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL43870401 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */; + buildPhases = ( + SBP438704501 /* Sources */, + RBP438704501 /* Resources */, + HBP438704501 /* Headers */, + FBP438704501 /* Frameworks */, + SSBP87697701 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework_watchOS; + productReference = FR4387045301; + productType = "com.apple.product-type.framework"; + }; + NT4722960401 /* Framework_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL47229601 /* Build configuration list for PBXNativeTarget "Framework_iOS" */; + buildPhases = ( + SBP472296001 /* Sources */, + RBP472296001 /* Resources */, + HBP472296001 /* Headers */, + FBP472296001 /* Frameworks */, + SSBP79093501 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework_iOS; + productReference = FR4722960401; + productType = "com.apple.product-type.framework"; + }; + NT5251191201 /* Framework_macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL52511901 /* Build configuration list for PBXNativeTarget "Framework_macOS" */; + buildPhases = ( + SBP525119101 /* Sources */, + RBP525119101 /* Resources */, + HBP525119101 /* Headers */, + FBP525119101 /* Frameworks */, + SSBP36421701 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework_macOS; + productReference = FR5251191201; + productType = "com.apple.product-type.framework"; + }; + NT6623158301 /* Framework_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL66231501 /* Build configuration list for PBXNativeTarget "Framework_tvOS" */; + buildPhases = ( + SBP662315801 /* Sources */, + RBP662315801 /* Resources */, + HBP662315801 /* Headers */, + FBP662315801 /* Frameworks */, + SSBP77937501 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework_tvOS; + productReference = FR6623158301; + productType = "com.apple.product-type.framework"; + }; + NT7831228901 /* App_iOS_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL78312201 /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */; + buildPhases = ( + SBP783122801 /* Sources */, + RBP783122801 /* Resources */, + HBP783122801 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + TD4366381601 /* PBXTargetDependency */, + ); + name = App_iOS_Tests; + productReference = FR7831228901; + productType = "com.apple.product-type.bundle.unit-test"; + }; + NT8252321101 /* App_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = XCCL82523201 /* Build configuration list for PBXNativeTarget "App_iOS" */; + buildPhases = ( + SBP825232101 /* Sources */, + RBP825232101 /* Resources */, + HBP825232101 /* Headers */, + FBP825232101 /* Frameworks */, + CFBP64939301 /* CopyFiles */, + SSBP81062201 /* Carthage */, + SSBP42763001 /* Strip Unused Architectures from Frameworks */, + SSBP12620601 /* MyScript */, + ); + buildRules = ( + ); + dependencies = ( + TD3543424801 /* PBXTargetDependency */, + ); + name = App_iOS; + productReference = FR8252321101; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + P84487712001 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0900; + }; + buildConfigurationList = XCCL84487701 /* Build configuration list for PBXProject "Project" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + knownRegions = ( + en, + Base, + ); + mainGroup = G84487712001; + targets = ( + NT8252321101 /* App_iOS */, + NT7831228901 /* App_iOS_Tests */, + NT4722960401 /* Framework_iOS */, + NT5251191201 /* Framework_macOS */, + NT6623158301 /* Framework_tvOS */, + NT4387045301 /* Framework_watchOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + RBP438704501 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + RBP472296001 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + RBP525119101 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + RBP662315801 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + RBP783122801 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + }; + RBP825232101 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF3154421201 /* Assets.xcassets in Resources */, + BF2445564001 /* LaunchScreen.storyboard in Resources */, + BF2513089601 /* LocalizedStoryboard.storyboard in Resources */, + BF2250910101 /* Main.storyboard in Resources */, + ); + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + SSBP12620601 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script!\"\n"; + }; + SSBP36421701 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP42763001 /* Strip Unused Architectures from Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Strip Unused Architectures from Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "################################################################################\n#\n# Copyright 2015 Realm Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n################################################################################\n\n# This script strips all non-valid architectures from dynamic libraries in\n# the application's `Frameworks` directory.\n#\n# The following environment variables are required:\n#\n# BUILT_PRODUCTS_DIR\n# FRAMEWORKS_FOLDER_PATH\n# VALID_ARCHS\n# EXPANDED_CODE_SIGN_IDENTITY\n\n\n# Signs a framework with the provided identity\ncode_sign() {\n # Use the current code_sign_identitiy\n echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n echo \"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1\"\n /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"\n}\n\n# Set working directory to product’s embedded frameworks\ncd \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nif [ \"$ACTION\" = \"install\" ]; then\n echo \"Copy .bcsymbolmap files to .xcarchive\"\n find . -name '*.bcsymbolmap' -type f -exec mv {} \"${CONFIGURATION_BUILD_DIR}\" \;\nelse\n # Delete *.bcsymbolmap files from framework bundle unless archiving\n find . -name '*.bcsymbolmap' -type f -exec rm -rf \"{}\" +\;\nfi\n\necho \"Stripping frameworks\"\n\nfor file in $(find . -type f -perm +111); do\n # Skip non-dynamic libraries\n if ! [[ \"$(file \"$file\")\" == *\"dynamically linked shared library\"* ]]; then\n continue\n fi\n # Get architectures for current file\n archs=\"$(lipo -info \"${file}\" | rev | cut -d ':' -f1 | rev)\"\n stripped=\"\"\n for arch in $archs; do\n if ! [[ \"${VALID_ARCHS}\" == *\"$arch\"* ]]; then\n # Strip non-valid architectures in-place\n lipo -remove \"$arch\" -output \"$file\" \"$file\" || exit 1\n stripped=\"$stripped $arch\"\n fi\n done\n if [[ \"$stripped\" != \"\" ]]; then\n echo \"Stripped $file of architectures:$stripped\"\n if [ \"${CODE_SIGNING_REQUIRED}\" == \"YES\" ]; then\n code_sign \"${file}\"\n fi\n fi\ndone\n"; + }; + SSBP77937501 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP79093501 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; + SSBP81062201 /* Carthage */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework", + ); + name = Carthage; + outputPaths = ( + "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/usr/local/bin/carthage copy-frameworks\n"; + }; + SSBP87697701 /* MyScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = MyScript; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"You ran a script\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + SBP438704501 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF9155249604 /* FrameworkFile.swift in Sources */, + ); + }; + SBP472296001 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF9155249601 /* FrameworkFile.swift in Sources */, + ); + }; + SBP525119101 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF9155249602 /* FrameworkFile.swift in Sources */, + ); + }; + SBP662315801 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF9155249603 /* FrameworkFile.swift in Sources */, + ); + }; + SBP783122801 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF9001417701 /* TestProjectTests.swift in Sources */, + ); + }; + SBP825232101 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF1073850101 /* AppDelegate.swift in Sources */, + BF1744565901 /* ViewController.swift in Sources */, + ); + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + TD3543424801 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = NT4722960401 /* Framework_iOS */; + targetProxy = CIP825232101 /* PBXContainerItemProxy */; + }; + TD4366381601 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = NT8252321101 /* App_iOS */; + targetProxy = CIP783122801 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + VG2043127501 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR1473702401 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + VG2858723001 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR6405436301 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + VG3182922801 /* LocalizedStoryboard.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FR4822987701 /* Base */, + FR8182352201 /* en */, + ); + name = LocalizedStoryboard.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + XCBC10805301 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + XCBC12810301 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Release"; + }; + XCBC21030701 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Staging Release"; + }; + XCBC21033801 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + XCBC24058701 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Test Debug"; + }; + XCBC24209601 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + VALIDATE_PRODUCT = YES; + }; + name = "Production Release"; + }; + XCBC26523001 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Release"; + }; + XCBC27534701 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + XCBC28299301 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + XCBC31310301 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + XCBC35117901 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + XCBC36855501 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Production Release"; + }; + XCBC38070301 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + XCBC38157701 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Production Release"; + }; + XCBC39733901 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_ID_SUFFIX = .staging; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + }; + name = "Staging Debug"; + }; + XCBC48068801 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Staging Debug"; + }; + XCBC49305201 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + XCBC49932501 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Production Debug"; + }; + XCBC51730601 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + XCBC53075501 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Release"; + }; + XCBC53348101 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; + XCBC56330801 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Staging Debug"; + }; + XCBC56888601 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Production Debug"; + }; + XCBC57537401 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_ID_SUFFIX = .test; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + VALIDATE_PRODUCT = YES; + }; + name = "Test Release"; + }; + XCBC59484901 /* Production Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Release"; + }; + XCBC62247101 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-iOS"; + PRODUCT_NAME = Framework; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + XCBC64473701 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Staging Debug"; + }; + XCBC65575201 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Debug"; + }; + XCBC68513501 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Test Release"; + }; + XCBC70527901 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Production Debug"; + }; + XCBC70994701 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + }; + name = "Production Debug"; + }; + XCBC73052101 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_ID_SUFFIX = .staging; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + VALIDATE_PRODUCT = YES; + }; + name = "Staging Release"; + }; + XCBC74135901 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Test Release"; + }; + XCBC74939301 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Test Debug"; + }; + XCBC76016801 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-tvOS"; + PRODUCT_NAME = Framework; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + XCBC76544101 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Release"; + }; + XCBC79071101 /* Staging Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Staging Release"; + }; + XCBC79371401 /* Test Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = TestProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks @loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project.App-iOS-Tests"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; + }; + name = "Test Release"; + }; + XCBC79991601 /* Production Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = App_iOS/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.project$(BUNDLE_ID_SUFFIX)"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Production Debug"; + }; + XCBC83210001 /* Test Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FR6334256101 /* config.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_ID_SUFFIX = .test; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + }; + name = "Test Debug"; + }; + XCBC83591101 /* Test Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/watchOS", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-watchOS"; + PRODUCT_NAME = Framework; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = "Test Debug"; + }; + XCBC87900001 /* Staging Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.project.Framework-macOS"; + PRODUCT_NAME = Framework; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = "Staging Debug"; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + XCCL43870401 /* Build configuration list for PBXNativeTarget "Framework_watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC49932501 /* Production Debug */, + XCBC38157701 /* Production Release */, + XCBC56330801 /* Staging Debug */, + XCBC79071101 /* Staging Release */, + XCBC83591101 /* Test Debug */, + XCBC68513501 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL47229601 /* Build configuration list for PBXNativeTarget "Framework_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC62247101 /* Production Debug */, + XCBC59484901 /* Production Release */, + XCBC31310301 /* Staging Debug */, + XCBC51730601 /* Staging Release */, + XCBC35117901 /* Test Debug */, + XCBC21033801 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL52511901 /* Build configuration list for PBXNativeTarget "Framework_macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC70527901 /* Production Debug */, + XCBC28299301 /* Production Release */, + XCBC87900001 /* Staging Debug */, + XCBC76544101 /* Staging Release */, + XCBC10805301 /* Test Debug */, + XCBC74135901 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL66231501 /* Build configuration list for PBXNativeTarget "Framework_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC27534701 /* Production Debug */, + XCBC49305201 /* Production Release */, + XCBC53348101 /* Staging Debug */, + XCBC76016801 /* Staging Release */, + XCBC65575201 /* Test Debug */, + XCBC38070301 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL78312201 /* Build configuration list for PBXNativeTarget "App_iOS_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC56888601 /* Production Debug */, + XCBC36855501 /* Production Release */, + XCBC64473701 /* Staging Debug */, + XCBC21030701 /* Staging Release */, + XCBC24058701 /* Test Debug */, + XCBC79371401 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL82523201 /* Build configuration list for PBXNativeTarget "App_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC79991601 /* Production Debug */, + XCBC12810301 /* Production Release */, + XCBC48068801 /* Staging Debug */, + XCBC26523001 /* Staging Release */, + XCBC74939301 /* Test Debug */, + XCBC53075501 /* Test Release */, + ); + defaultConfigurationName = ""; + }; + XCCL84487701 /* Build configuration list for PBXProject "Project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + XCBC70994701 /* Production Debug */, + XCBC24209601 /* Production Release */, + XCBC39733901 /* Staging Debug */, + XCBC73052101 /* Staging Release */, + XCBC83210001 /* Test Debug */, + XCBC57537401 /* Test Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Production Debug"; + }; +/* End XCConfigurationList section */ + }; + rootObject = P84487712001 /* Project object */; +} diff --git a/Fixtures/TestProject/GeneratedProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Fixtures/TestProject/Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Fixtures/TestProject/GeneratedProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Fixtures/TestProject/Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme b/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme new file mode 100644 index 00000000..cfe5e391 --- /dev/null +++ b/Fixtures/TestProject/Project.xcodeproj/xcshareddata/xcschemes/App_iOS.xcscheme @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Fixtures/TestProject/TestProject.xcodeproj/project.pbxproj b/Fixtures/TestProject/TestProject.xcodeproj/project.pbxproj deleted file mode 100644 index 759b10e3..00000000 --- a/Fixtures/TestProject/TestProject.xcodeproj/project.pbxproj +++ /dev/null @@ -1,640 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - CC2A0EC21F33D50E00C324B9 /* TestProjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2A0EC11F33D50E00C324B9 /* TestProjectTests.swift */; }; - CCA4B60E1F1FC00500DF34A1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA4B60D1F1FC00500DF34A1 /* AppDelegate.swift */; }; - CCA4B6101F1FC00500DF34A1 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA4B60F1F1FC00500DF34A1 /* ViewController.swift */; }; - CCA4B6131F1FC00500DF34A1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CCA4B6111F1FC00500DF34A1 /* Main.storyboard */; }; - CCA4B6151F1FC00500DF34A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CCA4B6141F1FC00500DF34A1 /* Assets.xcassets */; }; - CCA4B6181F1FC00500DF34A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CCA4B6161F1FC00500DF34A1 /* LaunchScreen.storyboard */; }; - CCA71FEC1F225E4C00F772C1 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = CCA71FEA1F225E4C00F772C1 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCA71FEF1F225E4C00F772C1 /* MyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCA71FE81F225E4C00F772C1 /* MyFramework.framework */; }; - CCA71FF11F225E4C00F772C1 /* MyFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CCA71FE81F225E4C00F772C1 /* MyFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - CCA720171F22A3C400F772C1 /* FrameworkFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA720161F22A3C400F772C1 /* FrameworkFile.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - CC2A0EC41F33D50E00C324B9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CCA4B6021F1FC00500DF34A1 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CCA4B6091F1FC00500DF34A1; - remoteInfo = TestProject; - }; - CCA71FED1F225E4C00F772C1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CCA4B6021F1FC00500DF34A1 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CCA71FE71F225E4C00F772C1; - remoteInfo = MyFramework; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CCA71FF01F225E4C00F772C1 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - CCA71FF11F225E4C00F772C1 /* MyFramework.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - CC2A0EBF1F33D50E00C324B9 /* TestProjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestProjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - CC2A0EC11F33D50E00C324B9 /* TestProjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProjectTests.swift; sourceTree = ""; }; - CC2A0EC31F33D50E00C324B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CC9393011F79483C00C1934A /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; - CC9393021F79483C00C1934A /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = config.xcconfig; sourceTree = ""; }; - CCA4B60A1F1FC00500DF34A1 /* TestProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; - CCA4B60D1F1FC00500DF34A1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - CCA4B60F1F1FC00500DF34A1 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - CCA4B6121F1FC00500DF34A1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - CCA4B6141F1FC00500DF34A1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - CCA4B6171F1FC00500DF34A1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - CCA4B6191F1FC00500DF34A1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CCA71FE81F225E4C00F772C1 /* MyFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MyFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CCA71FEA1F225E4C00F772C1 /* MyFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyFramework.h; sourceTree = ""; }; - CCA71FEB1F225E4C00F772C1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CCA720161F22A3C400F772C1 /* FrameworkFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrameworkFile.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - CC2A0EBC1F33D50E00C324B9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA4B6071F1FC00500DF34A1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CCA71FEF1F225E4C00F772C1 /* MyFramework.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA71FE41F225E4C00F772C1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - CC2A0EC01F33D50E00C324B9 /* TestProjectTests */ = { - isa = PBXGroup; - children = ( - CC2A0EC11F33D50E00C324B9 /* TestProjectTests.swift */, - CC2A0EC31F33D50E00C324B9 /* Info.plist */, - ); - path = TestProjectTests; - sourceTree = ""; - }; - CC9393001F79483C00C1934A /* Configs */ = { - isa = PBXGroup; - children = ( - CC9393011F79483C00C1934A /* base.xcconfig */, - CC9393021F79483C00C1934A /* config.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - CCA4B6011F1FC00500DF34A1 = { - isa = PBXGroup; - children = ( - CC9393001F79483C00C1934A /* Configs */, - CCA4B60C1F1FC00500DF34A1 /* TestProject */, - CCA71FE91F225E4C00F772C1 /* MyFramework */, - CC2A0EC01F33D50E00C324B9 /* TestProjectTests */, - CCA4B60B1F1FC00500DF34A1 /* Products */, - ); - sourceTree = ""; - }; - CCA4B60B1F1FC00500DF34A1 /* Products */ = { - isa = PBXGroup; - children = ( - CCA4B60A1F1FC00500DF34A1 /* TestProject.app */, - CCA71FE81F225E4C00F772C1 /* MyFramework.framework */, - CC2A0EBF1F33D50E00C324B9 /* TestProjectTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - CCA4B60C1F1FC00500DF34A1 /* TestProject */ = { - isa = PBXGroup; - children = ( - CCA4B60D1F1FC00500DF34A1 /* AppDelegate.swift */, - CCA4B60F1F1FC00500DF34A1 /* ViewController.swift */, - CCA4B6111F1FC00500DF34A1 /* Main.storyboard */, - CCA4B6141F1FC00500DF34A1 /* Assets.xcassets */, - CCA4B6161F1FC00500DF34A1 /* LaunchScreen.storyboard */, - CCA4B6191F1FC00500DF34A1 /* Info.plist */, - ); - path = TestProject; - sourceTree = ""; - }; - CCA71FE91F225E4C00F772C1 /* MyFramework */ = { - isa = PBXGroup; - children = ( - CCA720161F22A3C400F772C1 /* FrameworkFile.swift */, - CCA71FEA1F225E4C00F772C1 /* MyFramework.h */, - CCA71FEB1F225E4C00F772C1 /* Info.plist */, - ); - path = MyFramework; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - CCA71FE51F225E4C00F772C1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - CCA71FEC1F225E4C00F772C1 /* MyFramework.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - CC2A0EBE1F33D50E00C324B9 /* TestProjectTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = CC2A0EC81F33D50E00C324B9 /* Build configuration list for PBXNativeTarget "TestProjectTests" */; - buildPhases = ( - CC2A0EBB1F33D50E00C324B9 /* Sources */, - CC2A0EBC1F33D50E00C324B9 /* Frameworks */, - CC2A0EBD1F33D50E00C324B9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - CC2A0EC51F33D50E00C324B9 /* PBXTargetDependency */, - ); - name = TestProjectTests; - productName = TestProjectTests; - productReference = CC2A0EBF1F33D50E00C324B9 /* TestProjectTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - CCA4B6091F1FC00500DF34A1 /* TestProject */ = { - isa = PBXNativeTarget; - buildConfigurationList = CCA4B61C1F1FC00500DF34A1 /* Build configuration list for PBXNativeTarget "TestProject" */; - buildPhases = ( - CCA4B6061F1FC00500DF34A1 /* Sources */, - CCA4B6071F1FC00500DF34A1 /* Frameworks */, - CCA4B6081F1FC00500DF34A1 /* Resources */, - CCA71FF01F225E4C00F772C1 /* Embed Frameworks */, - CC2DB89A1F30E29600B4B0FA /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - CCA71FEE1F225E4C00F772C1 /* PBXTargetDependency */, - ); - name = TestProject; - productName = TestProject; - productReference = CCA4B60A1F1FC00500DF34A1 /* TestProject.app */; - productType = "com.apple.product-type.application"; - }; - CCA71FE71F225E4C00F772C1 /* MyFramework */ = { - isa = PBXNativeTarget; - buildConfigurationList = CCA71FF41F225E4C00F772C1 /* Build configuration list for PBXNativeTarget "MyFramework" */; - buildPhases = ( - CCA71FE31F225E4C00F772C1 /* Sources */, - CCA71FE41F225E4C00F772C1 /* Frameworks */, - CCA71FE51F225E4C00F772C1 /* Headers */, - CCA71FE61F225E4C00F772C1 /* Resources */, - CC2DB89B1F30E2AC00B4B0FA /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MyFramework; - productName = MyFramework; - productReference = CCA71FE81F225E4C00F772C1 /* MyFramework.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - CCA4B6021F1FC00500DF34A1 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; - ORGANIZATIONNAME = "Yonas Kolb"; - TargetAttributes = { - CC2A0EBE1F33D50E00C324B9 = { - CreatedOnToolsVersion = 8.3.3; - DevelopmentTeam = U7E5MQU624; - ProvisioningStyle = Automatic; - TestTargetID = CCA4B6091F1FC00500DF34A1; - }; - CCA4B6091F1FC00500DF34A1 = { - CreatedOnToolsVersion = 8.3.3; - DevelopmentTeam = U7E5MQU624; - ProvisioningStyle = Automatic; - }; - CCA71FE71F225E4C00F772C1 = { - CreatedOnToolsVersion = 8.3.3; - DevelopmentTeam = U7E5MQU624; - LastSwiftMigration = 0830; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = CCA4B6051F1FC00500DF34A1 /* Build configuration list for PBXProject "TestProject" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = CCA4B6011F1FC00500DF34A1; - productRefGroup = CCA4B60B1F1FC00500DF34A1 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - CCA4B6091F1FC00500DF34A1 /* TestProject */, - CCA71FE71F225E4C00F772C1 /* MyFramework */, - CC2A0EBE1F33D50E00C324B9 /* TestProjectTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - CC2A0EBD1F33D50E00C324B9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA4B6081F1FC00500DF34A1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCA4B6181F1FC00500DF34A1 /* LaunchScreen.storyboard in Resources */, - CCA4B6151F1FC00500DF34A1 /* Assets.xcassets in Resources */, - CCA4B6131F1FC00500DF34A1 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA71FE61F225E4C00F772C1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - CC2DB89A1F30E29600B4B0FA /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; - }; - CC2DB89B1F30E2AC00B4B0FA /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - CC2A0EBB1F33D50E00C324B9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CC2A0EC21F33D50E00C324B9 /* TestProjectTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA4B6061F1FC00500DF34A1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCA4B6101F1FC00500DF34A1 /* ViewController.swift in Sources */, - CCA4B60E1F1FC00500DF34A1 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCA71FE31F225E4C00F772C1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCA720171F22A3C400F772C1 /* FrameworkFile.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - CC2A0EC51F33D50E00C324B9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CCA4B6091F1FC00500DF34A1 /* TestProject */; - targetProxy = CC2A0EC41F33D50E00C324B9 /* PBXContainerItemProxy */; - }; - CCA71FEE1F225E4C00F772C1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CCA71FE71F225E4C00F772C1 /* MyFramework */; - targetProxy = CCA71FED1F225E4C00F772C1 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - CCA4B6111F1FC00500DF34A1 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - CCA4B6121F1FC00500DF34A1 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - CCA4B6161F1FC00500DF34A1 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - CCA4B6171F1FC00500DF34A1 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - CC2A0EC61F33D50E00C324B9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = U7E5MQU624; - INFOPLIST_FILE = TestProjectTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.TestProjectTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; - }; - name = Debug; - }; - CC2A0EC71F33D50E00C324B9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = U7E5MQU624; - INFOPLIST_FILE = TestProjectTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.TestProjectTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject"; - }; - name = Release; - }; - CCA4B61A1F1FC00500DF34A1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - CCA4B61B1F1FC00500DF34A1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - CCA4B61D1F1FC00500DF34A1 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CC9393021F79483C00C1934A /* config.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = U7E5MQU624; - INFOPLIST_FILE = TestProject/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.TestProject; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - CCA4B61E1F1FC00500DF34A1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = U7E5MQU624; - INFOPLIST_FILE = TestProject/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.TestProject; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - CCA71FF21F225E4C00F772C1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = U7E5MQU624; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = MyFramework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.MyFramework; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - CCA71FF31F225E4C00F772C1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = U7E5MQU624; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = MyFramework/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yonaskolb.MyFramework; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - CC2A0EC81F33D50E00C324B9 /* Build configuration list for PBXNativeTarget "TestProjectTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CC2A0EC61F33D50E00C324B9 /* Debug */, - CC2A0EC71F33D50E00C324B9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CCA4B6051F1FC00500DF34A1 /* Build configuration list for PBXProject "TestProject" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCA4B61A1F1FC00500DF34A1 /* Debug */, - CCA4B61B1F1FC00500DF34A1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CCA4B61C1F1FC00500DF34A1 /* Build configuration list for PBXNativeTarget "TestProject" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCA4B61D1F1FC00500DF34A1 /* Debug */, - CCA4B61E1F1FC00500DF34A1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CCA71FF41F225E4C00F772C1 /* Build configuration list for PBXNativeTarget "MyFramework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCA71FF21F225E4C00F772C1 /* Debug */, - CCA71FF31F225E4C00F772C1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = CCA4B6021F1FC00500DF34A1 /* Project object */; -} diff --git a/Fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 2bf8bd93..00000000 --- a/Fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Fixtures/TestProject/environment_test.yml b/Fixtures/TestProject/environment_test.yml deleted file mode 100644 index b9e69021..00000000 --- a/Fixtures/TestProject/environment_test.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: EnvironmentTest -settingGroups: - app: - PRODUCT_BUNDLE_IDENTIFIER: com.app$(BUNDLE_ID_SUFFIX)$(BUNDLE_ID_EXTENSION_SUFFIX) - test: - BUNDLE_ID_SUFFIX: .test - staging: - BUNDLE_ID_SUFFIX: .staging -settings: - configs: - Test Debug: -configs: - Test Debug: - type: debug - Staging Debug: - type: debug - Production Debug: - type: debug - Test Release: - type: release - Staging Release: - type: release - Production Release: - type: release diff --git a/Fixtures/TestProject/environments.yml b/Fixtures/TestProject/environments.yml new file mode 100644 index 00000000..d7d4adc3 --- /dev/null +++ b/Fixtures/TestProject/environments.yml @@ -0,0 +1,13 @@ +settings: + configs: + Test: + BUNDLE_ID_SUFFIX: .test + Staging: + BUNDLE_ID_SUFFIX: .staging +configs: + Test Debug: debug + Staging Debug: debug + Production Debug: debug + Test Release: release + Staging Release: release + Production Release: release diff --git a/Fixtures/TestProject/scripts/script.sh b/Fixtures/TestProject/scripts/script.sh new file mode 100644 index 00000000..56e67172 --- /dev/null +++ b/Fixtures/TestProject/scripts/script.sh @@ -0,0 +1 @@ +echo "You ran a script" diff --git a/Fixtures/TestProject/scripts/swiftlint.sh b/Fixtures/TestProject/scripts/swiftlint.sh deleted file mode 100644 index ee2d2178..00000000 --- a/Fixtures/TestProject/scripts/swiftlint.sh +++ /dev/null @@ -1,5 +0,0 @@ -if which swiftlint >/dev/null; then - swiftlint -else - echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" -fi diff --git a/Fixtures/TestProject/spec.yml b/Fixtures/TestProject/spec.yml index 05680d63..159e36df 100644 --- a/Fixtures/TestProject/spec.yml +++ b/Fixtures/TestProject/spec.yml @@ -1,49 +1,47 @@ -name: GeneratedProject +name: Project +include: [environments.yml] options: - bundleIdPrefix: com.test + bundleIdPrefix: com.project fileGroups: - Configs +configFiles: + Test Debug: Configs/config.xcconfig targets: - TestProject: + App_iOS: type: application platform: iOS - sources: TestProject + sources: App_iOS settings: - INFOPLIST_FILE: TestProject/Info.plist + PRODUCT_BUNDLE_IDENTIFIER: com.project$(BUNDLE_ID_SUFFIX) + INFOPLIST_FILE: App_iOS/Info.plist dependencies: - - target: MyFramework - - carthage: Result + - target: Framework_iOS + - carthage: Alamofire scheme: testTargets: - - TestProjectTests + - App_iOS_Tests postbuildScripts: - path: scripts/strip-frameworks.sh name: Strip Unused Architectures from Frameworks runOnlyWhenInstalling: true - - name: Swiftlint + - name: MyScript script: | - if which swiftlint >/dev/null; then - swiftlint - else - echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" - fi - configFiles: - Debug: Configs/config.xcconfig - MyFramework: + echo "You ran a script!" + Framework: type: framework - platform: iOS - sources: MyFramework - settings: - INFOPLIST_FILE: MyFramework/Info.plist + platform: [iOS, tvOS, watchOS, macOS] + sources: Framework postbuildScripts: - - name: Swiftlint - path: scripts/swiftlint.sh - TestProjectTests: + - name: MyScript + path: scripts/script.sh + dependencies: + - carthage: Alamofire + App_iOS_Tests: type: bundle.unit-test platform: iOS - sources: TestProjectTests + sources: App_iOS_Tests settings: TEST_HOST: $(BUILT_PRODUCTS_DIR)/TestProject.app/TestProject INFOPLIST_FILE: TestProjectTests/Info.plist dependencies: - - target: TestProject + - target: App_iOS diff --git a/Tests/XcodeGenKitTests/FixtureTests.swift b/Tests/XcodeGenKitTests/FixtureTests.swift index 7697741c..607eb262 100644 --- a/Tests/XcodeGenKitTests/FixtureTests.swift +++ b/Tests/XcodeGenKitTests/FixtureTests.swift @@ -27,7 +27,7 @@ func fixtureTests() { var project: XcodeProj? $0.it("generates") { - project = try generate(specPath: fixturePath + "TestProject/spec.yml", projectPath: fixturePath + "TestProject/GeneratedProject.xcodeproj") + project = try generate(specPath: fixturePath + "TestProject/spec.yml", projectPath: fixturePath + "TestProject/Project.xcodeproj") } $0.it("generates variant group") { From dd0667680db3f2b185369967798b11a861a168ab Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Mon, 30 Oct 2017 14:18:26 +0100 Subject: [PATCH 07/23] Update CHANGELOG.md --- CHANGELOG.md | 65 ++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 392bf649..94288556 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,12 @@ ## 1.3.0 -### Added +#### Added - generate output files for Carthage copy-frameworks script [#84](https://github.com/yonaskolb/XcodeGen/pull/84) @mironal - added options.settingPreset to choose which setting presets get applied [#100](https://github.com/yonaskolb/XcodeGen/pull/101) @yonaskolb - added `link` option for target dependencies [#109](https://github.com/yonaskolb/XcodeGen/pull/109) @keith -### Changed +#### Changed - updated to xcproj 0.4.1 [#85](https://github.com/yonaskolb/XcodeGen/pull/85) @enmiller - don't copy base settings if config type has been left out [#100](https://github.com/yonaskolb/XcodeGen/pull/100) @yonaskolb - generate localised files under a single variant group [#70](https://github.com/yonaskolb/XcodeGen/pull/70) @ryohey @@ -17,7 +17,7 @@ - config references in settings can now be partially matched and are case insensitive [#111](https://github.com/yonaskolb/XcodeGen/pull/111) @yonaskolb - other small internal changes @yonaskolb -### Fixed +#### Fixed - embed Carthage frameworks for macOS [#82](https://github.com/yonaskolb/XcodeGen/pull/82) @toshi0383 - fixed copying of watchOS app resources [#96](https://github.com/yonaskolb/XcodeGen/pull/96) @keith - automatically ignore more file types for a target's sources (entitlements, gpx, apns) [#94](https://github.com/yonaskolb/XcodeGen/pull/94) @keith @@ -31,19 +31,19 @@ ## 1.2.4 -### Fixed +#### Fixed - setting presets only apply `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: YES` to applications - don't add carthage dependency to `copy-frameworks` script if `embed: false` - sort group children on APFS -### Changed +#### Changed - update to xcproj 0.3.0 [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.2.3...1.2.4) ## 1.2.3 -### Fixed +#### Fixed - Fixed wrong carthage directory name reference for macOS [#74](https://github.com/yonaskolb/XcodeGen/pull/74) @toshi0383 - Removed unnecessary `carthage copy-frameworks` for macOS app target [#76](https://github.com/yonaskolb/XcodeGen/pull/76) @toshi0383 - Added some missing default settings for framework targets. `SKIP_INSTALL: YES` fixes archiving @@ -53,10 +53,10 @@ ## 1.2.2 -### Added +#### Added - automatically set `TEST_TARGET_NAME` on UI test targets if one of the dependencies is an application target -### Fixed +#### Fixed - set `DYLIB_INSTALL_NAME_BASE` to `@rpath` in framework target presets - fixed tvOS launch screen setting. `ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME` is now `LaunchImage` not `tvOS LaunchImage` @@ -65,7 +65,7 @@ ## 1.2.0 -### Added +#### Added - `include` now supports a single string as well as a list - add support setting xcconfig files on a project with `configFiles` [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) - add `fileGroups` to project spec for adding groups of files that aren't target source files [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) @@ -74,7 +74,7 @@ - add `:REPLACE` syntax when merging `include` [PR#68](https://github.com/yonaskolb/XcodeGen/pull/68) - add `mint` installation support -### Fixed +#### Fixed - fixed homebrew installation - fixed target xcconfig files not working via `configFiles` [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) - look for `INFOPLIST_FILE` setting in project and xcconfig files before adding it automatically. It was just looking in target settings before [PR#64](https://github.com/yonaskolb/XcodeGen/pull/64) @@ -84,13 +84,13 @@ ## 1.1.0 -### Changed +#### Changed - set project version to Xcode 9 - `LastUpgradeVersion` attribute to `0900` - set default Swift version to 4.0 - `SWIFT_VERSION` build setting to `4.0` [Commits](https://github.com/yonaskolb/XcodeGen/compare/1.0.1...1.1.0) -## 1.0.1 +### 1.0.1 ### Fixed - fixed incorrect default build script shell path @@ -100,15 +100,15 @@ ## 1.0.0 -### Added +#### Added - Swift 4 support [PR#52](https://github.com/yonaskolb/XcodeGen/pull/52) - Support for C and C++ files [PR#48](https://github.com/yonaskolb/XcodeGen/pull/48) by @antoniocasero - Xcode 9 default settings -### Fixed +#### Fixed - fixed empty string in YAML not being parsed properly [PR#50](https://github.com/yonaskolb/XcodeGen/pull/50) by @antoniocasero -### Changed +#### Changed - updated to xcodeproj 0.1.2 [PR#56](https://github.com/yonaskolb/XcodeGen/pull/56) - **BREAKING**: changed target definitions from list to map [PR#54](https://github.com/yonaskolb/XcodeGen/pull/54) See [Project Spec](docs/ProjectSpec.md) @@ -117,10 +117,10 @@ ## 0.6.1 -### Added +#### Added - Ability to set PBXProject attributes [PR#45](https://github.com/yonaskolb/XcodeGen/pull/45) -### Changed +#### Changed - Don't bother linking target frameworks for target dependencies. - Move code signing default settings from all iOS targets to iOS application targets, via Product + Platform setting preset files [PR#46](https://github.com/yonaskolb/XcodeGen/pull/46) @@ -128,10 +128,10 @@ ## 0.6.0 -### Added +#### Added - Allow a project spec to include other project specs [PR#44](https://github.com/yonaskolb/XcodeGen/pull/44) -### Changed +#### Changed - Changed default spec path to `project.yml` - Changed default project directory to the current directory instead of the spec file's directory @@ -139,7 +139,7 @@ ## 0.5.1 -### Fixed +#### Fixed - Fix embedded framework dependencies - Add `CODE_SIGN_IDENTITY[sdk=iphoneos*]` back to iOS targets - Fix build scripts with "" generating invalid projects [PR#43](https://github.com/yonaskolb/XcodeGen/pull/43) @@ -147,60 +147,61 @@ [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.5.0...0.5.1) ## 0.5.0 -### Added +#### Added - Added multi platform targets [PR#35](https://github.com/yonaskolb/XcodeGen/pull/35) - Automatically generate platform specific `FRAMEWORK_SEARCH_PATHS` for Carthage dependencies [PR#38](https://github.com/yonaskolb/XcodeGen/pull/38) - Automatically find Info.plist and set `INFOPLIST_FILE` build setting if it doesn't exist on a target [PR#40](https://github.com/yonaskolb/XcodeGen/pull/40) - Add options for controlling embedding of dependencies [PR#37](https://github.com/yonaskolb/XcodeGen/pull/37) -### Fixed +#### Fixed - Fixed localized files not being added to a target's resources -### Changed +#### Changed - Renamed Setting Presets to Setting Groups - Carthage group is now created under top level Frameworks group [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.4.0...0.5.0) ## 0.4.0 -### Added + +##### Added - Homebrew support [PR#16](https://github.com/yonaskolb/XcodeGen/pull/16) by @pepibumur - Added `runOnlyWhenInstalling` to build scripts [PR#32](https://github.com/yonaskolb/XcodeGen/pull/32) - Added `carthageBuildPath` option [PR#34](https://github.com/yonaskolb/XcodeGen/pull/34) -### Fixed +#### Fixed - Fixed installations of XcodeGen not applying build setting presets for configs, products, and platforms, due to missing resources -### Changed +#### Changed - Upgraded to https://github.com/swift-xcode/xcodeproj 0.1.1 [PR#33](https://github.com/yonaskolb/XcodeGen/pull/33) [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.3.0...0.4.0) ## 0.3.0 - Extensions and Scheme Tests -### Added +#### Added - Support for app extension dependencies, using the same `target: MyExtension` syntax [PR#19](https://github.com/yonaskolb/XcodeGen/pull/19) - Added test targets to generated target schemes via `Target.scheme.testTargets` [PR#21](https://github.com/yonaskolb/XcodeGen/pull/21) -### Changed +#### Changed - Updated xcodeproj to 0.0.9 -### Fixed +#### Fixed - Fixed watch and messages apps not copying carthage dependencies -### Breaking changes +#### Breaking changes - Changed `Target.generatedSchemes` to `Target.scheme.configVariants` [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.2...0.3.0) ## 0.2.0 - Build scripts -### Added +#### Added - Added Target build scripts with `Target.prebuildScripts` and `Target.postbuildScripts` [PR#17](https://github.com/yonaskolb/XcodeGen/pull/17) - Support for absolute paths in target sources, run script files, and config files - Add validation for incorrect `Target.configFiles` -### Fixed +#### Fixed - Fixed some project objects sometimes having duplicate ids [Commits](https://github.com/yonaskolb/XcodeGen/compare/0.1...0.2) From 698d8d85b4bb66b1573811086e4eac1742f12435 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Tue, 31 Oct 2017 15:46:47 +0100 Subject: [PATCH 08/23] change target source from String to Source struct --- Sources/ProjectSpec/Source.swift | 47 +++++++++++++++++++ Sources/ProjectSpec/SpecValidation.swift | 2 +- Sources/ProjectSpec/Target.swift | 18 +++++-- Tests/XcodeGenKitTests/SpecLoadingTests.swift | 16 +++++++ 4 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 Sources/ProjectSpec/Source.swift diff --git a/Sources/ProjectSpec/Source.swift b/Sources/ProjectSpec/Source.swift new file mode 100644 index 00000000..bba90497 --- /dev/null +++ b/Sources/ProjectSpec/Source.swift @@ -0,0 +1,47 @@ +// +// Source.swift +// ProjectSpec +// +// Created by Yonas Kolb on 31/10/17. +// + +import Foundation +import JSONUtilities + +public struct Source { + + public var path: String + + public init(path: String) { + self.path = path + } +} + +extension Source: ExpressibleByStringLiteral { + + public init(stringLiteral value: String) { + self = Source(path: value) + } + + public init(extendedGraphemeClusterLiteral value: String) { + self = Source(path: value) + } + + public init(unicodeScalarLiteral value: String) { + self = Source(path: value) + } +} + +extension Source: JSONObjectConvertible { + + public init(jsonDictionary: JSONDictionary) throws { + path = try jsonDictionary.json(atKeyPath: "path") + } +} + +extension Source: Equatable { + + public static func == (lhs: Source, rhs: Source) -> Bool { + return lhs.path == rhs.path + } +} diff --git a/Sources/ProjectSpec/SpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift index caa79e6a..b509bccc 100644 --- a/Sources/ProjectSpec/SpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -69,7 +69,7 @@ extension ProjectSpec { } for source in target.sources { - let sourcePath = basePath + source + let sourcePath = basePath + source.path if !sourcePath.exists { errors.append(.invalidTargetSource(target: target.name, source: sourcePath.string)) } diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index e9943aa0..91402091 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -15,7 +15,7 @@ public struct Target { public var type: PBXProductType public var platform: Platform public var settings: Settings - public var sources: [String] + public var sources: [Source] public var dependencies: [Dependency] public var prebuildScripts: [BuildScript] public var postbuildScripts: [BuildScript] @@ -30,7 +30,7 @@ public struct Target { return name } - public init(name: String, type: PBXProductType, platform: Platform, settings: Settings = .empty, configFiles: [String: String] = [:], sources: [String] = [], dependencies: [Dependency] = [], prebuildScripts: [BuildScript] = [], postbuildScripts: [BuildScript] = [], scheme: TargetScheme? = nil) { + public init(name: String, type: PBXProductType, platform: Platform, settings: Settings = .empty, configFiles: [String: String] = [:], sources: [Source] = [], dependencies: [Dependency] = [], prebuildScripts: [BuildScript] = [], postbuildScripts: [BuildScript] = [], scheme: TargetScheme? = nil) { self.name = name self.type = type self.platform = platform @@ -179,9 +179,19 @@ extension Target: NamedJSONDictionaryConvertible { settings = jsonDictionary.json(atKeyPath: "settings") ?? .empty configFiles = jsonDictionary.json(atKeyPath: "configFiles") ?? [:] if let source: String = jsonDictionary.json(atKeyPath: "sources") { - sources = [source] + sources = [Source(path: source)] + } else if let array = jsonDictionary["sources"] as? [Any] { + sources = try array.flatMap { source in + if let string = source as? String { + return Source(path: string) + } else if let dictionary = source as? [String: Any] { + return try Source(jsonDictionary: dictionary) + } else { + return nil + } + } } else { - sources = jsonDictionary.json(atKeyPath: "sources") ?? [] + sources = [] } if jsonDictionary["dependencies"] == nil { dependencies = [] diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index b6a39a41..d4103c5f 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -68,6 +68,22 @@ func specLoadingTests() { try expectTargetError(target, .invalidDependency([invalid: "name"])) } + $0.it("parses sources") { + var targetDictionary1 = validTarget + targetDictionary1["sources"] = [ + "source1", + ["path": "source2"], + ] + var targetDictionary2 = validTarget + targetDictionary2["sources"] = "source3" + + let target1 = try Target(name: "test", jsonDictionary: targetDictionary1) + let target2 = try Target(name: "test", jsonDictionary: targetDictionary2) + + try expect(target1.sources) == [Source(path: "source1"), Source(path: "source2")] + try expect(target2.sources) == [Source(path: "source3")] + } + $0.it("parses target dependencies") { var targetDictionary = validTarget targetDictionary["dependencies"] = [ From cda8931e3074a3a5d5071b4cf25088b3c8881a03 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Tue, 31 Oct 2017 15:46:47 +0100 Subject: [PATCH 09/23] refactor source generating --- Sources/XcodeGenKit/PBXProjGenerator.swift | 41 +++++++++++++--------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 0d4b72ac..0a7cef1d 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -65,7 +65,8 @@ public class PBXProjGenerator { project = PBXProj(objectVersion: 46, rootObject: generateUUID(PBXProject.self, spec.name)) for group in spec.fileGroups { - _ = try getGroups(path: spec.basePath + group) + //TODO: call a seperate function that only creates groups not source files + _ = try getSourceFiles(path: spec.basePath + group) } let buildConfigs: [XCBuildConfiguration] = spec.configs.map { config in @@ -157,17 +158,20 @@ public class PBXProjGenerator { let carthageDependencies = getAllCarthageDependencies(target: target) - let sourcePaths = target.sources.map { spec.basePath + $0 } - var sourceFiles: [SourceFile] = [] + let sourceFiles = try target.sources.flatMap(getSourceFiles) - for source in sourcePaths { - let sourceGroups = try getGroups(path: source) - sourceFiles += sourceGroups.sourceFiles - } - - // find all Info.plist - let infoPlists: [Path] = sourcePaths.reduce([]) { - $0 + ((try? $1.recursiveChildren()) ?? []).filter { $0.lastComponent == "Info.plist" } + // find all Info.plist files + let infoPlists: [Path] = target.sources.map { spec.basePath + $0.path }.flatMap { (path) -> [Path] in + if path.isFile { + if path.lastComponent == "Info.plist" { + return [path] + } + } else { + if let children = try? path.recursiveChildren() { + return children.filter { $0.lastComponent == "Info.plist" } + } + } + return [] } let configs: [XCBuildConfiguration] = spec.configs.map { config in @@ -406,8 +410,8 @@ public class PBXProjGenerator { } let carthageFrameworksToEmbed = Array(Set(carthageDependencies - .filter { $0.embed ?? true } - .map { $0.reference })) + .filter { $0.embed ?? true } + .map { $0.reference })) .sorted() if !carthageFrameworksToEmbed.isEmpty { @@ -485,7 +489,12 @@ public class PBXProjGenerator { } } - func getGroups(path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { + func getSourceFiles(source: Source) throws -> [SourceFile] { + //TODO: add support for source files as well as directories + return try getSourceFiles(path: spec.basePath + source.path, depth: 0).sourceFiles + } + + func getSourceFiles(path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { let excludedFiles: [String] = [".DS_Store"] @@ -507,14 +516,14 @@ public class PBXProjGenerator { var groups: [PBXGroup] = [] for path in directories { - let subGroups = try getGroups(path: path, depth: depth + 1) + let subGroups = try getSourceFiles(path: path, depth: depth + 1) allSourceFiles += subGroups.sourceFiles groupChildren.append(subGroups.groups.first!.reference) groups += subGroups.groups } // create variant groups of the base localisation first - var baseLocalisationVariantGroups:[PBXVariantGroup] = [] + var baseLocalisationVariantGroups: [PBXVariantGroup] = [] if let baseLocalisedDirectory = localisedDirectories.first(where: { $0.lastComponent == "Base.lproj" }) { for path in try baseLocalisedDirectory.children() { let filePath = "\(baseLocalisedDirectory.lastComponent)/\(path.lastComponent)" From f67609f97eb8c63b397096e07732f92dc58430b9 Mon Sep 17 00:00:00 2001 From: ryohey Date: Wed, 1 Nov 2017 00:55:04 +0900 Subject: [PATCH 10/23] Don't add unnecessary headers build phase --- .../TestProject/Project.xcodeproj/project.pbxproj | 14 -------------- Sources/XcodeGenKit/PBXProjGenerator.swift | 8 +++++--- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 08d74392..17276455 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -295,18 +295,6 @@ BF3515549503 /* MyFramework.h in Headers */, ); }; - HBP783122801 /* Frameworks */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; - HBP825232101 /* Frameworks */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -388,7 +376,6 @@ buildPhases = ( SBP783122801 /* Sources */, RBP783122801 /* Resources */, - HBP783122801 /* Headers */, ); buildRules = ( ); @@ -405,7 +392,6 @@ buildPhases = ( SBP825232101 /* Sources */, RBP825232101 /* Resources */, - HBP825232101 /* Headers */, FBP825232101 /* Frameworks */, CFBP64939301 /* CopyFiles */, SSBP81062201 /* Carthage */, diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 0d4b72ac..e3582a0f 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -354,9 +354,11 @@ public class PBXProjGenerator { addObject(resourcesBuildPhase) buildPhases.append(resourcesBuildPhase.reference) - let headersBuildPhase = PBXHeadersBuildPhase(reference: generateUUID(PBXHeadersBuildPhase.self, target.name), files: getBuildFilesForPhase(.headers)) - addObject(headersBuildPhase) - buildPhases.append(headersBuildPhase.reference) + if target.type == .framework || target.type == .dynamicLibrary { + let headersBuildPhase = PBXHeadersBuildPhase(reference: generateUUID(PBXHeadersBuildPhase.self, target.name), files: getBuildFilesForPhase(.headers)) + addObject(headersBuildPhase) + buildPhases.append(headersBuildPhase.reference) + } if !targetFrameworkBuildFiles.isEmpty { From 4a54fe6d2a37c51726ba753ae4d50becc5e6b997 Mon Sep 17 00:00:00 2001 From: Brandon Kase Date: Tue, 31 Oct 2017 22:01:55 -0700 Subject: [PATCH 11/23] Support file sources The `sources` key of the project spec only supported directories and not files. Now it supports both! This commit introduces a `getSourceFiles` overload that doesn't explicitly invoke `path.children()`, but instead accepts `children` as a parameter. This allows us to invoke the `children` overload of getSourceFiles with just the files we want to include (determined by specifying the sources). Now for sourcePaths that are files, we group by parents before invoking getSourceFiles in order to reuse the same groups. --- .../TestProject/App_iOS/AppDelegate.swift | 2 + .../Project.xcodeproj/project.pbxproj | 13 +++++++ .../StandaloneFiles/Standalone.swift | 3 ++ Fixtures/TestProject/spec.yml | 4 +- Sources/XcodeGenKit/PBXProjGenerator.swift | 39 +++++++++++++------ 5 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 Fixtures/TestProject/StandaloneFiles/Standalone.swift diff --git a/Fixtures/TestProject/App_iOS/AppDelegate.swift b/Fixtures/TestProject/App_iOS/AppDelegate.swift index bc2428a6..b32ceaee 100644 --- a/Fixtures/TestProject/App_iOS/AppDelegate.swift +++ b/Fixtures/TestProject/App_iOS/AppDelegate.swift @@ -18,6 +18,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. _ = FrameworkStruct() + // Standalone files added to project by path-to-file. + _ = standaloneHello() return true } diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 17276455..3af1b493 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; }; BF1401236301 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072501 /* Alamofire.framework */; }; + BF1628293501 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR2554453101 /* Standalone.swift */; }; BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; }; BF2018435801 /* Framework_iOS.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF2250910101 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2043127501 /* Main.storyboard */; }; @@ -70,6 +71,7 @@ FR1345298502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FR1345298503 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FR1473702401 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FR2554453101 /* Standalone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Standalone.swift; sourceTree = ""; }; FR3032072501 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3032072502 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3032072503 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; @@ -195,6 +197,15 @@ path = tvOS; sourceTree = ""; }; + G66512504301 /* StandaloneFiles */ = { + isa = PBXGroup; + children = ( + FR2554453101 /* Standalone.swift */, + ); + name = StandaloneFiles; + path = StandaloneFiles; + sourceTree = ""; + }; G67871650901 /* watchOS */ = { isa = PBXGroup; children = ( @@ -243,6 +254,7 @@ isa = PBXGroup; children = ( G83406189501 /* Configs */, + G66512504301 /* StandaloneFiles */, G82523211001 /* App_iOS */, G78312289901 /* App_iOS_Tests */, G46615002701 /* Framework */, @@ -620,6 +632,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BF1628293501 /* Standalone.swift in Sources */, BF1073850101 /* AppDelegate.swift in Sources */, BF1744565901 /* ViewController.swift in Sources */, ); diff --git a/Fixtures/TestProject/StandaloneFiles/Standalone.swift b/Fixtures/TestProject/StandaloneFiles/Standalone.swift new file mode 100644 index 00000000..2062b15d --- /dev/null +++ b/Fixtures/TestProject/StandaloneFiles/Standalone.swift @@ -0,0 +1,3 @@ +func standaloneHello() -> String { + return "Hello" +} diff --git a/Fixtures/TestProject/spec.yml b/Fixtures/TestProject/spec.yml index 159e36df..9ad1ecad 100644 --- a/Fixtures/TestProject/spec.yml +++ b/Fixtures/TestProject/spec.yml @@ -10,7 +10,9 @@ targets: App_iOS: type: application platform: iOS - sources: App_iOS + sources: + - App_iOS + - StandaloneFiles/Standalone.swift settings: PRODUCT_BUNDLE_IDENTIFIER: com.project$(BUNDLE_ID_SUFFIX) INFOPLIST_FILE: App_iOS/Info.plist diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 62343187..b43a2bcd 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -66,7 +66,8 @@ public class PBXProjGenerator { for group in spec.fileGroups { //TODO: call a seperate function that only creates groups not source files - _ = try getSourceFiles(path: spec.basePath + group) + let path = spec.basePath + group + _ = try getSourceFiles(path: path, children: try path.children()) } let buildConfigs: [XCBuildConfiguration] = spec.configs.map { config in @@ -158,7 +159,7 @@ public class PBXProjGenerator { let carthageDependencies = getAllCarthageDependencies(target: target) - let sourceFiles = try target.sources.flatMap(getSourceFiles) + let sourceFiles = try getAllSourceFiles(sources: target.sources) // find all Info.plist files let infoPlists: [Path] = target.sources.map { spec.basePath + $0.path }.flatMap { (path) -> [Path] in @@ -490,26 +491,42 @@ public class PBXProjGenerator { return fileReference.reference } } + + func getAllSourceFiles(sources: [Source]) throws -> [SourceFile] { + let sourcePaths = sources.map{ spec.basePath + $0.path } - func getSourceFiles(source: Source) throws -> [SourceFile] { - //TODO: add support for source files as well as directories - return try getSourceFiles(path: spec.basePath + source.path, depth: 0).sourceFiles + let (files, dirs) = (sourcePaths.filter{ $0.isFile }, sourcePaths.filter{ $0.isDirectory }) + let filesByParent: [Path: [Path]] = files.reduce([:]) { acc, file in + var mut = acc + let group = file.parent() + mut[group, default: []].append(file) + return mut + } + + let fromFiles = try filesByParent.map{ parent, files in + try getSourceFiles(path: parent, children: files) + } + let fromDirs = try dirs.map{ dir in + try getSourceFiles(path: dir, children: try dir.children()) + } + + return (fromFiles + fromDirs).flatMap{ $0.sourceFiles } } - - func getSourceFiles(path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { + + func getSourceFiles(path: Path, children: [Path], depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { let excludedFiles: [String] = [".DS_Store"] - let directories = try path.children() + let directories = children .filter { $0.isDirectory && $0.extension == nil && $0.extension != "lproj" } .sorted { $0.lastComponent < $1.lastComponent } - let filePaths = try path.children() + let filePaths = children .filter { $0.isFile || $0.extension != nil && $0.extension != "lproj" } .filter { !excludedFiles.contains($0.lastComponent) } .sorted { $0.lastComponent < $1.lastComponent } - let localisedDirectories = try path.children() + let localisedDirectories = children .filter { $0.extension == "lproj" } .sorted { $0.lastComponent < $1.lastComponent } @@ -518,7 +535,7 @@ public class PBXProjGenerator { var groups: [PBXGroup] = [] for path in directories { - let subGroups = try getSourceFiles(path: path, depth: depth + 1) + let subGroups = try getSourceFiles(path: path, children: try path.children(), depth: depth + 1) allSourceFiles += subGroups.sourceFiles groupChildren.append(subGroups.groups.first!.reference) groups += subGroups.groups From a27d65b7d05cd84fda43ee47d0a65bb98d9c5689 Mon Sep 17 00:00:00 2001 From: Eric Miller Date: Wed, 1 Nov 2017 17:35:31 -0500 Subject: [PATCH 12/23] Add .mm file as a source type --- Sources/XcodeGenKit/PBXProjGenerator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index b43a2bcd..ddedf34b 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -472,7 +472,7 @@ public class PBXProjGenerator { } if let fileExtension = path.extension { switch fileExtension { - case "swift", "m", "cpp": return .sources + case "swift", "m", "mm", "cpp": return .sources case "h", "hh", "hpp", "ipp", "tpp", "hxx", "def": return .headers case "xcconfig", "entitlements", "gpx", "lproj", "apns": return nil default: return .resources From e4d42cb6ebd77d38a758f77cef7034a458a87600 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Wed, 1 Nov 2017 20:51:41 +0100 Subject: [PATCH 13/23] getSources tweak --- Sources/XcodeGenKit/PBXProjGenerator.swift | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index ddedf34b..257d894d 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -66,8 +66,7 @@ public class PBXProjGenerator { for group in spec.fileGroups { //TODO: call a seperate function that only creates groups not source files - let path = spec.basePath + group - _ = try getSourceFiles(path: path, children: try path.children()) + _ = try getSources(path: spec.basePath + group) } let buildConfigs: [XCBuildConfiguration] = spec.configs.map { config in @@ -504,17 +503,17 @@ public class PBXProjGenerator { } let fromFiles = try filesByParent.map{ parent, files in - try getSourceFiles(path: parent, children: files) + try getSources(path: parent, children: files) } let fromDirs = try dirs.map{ dir in - try getSourceFiles(path: dir, children: try dir.children()) + try getSources(path: dir) } return (fromFiles + fromDirs).flatMap{ $0.sourceFiles } } - func getSourceFiles(path: Path, children: [Path], depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { - + func getSources(path: Path, children: [Path]? = nil, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { + let children = try children ?? (try path.children()) let excludedFiles: [String] = [".DS_Store"] let directories = children @@ -535,7 +534,7 @@ public class PBXProjGenerator { var groups: [PBXGroup] = [] for path in directories { - let subGroups = try getSourceFiles(path: path, children: try path.children(), depth: depth + 1) + let subGroups = try getSources(path: path, depth: depth + 1) allSourceFiles += subGroups.sourceFiles groupChildren.append(subGroups.groups.first!.reference) groups += subGroups.groups From b274ae6f63e8ce1309aa6e0c9e8405f6f87d79a7 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Wed, 1 Nov 2017 20:55:24 +0100 Subject: [PATCH 14/23] swiftformat --- Sources/XcodeGenKit/PBXProjGenerator.swift | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 257d894d..4992666a 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -65,7 +65,7 @@ public class PBXProjGenerator { project = PBXProj(objectVersion: 46, rootObject: generateUUID(PBXProject.self, spec.name)) for group in spec.fileGroups { - //TODO: call a seperate function that only creates groups not source files + // TODO: call a seperate function that only creates groups not source files _ = try getSources(path: spec.basePath + group) } @@ -490,28 +490,28 @@ public class PBXProjGenerator { return fileReference.reference } } - - func getAllSourceFiles(sources: [Source]) throws -> [SourceFile] { - let sourcePaths = sources.map{ spec.basePath + $0.path } - let (files, dirs) = (sourcePaths.filter{ $0.isFile }, sourcePaths.filter{ $0.isDirectory }) + func getAllSourceFiles(sources: [Source]) throws -> [SourceFile] { + let sourcePaths = sources.map { spec.basePath + $0.path } + + let (files, dirs) = (sourcePaths.filter { $0.isFile }, sourcePaths.filter { $0.isDirectory }) let filesByParent: [Path: [Path]] = files.reduce([:]) { acc, file in var mut = acc let group = file.parent() mut[group, default: []].append(file) return mut } - - let fromFiles = try filesByParent.map{ parent, files in + + let fromFiles = try filesByParent.map { parent, files in try getSources(path: parent, children: files) } - let fromDirs = try dirs.map{ dir in + let fromDirs = try dirs.map { dir in try getSources(path: dir) } - - return (fromFiles + fromDirs).flatMap{ $0.sourceFiles } + + return (fromFiles + fromDirs).flatMap { $0.sourceFiles } } - + func getSources(path: Path, children: [Path]? = nil, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { let children = try children ?? (try path.children()) let excludedFiles: [String] = [".DS_Store"] From e48045da9e6600df50f6291d02ea4cd78a7bdaa8 Mon Sep 17 00:00:00 2001 From: Brandon Kase Date: Wed, 25 Oct 2017 15:30:06 -0700 Subject: [PATCH 15/23] Optionally make intermediate filler groups This commit adds a new option `createIntermediateGroups` that defaults to false. When it is false, the behavior of XcodeGen is the same as before. When it is true, we make intermediate groups recursively until we reach the basePath. In practice that means if you've chosen `Platform/PINFoundation/Sources` as one of your sourcePaths, you get a top-level group of `Platform` and under that `PINFoundation` and under that `Sources`. This is instead of the default behavior of just making `Sources` a top-level group (which is confusing when your directory is called `Sources` for example). --- .../TestProject/NestedFiles/Foo/Nested.swift | 3 + .../Project.xcodeproj/project.pbxproj | 12 ++++ Sources/ProjectSpec/ProjectSpec.swift | 3 + Sources/XcodeGenKit/PBXProjGenerator.swift | 60 ++++++++++++++++--- docs/ProjectSpec.md | 1 + 5 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 Fixtures/TestProject/NestedFiles/Foo/Nested.swift diff --git a/Fixtures/TestProject/NestedFiles/Foo/Nested.swift b/Fixtures/TestProject/NestedFiles/Foo/Nested.swift new file mode 100644 index 00000000..b5c22056 --- /dev/null +++ b/Fixtures/TestProject/NestedFiles/Foo/Nested.swift @@ -0,0 +1,3 @@ +func nested() -> String { + return "Nested" +} diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 3af1b493..2a3c370c 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -165,6 +165,15 @@ FR7078510801 /* FrameworkFile.swift */, FR1345298503 /* Info.plist */, FR7740960501 /* MyFramework.h */, + FR7078510801 /* FrameworkFile.swift */, + FR1345298503 /* Info.plist */, + FR7740960501 /* MyFramework.h */, + FR7078510801 /* FrameworkFile.swift */, + FR1345298503 /* Info.plist */, + FR7740960501 /* MyFramework.h */, + FR7078510801 /* FrameworkFile.swift */, + FR1345298503 /* Info.plist */, + FR7740960501 /* MyFramework.h */, ); name = Framework; path = Framework; @@ -258,6 +267,9 @@ G82523211001 /* App_iOS */, G78312289901 /* App_iOS_Tests */, G46615002701 /* Framework */, + G46615002701 /* Framework */, + G46615002701 /* Framework */, + G46615002701 /* Framework */, G86202385201 /* Products */, G19527407101 /* Frameworks */, ); diff --git a/Sources/ProjectSpec/ProjectSpec.swift b/Sources/ProjectSpec/ProjectSpec.swift index 1cf01830..ad69f678 100644 --- a/Sources/ProjectSpec/ProjectSpec.swift +++ b/Sources/ProjectSpec/ProjectSpec.swift @@ -29,6 +29,7 @@ public struct ProjectSpec { public struct Options { public var carthageBuildPath: String? + public var createIntermediateGroups: Bool public var bundleIdPrefix: String? public var settingPresets: SettingPresets = .all @@ -54,6 +55,7 @@ public struct ProjectSpec { } public init() { + createIntermediateGroups = false } } @@ -160,5 +162,6 @@ extension ProjectSpec.Options: JSONObjectConvertible { carthageBuildPath = jsonDictionary.json(atKeyPath: "carthageBuildPath") bundleIdPrefix = jsonDictionary.json(atKeyPath: "bundleIdPrefix") settingPresets = jsonDictionary.json(atKeyPath: "settingPresets") ?? .all + createIntermediateGroups = jsonDictionary.json(atKeyPath: "createIntermediateGroups") ?? false } } diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4992666a..31b4bb01 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -512,6 +512,47 @@ public class PBXProjGenerator { return (fromFiles + fromDirs).flatMap { $0.sourceFiles } } + func getSingleGroup(path: Path, mergingChildren children: [String], depth: Int = 0) -> PBXGroup { + let group: PBXGroup + if let cachedGroup = groupsByPath[path] { + cachedGroup.children += children + group = cachedGroup + } else { + group = PBXGroup( + reference: generateUUID(PBXGroup.self, path.lastComponent), + children: children, + sourceTree: .group, + name: path.lastComponent, + path: depth == 0 && !spec.options.createIntermediateGroups ? + path.byRemovingBase(path: spec.basePath).string : + path.lastComponent + ) + addObject(group) + groupsByPath[path] = group + } + return group + } + + // Add groups for all parents recursively + // ex: path/foo/bar/baz/Hello.swift -> path:[foo:[bar:[baz:[Hello.swift]]]] + func getIntermediateGroups(path: Path, group: PBXGroup) -> PBXGroup { + // verify path is a subpath of spec.basePath + guard Path(components: zip(path.components, spec.basePath.components).map{ $0.0 }) == spec.basePath else { + return group + } + + // base case + if path == spec.basePath { + return group + } + + // recursive case + return getIntermediateGroups( + path: path.parent(), + group: getSingleGroup(path: path, mergingChildren: [group.reference]) + ) + } + func getSources(path: Path, children: [Path]? = nil, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { let children = try children ?? (try path.children()) let excludedFiles: [String] = [".DS_Store"] @@ -605,17 +646,18 @@ public class PBXProjGenerator { } } - let groupPath: String = depth == 0 ? path.byRemovingBase(path: spec.basePath).string : path.lastComponent let group: PBXGroup - if let cachedGroup = groupsByPath[path] { - group = cachedGroup + if spec.options.createIntermediateGroups { + group = getIntermediateGroups( + path: path.parent(), + group: getSingleGroup(path: path, mergingChildren: groupChildren, depth: depth) + ) } else { - group = PBXGroup(reference: generateUUID(PBXGroup.self, path.lastComponent), children: groupChildren, sourceTree: .group, name: path.lastComponent, path: groupPath) - addObject(group) - if depth == 0 { - topLevelGroups.append(group) - } - groupsByPath[path] = group + group = getSingleGroup(path: path, mergingChildren: groupChildren, depth: depth) + } + + if depth == 0 { + topLevelGroups.append(group) } groups.insert(group, at: 0) return (allSourceFiles, groups) diff --git a/docs/ProjectSpec.md b/docs/ProjectSpec.md index 05001f7a..46001d34 100644 --- a/docs/ProjectSpec.md +++ b/docs/ProjectSpec.md @@ -63,6 +63,7 @@ Note that target names can also be changed by adding a `name` property to a targ ### Options - ⚪️ **carthageBuildPath**: `String` - The path to the carthage build directory. Defaults to `Carthage/Build`. This is used when specifying target carthage dependencies +- ⚪️ **createIntermediateGroups**: `String` - If this is specified and set to `true`, then intermediate groups will be created for every path component between the folder containing the source and the base path. For example, when enabled if a source path is specified as `Vendor/Foo/Hello.swift`, the group `Vendor` will created as a parent of the `Foo` group. - ⚪️ **bundleIdPrefix**: `String` - If this is specified then any target that doesn't have an `PRODUCT_BUNDLE_IDENTIFIER` (via all levels of build settings) will get an autogenerated one by combining `bundleIdPrefix` and the target name: `bundleIdPrefix.name`. The target name will be stripped of all characters that aren't alphanumerics, hyphens, or periods. Underscores will be replace with hyphens. - ⚪️ **settingPresets**: `String` - This controls the settings that are automatically applied to the project and its targets. These are the same build settings that Xcode would add when creating a new project. Project settings are applied by config type. Target settings are applied by the product type and platform. By default this is set to `all` - `all`: project and target settings From 01e29e690e6eb2acd6d0bfc539d792989f5234de Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Thu, 2 Nov 2017 18:03:12 +0100 Subject: [PATCH 16/23] add source generator tests --- .../ProjectGeneratorTests.swift | 156 ++++++++++++++++++ Tests/XcodeGenKitTests/TestHelpers.swift | 2 +- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index 83dfd235..582d7498 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -3,6 +3,7 @@ import XcodeGenKit import xcproj import PathKit import ProjectSpec +import Yams func projectGeneratorTests() { @@ -12,6 +13,7 @@ func projectGeneratorTests() { } func getPbxProj(_ spec: ProjectSpec) throws -> PBXProj { + try spec.validate() return try getProject(spec).pbxproj } @@ -232,5 +234,159 @@ func projectGeneratorTests() { try expect(xcscheme.archiveAction?.buildConfiguration) == "Test Release" } } + + $0.describe("Sources") { + + let directoryPath = Path("TestDirectory") + + var target = Target(name: "Test", type: .application, platform: .iOS) + var spec = ProjectSpec(basePath: directoryPath, name: "Test", targets: [target]) + + func createDirectories(_ directories: String) throws { + + let yaml = try Yams.load(yaml: directories)! + + func getFiles(_ file: Any, path: Path) -> [Path] { + if let array = file as? [Any] { + return array.flatMap { getFiles($0, path: path) } + } else if let string = file as? String { + return [path + string] + } else if let dictionary = file as? [String: Any] { + var array: [Path] = [] + for (key, value) in dictionary { + array += getFiles(value, path: path + key) + } + return array + } else { + return [] + } + } + + let files = getFiles(yaml, path: directoryPath).filter { $0.extension != nil } + for file in files { + try file.parent().mkpath() + try file.write("") + } + } + + func removeDirectories() { + try? directoryPath.delete() + } + + $0.before { + removeDirectories() + } + + $0.after { + removeDirectories() + } + + $0.it("generates source groups") { + let directories = """ + Sources: + A: + - a.swift + - B: + - b.swift + """ + try createDirectories(directories) + + target.sources = ["Sources"] + spec.targets = [target] + + let project = try getPbxProj(spec) + try project.expectFile(paths: ["Sources", "A", "a.swift"], buildPhase: .sources) + try project.expectFile(paths: ["Sources", "A", "B", "b.swift"], buildPhase: .sources) + } + + $0.it("generates file sources") { + let directories = """ + Sources: + A: + - a.swift + - B: + - b.swift + - c.jpg + """ + try createDirectories(directories) + + target.sources = [ + "Sources/A/a.swift", + "Sources/A/B/b.swift", + "Sources/A/B/c.jpg", + ] + spec.targets = [target] + + let project = try getPbxProj(spec) + try project.expectFile(paths: ["Sources/A", "a.swift"], names: ["A", "a.swift"], buildPhase: .sources) + try project.expectFile(paths: ["Sources/A/B", "b.swift"], names: ["B", "b.swift"], buildPhase: .sources) + try project.expectFile(paths: ["Sources/A/B", "c.jpg"], names: ["B", "c.jpg"], buildPhase: .resources) + } + } + } +} + +extension PBXProj { + + /// expect a file within groups of the paths, using optional different names + func expectFile(paths: [String], names: [String]? = nil, buildPhase: BuildPhase? = nil) throws { + let names = names ?? paths + guard let fileReference = getFileReference(paths: paths, names: names) else { + throw failure("Could not find file at path \(paths.joined(separator: "/").quoted) and name \(paths.joined(separator: "/").quoted)") + } + + if let buildPhase = buildPhase { + guard let buildFile = buildFiles.first(where: { $0.fileRef == fileReference.reference}), + getBuildPhases(buildPhase).contains(where: { $0.files.contains(buildFile.reference)}) else { + throw failure("File \(paths.joined(separator: "/").quoted) is not in a \(buildPhase.rawValue.quoted) build phase") + } + } + } + + func getFileReference(paths: [String], names: [String]) -> PBXFileReference? { + guard let project = projects.first else { return nil } + guard let mainGroup = groups.getReference(project.mainGroup) else { return nil } + + return getFileReference(group: mainGroup, paths: paths, names: names) + } + + private func getFileReference(group: PBXGroup, paths: [String], names: [String]) -> PBXFileReference? { + + guard !paths.isEmpty else { return nil } + let path = paths.first! + let name = names.first! + let restOfPath = Array(paths.dropFirst()) + let restOfName = Array(names.dropFirst()) + if restOfPath.isEmpty { + let fileReferences = group.children.flatMap { self.fileReferences.getReference($0) } + return fileReferences.first { $0.path == path && $0.nameOrPath == name } + } else { + let groups = group.children.flatMap { self.groups.getReference($0) } + guard let group = groups.first(where: { $0.path == path && $0.nameOrPath == name }) else { return nil } + return getFileReference(group: group, paths: restOfPath, names: restOfName) + } + } + + func getBuildPhases(_ buildPhase: BuildPhase) -> [PBXBuildPhase] { + switch buildPhase { + case .copyFiles: return copyFilesBuildPhases + case .sources: return sourcesBuildPhases + case .frameworks: return frameworksBuildPhases + case .resources: return resourcesBuildPhases + case .runScript: return shellScriptBuildPhases + case .headers: return headersBuildPhases + } + } +} + +extension PBXFileReference { + var nameOrPath: String? { + return name ?? path + } +} + +extension PBXGroup { + var nameOrPath: String? { + return name ?? path } } diff --git a/Tests/XcodeGenKitTests/TestHelpers.swift b/Tests/XcodeGenKitTests/TestHelpers.swift index 2a40c450..84eb5104 100644 --- a/Tests/XcodeGenKitTests/TestHelpers.swift +++ b/Tests/XcodeGenKitTests/TestHelpers.swift @@ -63,7 +63,7 @@ extension ArrayExpectation { let value = try expression() if let value = value { if try !value.contains(where: predicate) { - throw failure("value does not contain") + throw failure("value does not contain item: \(value)") } } } From 93cf0e9e32431c1f7a358246b4185aa62a0316a7 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Sat, 28 Oct 2017 19:58:56 +0200 Subject: [PATCH 17/23] add simple release script --- Makefile | 31 +++++++++++++++++++++++-------- format-code.sh | 2 -- 2 files changed, 23 insertions(+), 10 deletions(-) delete mode 100755 format-code.sh diff --git a/Makefile b/Makefile index ebec0517..8a02d99d 100644 --- a/Makefile +++ b/Makefile @@ -4,17 +4,19 @@ VERSION = 1.3.0 PREFIX = /usr/local INSTALL_PATH = $(PREFIX)/bin/$(TOOL_NAME) SHARE_PATH = $(PREFIX)/share/$(TOOL_NAME) -BUILD_PATH = .build/release/$(TOOL_NAME) CURRENT_PATH = $(PWD) -TAR_FILENAME = $(TOOL_NAME)-$(VERSION).tar.gz +REPO = https://github.com/yonaskolb/$(TOOL_NAME) +RELEASE_TAR = $(REPO)/archive/$(VERSION).tar.gz +SHA = $(shell curl -L -s $(RELEASE_TAR) | shasum -a 256 | sed 's/ .*//') + +.PHONY: install build uninstall format_code update_brew release install: build mkdir -p $(PREFIX)/bin - cp -f $(BUILD_PATH) $(INSTALL_PATH) + cp -f .build/release/$(TOOL_NAME) $(INSTALL_PATH) mkdir -p $(SHARE_PATH) cp -R $(CURRENT_PATH)/SettingPresets $(SHARE_PATH)/SettingPresets -.PHONY: build build: swift build --disable-sandbox -c release -Xswiftc -static-stdlib @@ -22,7 +24,20 @@ uninstall: rm -f $(INSTALL_PATH) rm -rf $(SHARE_PATH) -get_sha: - wget https://github.com/yonaskolb/$(TOOL_NAME)/archive/$(VERSION).tar.gz -O $(TAR_FILENAME) - shasum -a 256 $(TAR_FILENAME) - rm $(TAR_FILENAME) +format_code: + swiftformat Tests --stripunusedargs closure-only + swiftformat sources --stripunusedargs closure-only + +update_brew: + sed -i '' 's|\(url ".*/archive/\)\(.*\)\(.tar\)|\1$(VERSION)\3|' Formula/xcodegen.rb + sed -i '' 's|\(sha256 "\)\(.*\)\("\)|\1$(SHA)\3|' Formula/xcodegen.rb + + git add . + git commit -m "Update brew to $(VERSION)" + +release: format_code + sed -i '' 's|\(let version = "\)\(.*\)\("\)|\1$(VERSION)\3|' Sources/XcodeGen/main.swift + + git add . + git commit -m "Update to $(VERSION)" + git tag $(VERSION) diff --git a/format-code.sh b/format-code.sh deleted file mode 100755 index 791e0883..00000000 --- a/format-code.sh +++ /dev/null @@ -1,2 +0,0 @@ -swiftformat Tests --stripunusedargs closure-only -swiftformat sources --stripunusedargs closure-only From 6b17b764354b915bb786810f296b89067a34a4ac Mon Sep 17 00:00:00 2001 From: Brandon Kase Date: Wed, 1 Nov 2017 20:52:21 -0700 Subject: [PATCH 18/23] Support CompilerFlags in Sources Added support for compilerFlags in source list. If any source file metadata (like compilerFlags) is attached to a directory the metadata propagates downwards to all children recursively until the files are reached. Files are now processed in the same way as directories in `getSources` this depends on #108 to not over-eagerly cache groups. The `source` is propagated as metadata down all the way (thanks @yonaskolb) Fixtures and unit tests are updated as well. --- .../Project.xcodeproj/project.pbxproj | 10 ++--- Fixtures/TestProject/spec.yml | 6 ++- Sources/ProjectSpec/Source.swift | 17 ++++++- Sources/XcodeGenKit/PBXProjGenerator.swift | 45 ++++++++----------- Tests/XcodeGenKitTests/SpecLoadingTests.swift | 4 +- docs/ProjectSpec.md | 16 ++++++- 6 files changed, 60 insertions(+), 38 deletions(-) diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 2a3c370c..f33166ae 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -6,17 +6,17 @@ objects = { /* Begin PBXBuildFile section */ - BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; }; + BF1073850101 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR1332263601 /* AppDelegate.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; BF1401236301 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072501 /* Alamofire.framework */; }; BF1628293501 /* Standalone.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR2554453101 /* Standalone.swift */; }; - BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; }; + BF1744565901 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FR6218091901 /* ViewController.swift */; settings = {COMPILER_FLAGS = "-Werror"; }; }; BF2018435801 /* Framework_iOS.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BF2250910101 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2043127501 /* Main.storyboard */; }; BF2445564001 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG2858723001 /* LaunchScreen.storyboard */; }; BF2513089601 /* LocalizedStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = VG3182922801 /* LocalizedStoryboard.storyboard */; }; BF2535278401 = {isa = PBXBuildFile; fileRef = FR4387045301 /* Framework_watchOS.framework */; }; BF3008399601 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072503 /* Alamofire.framework */; }; - BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; }; + BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; settings = {COMPILER_FLAGS = "-Werror"; }; }; BF3314441201 = {isa = PBXBuildFile; fileRef = FR5251191201 /* Framework_macOS.framework */; }; BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549502 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -263,8 +263,8 @@ isa = PBXGroup; children = ( G83406189501 /* Configs */, - G66512504301 /* StandaloneFiles */, G82523211001 /* App_iOS */, + G66512504301 /* StandaloneFiles */, G78312289901 /* App_iOS_Tests */, G46615002701 /* Framework */, G46615002701 /* Framework */, @@ -644,9 +644,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF1628293501 /* Standalone.swift in Sources */, BF1073850101 /* AppDelegate.swift in Sources */, BF1744565901 /* ViewController.swift in Sources */, + BF1628293501 /* Standalone.swift in Sources */, ); }; /* End PBXSourcesBuildPhase section */ diff --git a/Fixtures/TestProject/spec.yml b/Fixtures/TestProject/spec.yml index 9ad1ecad..0a26a036 100644 --- a/Fixtures/TestProject/spec.yml +++ b/Fixtures/TestProject/spec.yml @@ -11,8 +11,10 @@ targets: type: application platform: iOS sources: - - App_iOS - - StandaloneFiles/Standalone.swift + - path: App_iOS + compilerFlags: + - "-Werror" + - path: StandaloneFiles/Standalone.swift settings: PRODUCT_BUNDLE_IDENTIFIER: com.project$(BUNDLE_ID_SUFFIX) INFOPLIST_FILE: App_iOS/Info.plist diff --git a/Sources/ProjectSpec/Source.swift b/Sources/ProjectSpec/Source.swift index bba90497..a03773fc 100644 --- a/Sources/ProjectSpec/Source.swift +++ b/Sources/ProjectSpec/Source.swift @@ -7,13 +7,16 @@ import Foundation import JSONUtilities +import PathKit public struct Source { public var path: String + public var compilerFlags: [String] - public init(path: String) { + public init(path: String, compilerFlags: [String] = []) { self.path = path + self.compilerFlags = compilerFlags } } @@ -36,12 +39,22 @@ extension Source: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { path = try jsonDictionary.json(atKeyPath: "path") + let maybeCompilerFlagsString: String? = jsonDictionary.json(atKeyPath: "compilerFlags") + let maybeCompilerFlagsArray: [String]? = jsonDictionary.json(atKeyPath: "compilerFlags") + compilerFlags = maybeCompilerFlagsArray ?? + maybeCompilerFlagsString.map{ $0.split(separator: " ").map{ String($0) } } ?? [] } } extension Source: Equatable { public static func == (lhs: Source, rhs: Source) -> Bool { - return lhs.path == rhs.path + return lhs.path == rhs.path && lhs.compilerFlags == rhs.compilerFlags + } +} + +extension Source: Hashable { + public var hashValue: Int { + return path.hashValue ^ compilerFlags.joined(separator: ":").hashValue } } diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 31b4bb01..d0ee8f41 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -66,7 +66,7 @@ public class PBXProjGenerator { for group in spec.fileGroups { // TODO: call a seperate function that only creates groups not source files - _ = try getSources(path: spec.basePath + group) + _ = try getSources(sourceMetadata: Source(path: group), path: spec.basePath + group) } let buildConfigs: [XCBuildConfiguration] = spec.configs.map { config in @@ -144,13 +144,17 @@ public class PBXProjGenerator { let buildFile: PBXBuildFile } - func generateSourceFile(path: Path) -> SourceFile { + func generateSourceFile(sourceMetadata source: Source, path: Path) -> SourceFile { let fileReference = fileReferencesByPath[path]! - var settings: [String: Any]? + var settings: [String: Any] = [:] if getBuildPhaseForPath(path) == .headers { settings = ["ATTRIBUTES": ["Public"]] } - let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference), fileRef: fileReference, settings: settings) + if source.compilerFlags.count > 0 { + settings["COMPILER_FLAGS"] = source.compilerFlags.joined(separator: " ") + } + + let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference), fileRef: fileReference, settings: settings.isEmpty ? nil : settings) return SourceFile(path: path, fileReference: fileReference, buildFile: buildFile) } @@ -492,24 +496,7 @@ public class PBXProjGenerator { } func getAllSourceFiles(sources: [Source]) throws -> [SourceFile] { - let sourcePaths = sources.map { spec.basePath + $0.path } - - let (files, dirs) = (sourcePaths.filter { $0.isFile }, sourcePaths.filter { $0.isDirectory }) - let filesByParent: [Path: [Path]] = files.reduce([:]) { acc, file in - var mut = acc - let group = file.parent() - mut[group, default: []].append(file) - return mut - } - - let fromFiles = try filesByParent.map { parent, files in - try getSources(path: parent, children: files) - } - let fromDirs = try dirs.map { dir in - try getSources(path: dir) - } - - return (fromFiles + fromDirs).flatMap { $0.sourceFiles } + return try sources.flatMap{ try getSources(sourceMetadata: $0, path: spec.basePath + $0.path).sourceFiles } } func getSingleGroup(path: Path, mergingChildren children: [String], depth: Int = 0) -> PBXGroup { @@ -553,8 +540,12 @@ public class PBXProjGenerator { ) } - func getSources(path: Path, children: [Path]? = nil, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { - let children = try children ?? (try path.children()) + func getSources(sourceMetadata source: Source, path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { + // if we have a file, move it to children and use the parent as the path + let (children, path) = path.isFile ? + ([path], path.parent()) : + (try path.children(), path) + let excludedFiles: [String] = [".DS_Store"] let directories = children @@ -571,11 +562,13 @@ public class PBXProjGenerator { .sorted { $0.lastComponent < $1.lastComponent } var groupChildren: [String] = filePaths.map { getFileReference(path: $0, inPath: path) } - var allSourceFiles: [SourceFile] = filePaths.map { generateSourceFile(path: $0) } + var allSourceFiles: [SourceFile] = filePaths.map { + generateSourceFile(sourceMetadata: Source(path: $0.string, compilerFlags: source.compilerFlags), path: $0) + } var groups: [PBXGroup] = [] for path in directories { - let subGroups = try getSources(path: path, depth: depth + 1) + let subGroups = try getSources(sourceMetadata: source, path: path, depth: depth + 1) allSourceFiles += subGroups.sourceFiles groupChildren.append(subGroups.groups.first!.reference) groups += subGroups.groups diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index d4103c5f..56c104ff 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -73,6 +73,8 @@ func specLoadingTests() { targetDictionary1["sources"] = [ "source1", ["path": "source2"], + ["path": "sourceWithFlags", "compilerFlags": ["-Werror"]], + ["path": "sourceWithFlagsStr", "compilerFlags": "-Werror -Wextra"] ] var targetDictionary2 = validTarget targetDictionary2["sources"] = "source3" @@ -80,7 +82,7 @@ func specLoadingTests() { let target1 = try Target(name: "test", jsonDictionary: targetDictionary1) let target2 = try Target(name: "test", jsonDictionary: targetDictionary2) - try expect(target1.sources) == [Source(path: "source1"), Source(path: "source2")] + try expect(target1.sources) == [Source(path: "source1"), Source(path: "source2"), Source(path: "sourceWithFlags", compilerFlags: ["-Werror"]), Source(path: "sourceWithFlagsStr", compilerFlags: ["-Werror", "-Wextra"])] try expect(target2.sources) == [Source(path: "source3")] } diff --git a/docs/ProjectSpec.md b/docs/ProjectSpec.md index 46001d34..338637f9 100644 --- a/docs/ProjectSpec.md +++ b/docs/ProjectSpec.md @@ -196,7 +196,14 @@ targets: The above will generate 2 targets named `MyFramework_iOS` and `MyFramework_tvOS`, with all the relevant platform build settings. They will both have a `PRODUCT_NAME` of `MyFramework` ### Sources -Specifies the source directories for a target. This can either be a single path or a list of paths. Applicable source files, resources, headers, and lproj files will be parsed appropriately +Specifies the source directories for a target. This can either be a single source or a list of sources. Applicable source files, resources, headers, and lproj files will be parsed appropriately. + +A source can be provided via a string (the path) or an object of the form: + +**Source Object**: + +- 🔵 **path**: `String` - The path to the source file or directory. +- ⚪️ **compilerFlags**: `[String]` or `String` - A list of compilerFlags to add to files under this specific path provided as a list or a space delimitted string. Defaults to empty. ```yaml targets: @@ -205,7 +212,12 @@ targets: MyOtherTarget sources: - MyOtherTargetSource1 - - MyOtherTargetSource2 + - path: MyOtherTargetSource2 + compilerFlags: + - "-Werror" + - "-Wextra" + - path: MyOtherTargetSource3 + compilerFlags: "-Werror -Wextra" ``` ### Dependency From 413803271170e817364711176f239c8041b1779f Mon Sep 17 00:00:00 2001 From: Brandon Kase Date: Thu, 2 Nov 2017 13:49:06 -0700 Subject: [PATCH 19/23] Interpret .c files as sources --- Sources/XcodeGenKit/PBXProjGenerator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 31b4bb01..caca643b 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -471,7 +471,7 @@ public class PBXProjGenerator { } if let fileExtension = path.extension { switch fileExtension { - case "swift", "m", "mm", "cpp": return .sources + case "swift", "m", "mm", "cpp", "c": return .sources case "h", "hh", "hpp", "ipp", "tpp", "hxx", "def": return .headers case "xcconfig", "entitlements", "gpx", "lproj", "apns": return nil default: return .resources From e24c0e29c77ee6d33a8f0aede3892b8c6664a11f Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 10:33:10 +0900 Subject: [PATCH 20/23] Refactor localized file references generation - Use getFileReference() to generate localized file references - Add name parameter to getFileReference --- Sources/XcodeGenKit/PBXProjGenerator.swift | 25 ++++++---------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4f200341..c7ce20fc 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -484,11 +484,11 @@ public class PBXProjGenerator { return nil } - func getFileReference(path: Path, inPath: Path) -> String { + func getFileReference(path: Path, inPath: Path, name: String? = nil) -> String { if let fileReference = fileReferencesByPath[path] { return fileReference } else { - let fileReference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), sourceTree: .group, path: path.byRemovingBase(path: inPath).string) + let fileReference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), sourceTree: .group, name: name, path: path.byRemovingBase(path: inPath).string) addObject(fileReference) fileReferencesByPath[path] = fileReference.reference return fileReference.reference @@ -604,25 +604,12 @@ public class PBXProjGenerator { // add references to localised resources into base localisation variant groups for localisedDirectory in localisedDirectories { let localisationName = localisedDirectory.lastComponentWithoutExtension - for path in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { - let filePath = "\(localisedDirectory.lastComponent)/\(path.lastComponent)" - + for filePath in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { // find base localisation variant group - let name = path.lastComponentWithoutExtension + let name = filePath.lastComponentWithoutExtension let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == name } - let fileReference: String - if let cachedFileReference = fileReferencesByPath[path] { - fileReference = cachedFileReference - } else { - let reference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), - sourceTree: .group, - name: variantGroup != nil ? localisationName : path.lastComponent, - path: filePath) - addObject(reference) - fileReference = reference.reference - fileReferencesByPath[path] = fileReference - } + let fileReference = getFileReference(path: filePath, inPath: path, name: variantGroup != nil ? localisationName : filePath.lastComponent) if let variantGroup = variantGroup { if !variantGroup.children.contains(fileReference) { @@ -633,7 +620,7 @@ public class PBXProjGenerator { let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference), fileRef: fileReference, settings: nil) - allSourceFiles.append(SourceFile(path: path, fileReference: fileReference, buildFile: buildFile)) + allSourceFiles.append(SourceFile(path: filePath, fileReference: fileReference, buildFile: buildFile)) groupChildren.append(fileReference) } } From ce27af06471ba1b220fbc6b4126ba97be8868daf Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 10:51:48 +0900 Subject: [PATCH 21/23] Refactor variant group generation - Add getVariantGroup() in the same manner as getFileReference() --- Sources/XcodeGenKit/PBXProjGenerator.swift | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index c7ce20fc..8438aa1b 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -540,6 +540,21 @@ public class PBXProjGenerator { ) } + func getVariantGroup(path: Path, inPath: Path) -> PBXVariantGroup { + let variantGroup: PBXVariantGroup + if let cachedGroup = variantGroupsByPath[path] { + variantGroup = cachedGroup + } else { + variantGroup = PBXVariantGroup(reference: generateUUID(PBXVariantGroup.self, path.byRemovingBase(path: inPath).string), + children: [], + name: path.lastComponent, + sourceTree: .group) + addObject(variantGroup) + variantGroupsByPath[path] = variantGroup + } + return variantGroup + } + func getSources(sourceMetadata source: Source, path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { // if we have a file, move it to children and use the parent as the path let (children, path) = path.isFile ? @@ -577,27 +592,13 @@ public class PBXProjGenerator { // create variant groups of the base localisation first var baseLocalisationVariantGroups: [PBXVariantGroup] = [] if let baseLocalisedDirectory = localisedDirectories.first(where: { $0.lastComponent == "Base.lproj" }) { - for path in try baseLocalisedDirectory.children() { - let filePath = "\(baseLocalisedDirectory.lastComponent)/\(path.lastComponent)" - - let variantGroup: PBXVariantGroup - if let cachedGroup = variantGroupsByPath[path] { - variantGroup = cachedGroup - } else { - variantGroup = PBXVariantGroup(reference: generateUUID(PBXVariantGroup.self, filePath), - children: [], - name: path.lastComponent, - sourceTree: .group) - variantGroupsByPath[path] = variantGroup - - addObject(variantGroup) - groupChildren.append(variantGroup.reference) - } - + for filePath in try baseLocalisedDirectory.children() { + let variantGroup = getVariantGroup(path: filePath, inPath: path) + groupChildren.append(variantGroup.reference) baseLocalisationVariantGroups.append(variantGroup) let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, variantGroup.reference), fileRef: variantGroup.reference, settings: nil) - allSourceFiles.append(SourceFile(path: path, fileReference: variantGroup.reference, buildFile: buildFile)) + allSourceFiles.append(SourceFile(path: filePath, fileReference: variantGroup.reference, buildFile: buildFile)) } } From 66a2893dd0e8d762583d1aff45c5c074cf81e366 Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 11:41:13 +0900 Subject: [PATCH 22/23] Fix localized files with same name #122 --- Sources/XcodeGenKit/PBXProjGenerator.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 8438aa1b..f28f2ca4 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -607,8 +607,9 @@ public class PBXProjGenerator { let localisationName = localisedDirectory.lastComponentWithoutExtension for filePath in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { // find base localisation variant group - let name = filePath.lastComponentWithoutExtension - let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == name } + // ex: Foo.strings will be added to Foo.strings or Foo.storyboard variant group + let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponent == filePath.lastComponent } ?? + baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == filePath.lastComponentWithoutExtension } let fileReference = getFileReference(path: filePath, inPath: path, name: variantGroup != nil ? localisationName : filePath.lastComponent) From 7eb4e92f0089ff7cb9e2711bdba43572ea028eda Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 12:31:35 +0900 Subject: [PATCH 23/23] Add stringsdict file to TestProject --- .../App_iOS/Base.lproj/Localizable.strings | 7 +++++ .../Base.lproj/Localizable.stringsdict | 30 +++++++++++++++++++ .../App_iOS/en.lproj/Localizable.strings | 7 +++++ .../App_iOS/en.lproj/Localizable.stringsdict | 30 +++++++++++++++++++ .../Project.xcodeproj/project.pbxproj | 28 +++++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings create mode 100644 Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict create mode 100644 Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings create mode 100644 Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict diff --git a/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings new file mode 100644 index 00000000..84643cdc --- /dev/null +++ b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + Project + + Created by ryohey on 2017/11/03. + +*/ diff --git a/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict new file mode 100644 index 00000000..458f0f3e --- /dev/null +++ b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict @@ -0,0 +1,30 @@ + + + + + StringKey + + NSStringLocalizedFormatKey + %#@VARIABLE@ + Variable + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + + zero + + one + + two + + few + + many + + other + + + + + diff --git a/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings new file mode 100644 index 00000000..84643cdc --- /dev/null +++ b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + Project + + Created by ryohey on 2017/11/03. + +*/ diff --git a/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict new file mode 100644 index 00000000..458f0f3e --- /dev/null +++ b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict @@ -0,0 +1,30 @@ + + + + + StringKey + + NSStringLocalizedFormatKey + %#@VARIABLE@ + Variable + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + + zero + + one + + two + + few + + many + + other + + + + + diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index f33166ae..58f30bd5 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -18,10 +18,12 @@ BF3008399601 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072503 /* Alamofire.framework */; }; BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; settings = {COMPILER_FLAGS = "-Werror"; }; }; BF3314441201 = {isa = PBXBuildFile; fileRef = FR5251191201 /* Framework_macOS.framework */; }; + BF3371332801 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = VG5506161801 /* Localizable.strings */; }; BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549502 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549503 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549504 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF4414242001 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = VG1597538701 /* Localizable.stringsdict */; }; BF4530793601 /* Framework_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; }; BF5539436901 = {isa = PBXBuildFile; fileRef = FR6623158301 /* Framework_tvOS.framework */; }; BF6380159901 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072502 /* Alamofire.framework */; }; @@ -77,6 +79,8 @@ FR3032072503 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3032072504 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3546283901 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; + FR3899172901 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + FR3899172902 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; FR4387045301 /* Framework_watchOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_watchOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FR4722960401 /* Framework_iOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FR4822987701 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; @@ -92,6 +96,8 @@ FR7831228901 /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = xctest; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FR8182352201 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; FR8252321101 /* App_iOS.app */ = {isa = PBXFileReference; explicitFileType = app; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR9612050601 /* Base */ = {isa = PBXFileReference; name = Base; path = Base.lproj/Localizable.stringsdict; sourceTree = ""; }; + FR9612050602 /* en */ = {isa = PBXFileReference; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -242,6 +248,8 @@ FR1345298501 /* Info.plist */, FR6218091901 /* ViewController.swift */, VG2858723001 /* LaunchScreen.storyboard */, + VG5506161801 /* Localizable.strings */, + VG1597538701 /* Localizable.stringsdict */, VG3182922801 /* LocalizedStoryboard.storyboard */, VG2043127501 /* Main.storyboard */, ); @@ -495,6 +503,8 @@ files = ( BF3154421201 /* Assets.xcassets in Resources */, BF2445564001 /* LaunchScreen.storyboard in Resources */, + BF3371332801 /* Localizable.strings in Resources */, + BF4414242001 /* Localizable.stringsdict in Resources */, BF2513089601 /* LocalizedStoryboard.storyboard in Resources */, BF2250910101 /* Main.storyboard in Resources */, ); @@ -665,6 +675,15 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + VG1597538701 /* Localizable.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + FR9612050601 /* Base */, + FR9612050602 /* en */, + ); + name = Localizable.stringsdict; + sourceTree = ""; + }; VG2043127501 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -690,6 +709,15 @@ name = LocalizedStoryboard.storyboard; sourceTree = ""; }; + VG5506161801 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + FR3899172901 /* Base */, + FR3899172902 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */