diff --git a/Sources/xpmkit/Commands/InitCommand.swift b/Sources/xpmkit/Commands/InitCommand.swift index c52ece347..879b34258 100644 --- a/Sources/xpmkit/Commands/InitCommand.swift +++ b/Sources/xpmkit/Commands/InitCommand.swift @@ -14,9 +14,9 @@ enum InitCommandError: FatalError { var description: String { switch self { case let .alreadyExists(path): - return "\(path.asString) already exists" + return "\(path.asString) already exists." case let .ungettableProjectName(path): - return "Couldn't infer the project name from path \(path.asString)" + return "Couldn't infer the project name from path \(path.asString)." } } } @@ -30,6 +30,7 @@ class InitCommand: NSObject, Command { let platformArgument: OptionArgument let productArgument: OptionArgument let pathArgument: OptionArgument + let nameArgument: OptionArgument let fileHandler: FileHandling let printer: Printing let infoplistProvisioner: InfoPlistProvisioning @@ -69,6 +70,11 @@ class InitCommand: NSObject, Command { kind: String.self, usage: "The path to the folder where the project will be generated.", completion: .filename) + nameArgument = subParser.add(option: "--name", + shortName: "-n", + kind: String.self, + usage: "The name of the project.", + completion: .filename) self.fileHandler = fileHandler self.printer = printer self.infoplistProvisioner = infoplistProvisioner @@ -78,7 +84,7 @@ class InitCommand: NSObject, Command { let product = try self.product(arguments: arguments) let platform = try self.platform(arguments: arguments) let path = try self.path(arguments: arguments) - let name = try self.name(path: path) + let name = try self.name(arguments: arguments, path: path) try generateProjectSwift(name: name, platform: platform, product: product, path: path) try generateSources(name: name, platform: platform, product: product, path: path) try generateTests(name: name, path: path) @@ -228,8 +234,10 @@ class InitCommand: NSObject, Command { try content.write(to: path.appending(component: "\(name)Tests.swift").url, atomically: true, encoding: .utf8) } - fileprivate func name(path: AbsolutePath) throws -> String { - if let name = path.components.last { + fileprivate func name(arguments: ArgumentParser.Result, path: AbsolutePath) throws -> String { + if let name = arguments.get(nameArgument) { + return name + } else if let name = path.components.last { return name } else { throw InitCommandError.ungettableProjectName(AbsolutePath.current) diff --git a/Tests/IntegrationTests/InitTests.swift b/Tests/IntegrationTests/InitTests.swift index 79cb0ce79..35356548c 100644 --- a/Tests/IntegrationTests/InitTests.swift +++ b/Tests/IntegrationTests/InitTests.swift @@ -5,16 +5,45 @@ import XCTest @testable import xpmkit final class InitTests: XCTestCase { - var subject: InitCommand! + var initCommand: InitCommand! + var generateCommand: GenerateCommand! var parser: ArgumentParser! + var directory: TemporaryDirectory! override func setUp() { parser = ArgumentParser(usage: "test", overview: "test") - subject = InitCommand(parser: parser) + directory = try! TemporaryDirectory(removeTreeOnDeinit: true) + initCommand = InitCommand(parser: parser) + generateCommand = GenerateCommand(parser: parser) } - func test_init_when_ios_application() throws { - let result = try parser.parse(["init", "--product", "application", "--platform", "ios"]) - try subject.run(with: result) + func test_init_when_ios_framework() throws { + let name = "Test" + let workspacePath = directory.path.appending(component: "\(name).xcworkspace") + let initResult = try parser.parse(["init", "--name", name, "--product", "framework", "--platform", "ios", "--path", directory.path.asString]) + try initCommand.run(with: initResult) + let generateResult = try parser.parse(["generate", "--path", directory.path.asString]) + try generateCommand.run(with: generateResult) + try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"]) + } + + func test_init_when_macos_framework() throws { + let name = "Test" + let workspacePath = directory.path.appending(component: "\(name).xcworkspace") + let initResult = try parser.parse(["init", "--name", name, "--product", "framework", "--platform", "macos", "--path", directory.path.asString]) + try initCommand.run(with: initResult) + let generateResult = try parser.parse(["generate", "--path", directory.path.asString]) + try generateCommand.run(with: generateResult) + try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"]) + } + + func test_init_when_macos_application() throws { + let name = "Test" + let workspacePath = directory.path.appending(component: "\(name).xcworkspace") + let initResult = try parser.parse(["init", "--name", name, "--product", "application", "--platform", "macos", "--path", directory.path.asString]) + try initCommand.run(with: initResult) + let generateResult = try parser.parse(["generate", "--path", directory.path.asString]) + try generateCommand.run(with: generateResult) + try Process.checkNonZeroExit(arguments: ["xcodebuild", "-workspace", workspacePath.asString, "-scheme", name, "clean", "build"]) } } diff --git a/Tests/xpmkitTests/Commands/InitCommandTests.swift b/Tests/xpmkitTests/Commands/InitCommandTests.swift index ada3e83d5..84f981c3c 100644 --- a/Tests/xpmkitTests/Commands/InitCommandTests.swift +++ b/Tests/xpmkitTests/Commands/InitCommandTests.swift @@ -7,8 +7,8 @@ import XCTest final class InitCommandErrorTests: XCTestCase { func test_description() { - XCTAssertEqual(InitCommandError.alreadyExists(AbsolutePath("/path")).description, "/path already exists") - XCTAssertEqual(InitCommandError.ungettableProjectName(AbsolutePath("/path")).description, "Couldn't infer the project name from path /path") + XCTAssertEqual(InitCommandError.alreadyExists(AbsolutePath("/path")).description, "/path already exists.") + XCTAssertEqual(InitCommandError.ungettableProjectName(AbsolutePath("/path")).description, "Couldn't infer the project name from path /path.") } func test_type() {