diff --git a/Sources/ProjectSpec/SpecValidation.swift b/Sources/ProjectSpec/SpecValidation.swift index 0573513b..de718a8a 100644 --- a/Sources/ProjectSpec/SpecValidation.swift +++ b/Sources/ProjectSpec/SpecValidation.swift @@ -3,14 +3,9 @@ import PathKit extension Project { - public func validate(xcodeGenVersion: Version) throws { + public func validate() throws { var errors: [SpecValidationError.ValidationError] = [] - - if let minimumXcodeGenVersion = options.minimumXcodeGenVersion, xcodeGenVersion < minimumXcodeGenVersion { - errors.append(.invalidXcodeGenVersion(version: xcodeGenVersion, minimumVersion: minimumXcodeGenVersion)) - } - func validateSettings(_ settings: Settings) -> [SpecValidationError.ValidationError] { var errors: [SpecValidationError.ValidationError] = [] for group in settings.groups { diff --git a/Sources/ProjectSpec/SpecValidationError.swift b/Sources/ProjectSpec/SpecValidationError.swift index a34fb965..d44fc19a 100644 --- a/Sources/ProjectSpec/SpecValidationError.swift +++ b/Sources/ProjectSpec/SpecValidationError.swift @@ -5,7 +5,7 @@ public struct SpecValidationError: Error, CustomStringConvertible { public var errors: [ValidationError] public enum ValidationError: Error, CustomStringConvertible { - case invalidXcodeGenVersion(version: Version, minimumVersion: Version) + case invalidXcodeGenVersion(minimumVersion: Version, version: Version) case invalidTargetDependency(target: String, dependency: String) case invalidTargetSource(target: String, source: String) case invalidTargetConfigFile(target: String, configFile: String, config: String) @@ -24,7 +24,7 @@ public struct SpecValidationError: Error, CustomStringConvertible { public var description: String { switch self { - case let .invalidXcodeGenVersion(version, minimumVersion): + case let .invalidXcodeGenVersion(minimumVersion, version): return "XcodeGen version is \(version), but minimum required version specified as \(minimumVersion)" case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)" diff --git a/Sources/XcodeGen/main.swift b/Sources/XcodeGen/main.swift index 1c5cc570..ed63fbfd 100644 --- a/Sources/XcodeGen/main.swift +++ b/Sources/XcodeGen/main.swift @@ -40,8 +40,11 @@ func generate(spec: String, project: String, isQuiet: Bool, justVersion: Bool) { do { logger.info("⚙️ Generating project...") + + try project.validateMinimumXcodeGenVersion(version) + let projectGenerator = ProjectGenerator(project: project) - let xcodeProject = try projectGenerator.generateXcodeProject(xcodeGenVersion: version) + let xcodeProject = try projectGenerator.generateXcodeProject() logger.info("⚙️ Writing project...") diff --git a/Sources/XcodeGenKit/ProjectGenerator.swift b/Sources/XcodeGenKit/ProjectGenerator.swift index 36e2133c..a147ff17 100644 --- a/Sources/XcodeGenKit/ProjectGenerator.swift +++ b/Sources/XcodeGenKit/ProjectGenerator.swift @@ -21,8 +21,8 @@ public class ProjectGenerator { return project.configs.first { $0.type == .release }! } - public func generateXcodeProject(xcodeGenVersion: Version) throws -> XcodeProj { - try project.validate(xcodeGenVersion: xcodeGenVersion) + public func generateXcodeProject() throws -> XcodeProj { + try project.validate() let pbxProjGenerator = PBXProjGenerator(project: project) let pbxProject = try pbxProjGenerator.generate() let workspace = try generateWorkspace() diff --git a/Sources/XcodeGenKit/Version.swift b/Sources/XcodeGenKit/Version.swift index 4a4978ff..f78368df 100644 --- a/Sources/XcodeGenKit/Version.swift +++ b/Sources/XcodeGenKit/Version.swift @@ -10,6 +10,12 @@ extension Project { var schemeVersion: String { return "1.3" } + + public func validateMinimumXcodeGenVersion(_ xcodeGenVersion: Version) throws { + if let minimumXcodeGenVersion = options.minimumXcodeGenVersion, xcodeGenVersion < minimumXcodeGenVersion { + throw SpecValidationError.ValidationError.invalidXcodeGenVersion(minimumVersion: minimumXcodeGenVersion, version: xcodeGenVersion) + } + } } public struct XCodeVersion { diff --git a/Tests/XcodeGenKitTests/GeneratorHelpers.swift b/Tests/XcodeGenKitTests/GeneratorHelpers.swift index 10ef5ba4..11157fca 100644 --- a/Tests/XcodeGenKitTests/GeneratorHelpers.swift +++ b/Tests/XcodeGenKitTests/GeneratorHelpers.swift @@ -8,16 +8,16 @@ import Yams extension Project { - func generateXcodeProject(xcodeGenVersion: Version = try! Version("1.11.0"), file: String = #file, line: Int = #line) throws -> XcodeProj { + func generateXcodeProject(file: String = #file, line: Int = #line) throws -> XcodeProj { return try doThrowing(file: file, line: line) { let generator = ProjectGenerator(project: self) - return try generator.generateXcodeProject(xcodeGenVersion: xcodeGenVersion) + return try generator.generateXcodeProject() } } - func generatePbxProj(xcodeGenVersion: Version = try! Version("1.11.0"), file: String = #file, line: Int = #line) throws -> PBXProj { + func generatePbxProj(file: String = #file, line: Int = #line) throws -> PBXProj { return try doThrowing(file: file, line: line) { - let xcodeProject = try generateXcodeProject(xcodeGenVersion: xcodeGenVersion).pbxproj + let xcodeProject = try generateXcodeProject().pbxproj try xcodeProject.validate() return xcodeProject } diff --git a/Tests/XcodeGenKitTests/ProjectFixtureTests.swift b/Tests/XcodeGenKitTests/ProjectFixtureTests.swift index 6fe0b882..b66e50b3 100644 --- a/Tests/XcodeGenKitTests/ProjectFixtureTests.swift +++ b/Tests/XcodeGenKitTests/ProjectFixtureTests.swift @@ -58,10 +58,10 @@ class ProjectFixtureTests: XCTestCase { } } -fileprivate func generateXcodeProject(xcodeGenVersion: Version = try! Version("1.11.0"), specPath: Path, projectPath: Path, file: String = #file, line: Int = #line) throws -> XcodeProj { +fileprivate func generateXcodeProject(specPath: Path, projectPath: Path, file: String = #file, line: Int = #line) throws -> XcodeProj { let project = try Project(path: specPath) let generator = ProjectGenerator(project: project) - let xcodeProject = try generator.generateXcodeProject(xcodeGenVersion: xcodeGenVersion) + let xcodeProject = try generator.generateXcodeProject() let oldProject = try XcodeProj(path: projectPath) let pbxProjPath = projectPath + XcodeProj.pbxprojPath(projectPath) let oldProjectString: String = try pbxProjPath.read() diff --git a/Tests/XcodeGenKitTests/ProjectSpecTests.swift b/Tests/XcodeGenKitTests/ProjectSpecTests.swift index 64876c3d..9f7447d6 100644 --- a/Tests/XcodeGenKitTests/ProjectSpecTests.swift +++ b/Tests/XcodeGenKitTests/ProjectSpecTests.swift @@ -80,9 +80,9 @@ class ProjectSpecTests: XCTestCase { var project = baseProject project.options = SpecOptions(minimumXcodeGenVersion: minimumVersion) - try expectValidationError(xcodeGenVersion: try! Version("1.11.0"), project, .invalidXcodeGenVersion(version: try! Version("1.11.0"), minimumVersion: minimumVersion)) - try expectValidationError(xcodeGenVersion: try! Version("1.10.99"), project, .invalidXcodeGenVersion(version: try! Version("1.10.99"), minimumVersion: minimumVersion)) - try expectValidationError(xcodeGenVersion: try! Version("0.99"), project, .invalidXcodeGenVersion(version: try! Version("0.99"), minimumVersion: minimumVersion)) + try expectMinimumXcodeGenVersionError(project, minimumVersion: minimumVersion, xcodeGenVersion: try! Version("1.11.0")) + try expectMinimumXcodeGenVersionError(project, minimumVersion: minimumVersion, xcodeGenVersion: try! Version("1.10.99")) + try expectMinimumXcodeGenVersionError(project, minimumVersion: minimumVersion, xcodeGenVersion: try! Version("0.99")) } $0.it("fails with invalid project") { @@ -109,7 +109,7 @@ class ProjectSpecTests: XCTestCase { project.options = SpecOptions(disabledValidations: [.missingConfigs]) let configPath = fixturePath + "test.xcconfig" project.configFiles = ["missingConfiguration": configPath.string] - try project.validate(xcodeGenVersion: try Version("1.11.0")) + try project.validate() } $0.it("fails with invalid target") { @@ -190,7 +190,7 @@ class ProjectSpecTests: XCTestCase { platform: .iOS, sources: [.init(path: "generated.swift", optional: true)] )] - try project.validate(xcodeGenVersion: try Version("1.11.0")) + try project.validate() } $0.it("validates missing default configurations") { @@ -202,9 +202,9 @@ class ProjectSpecTests: XCTestCase { } } -fileprivate func expectValidationError(xcodeGenVersion: Version = try! Version("1.11.0"), _ project: Project, _ expectedError: SpecValidationError.ValidationError, file: String = #file, line: Int = #line) throws { +fileprivate func expectValidationError(_ project: Project, _ expectedError: SpecValidationError.ValidationError, file: String = #file, line: Int = #line) throws { do { - try project.validate(xcodeGenVersion: xcodeGenVersion) + try project.validate() } catch let error as SpecValidationError { if !error.errors .contains(where: { $0.description == expectedError.description }) { @@ -216,3 +216,9 @@ fileprivate func expectValidationError(xcodeGenVersion: Version = try! Version(" } throw failure("Supposed to fail with \"\(expectedError)\"", file: file, line: line) } + +fileprivate func expectMinimumXcodeGenVersionError(_ project: Project, minimumVersion: Version, xcodeGenVersion: Version, file: String = #file, line: Int = #line) throws { + try expectError(SpecValidationError.ValidationError.invalidXcodeGenVersion(minimumVersion: minimumVersion, version: xcodeGenVersion), file: file, line: line) { + try project.validateMinimumXcodeGenVersion(xcodeGenVersion) + } +}