From 01815e7e4eeab7d54398bd3493c4c6cba157ef85 Mon Sep 17 00:00:00 2001 From: Yonas Kolb Date: Tue, 3 Jul 2018 21:45:00 +1000 Subject: [PATCH] Update to 1.10.0 --- Makefile | 2 +- Sources/ProjectSpec/Target.swift | 2 +- Sources/ProjectSpec/XCProjExtensions.swift | 2 +- Sources/XcodeGen/main.swift | 2 +- Sources/XcodeGenKit/PBXProjGenerator.swift | 18 ++++---- Sources/XcodeGenKit/ProjectGenerator.swift | 2 +- .../MessagesViewController.swift | 42 ++++++++----------- .../ProjectGeneratorTests.swift | 37 ++++++++-------- Tests/XcodeGenKitTests/SpecLoadingTests.swift | 4 +- 9 files changed, 52 insertions(+), 59 deletions(-) diff --git a/Makefile b/Makefile index 1ae47e81d..e33e80654 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ TOOL_NAME = XcodeGen export EXECUTABLE_NAME = xcodegen -VERSION = 1.9.0 +VERSION = 1.10.0 PREFIX = /usr/local INSTALL_PATH = $(PREFIX)/bin/$(EXECUTABLE_NAME) diff --git a/Sources/ProjectSpec/Target.swift b/Sources/ProjectSpec/Target.swift index 38708f2f4..c6ea6da90 100644 --- a/Sources/ProjectSpec/Target.swift +++ b/Sources/ProjectSpec/Target.swift @@ -282,7 +282,7 @@ extension Target: NamedJSONDictionaryConvertible { dependencies = try jsonDictionary.json(atKeyPath: "dependencies", invalidItemBehaviour: .fail) } transientlyLinkDependencies = jsonDictionary.json(atKeyPath: "transientlyLinkDependencies") - + prebuildScripts = jsonDictionary.json(atKeyPath: "prebuildScripts") ?? [] postbuildScripts = jsonDictionary.json(atKeyPath: "postbuildScripts") ?? [] buildRules = jsonDictionary.json(atKeyPath: "buildRules") ?? [] diff --git a/Sources/ProjectSpec/XCProjExtensions.swift b/Sources/ProjectSpec/XCProjExtensions.swift index 410e59c31..0b3096dc4 100644 --- a/Sources/ProjectSpec/XCProjExtensions.swift +++ b/Sources/ProjectSpec/XCProjExtensions.swift @@ -33,7 +33,7 @@ extension PBXProductType { public var isTest: Bool { return fileExtension == "xctest" } - + public var isExecutable: Bool { return isApp || isExtension || isTest } diff --git a/Sources/XcodeGen/main.swift b/Sources/XcodeGen/main.swift index 0f92a0557..e03d96294 100644 --- a/Sources/XcodeGen/main.swift +++ b/Sources/XcodeGen/main.swift @@ -6,7 +6,7 @@ import ProjectSpec import XcodeGenKit import xcproj -let version = "1.9.0" +let version = "1.10.0" func generate(spec: String, project: String, isQuiet: Bool, justVersion: Bool) { if justVersion { diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 863625b2c..f7f2b0c15 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -390,7 +390,7 @@ public class PBXProjGenerator { var copyResourcesReferences: [String] = [] var copyWatchReferences: [String] = [] var extensions: [String] = [] - + let targetDependencies = (target.transientlyLinkDependencies ?? project.options.transientlyLinkDependencies) ? getAllDependenciesPlusTransientNeedingEmbedding(target: target) : target.dependencies @@ -444,7 +444,7 @@ public class PBXProjGenerator { ) targetFrameworkBuildFiles.append(buildFile.reference) } - + let shouldEmbed = target.type.isApp || (target.type.isTest && (dependencyTarget.type.isFramework || dependencyTarget.type == .bundle)) if (dependency.embed ?? shouldEmbed) && !dependencyTarget.type.isLibrary { @@ -500,7 +500,7 @@ public class PBXProjGenerator { ) copyFrameworksReferences.append(embedFile.reference) } - + case .carthage: var platformPath = Path(getCarthageBuildPath(platform: target.platform)) var frameworkPath = platformPath + dependency.reference @@ -747,7 +747,7 @@ public class PBXProjGenerator { return frameworks } - + func getAllDependenciesPlusTransientNeedingEmbedding(target topLevelTarget: Target) -> [Dependency] { // this is used to resolve cyclical target dependencies var visitedTargets: Set = [] @@ -758,15 +758,15 @@ public class PBXProjGenerator { if visitedTargets.contains(target.name) { continue } - + let isTopLevel = target == topLevelTarget - + for dependency in target.dependencies { // don't overwrite dependencies, to allow top level ones to rule if dependencies.contains(reference: dependency.reference) { continue } - + // don't want a dependency if it's going to be embedded or statically linked in a non-top level target // in .target check we filter out targets that will embed all of their dependencies switch dependency.type { @@ -786,10 +786,10 @@ public class PBXProjGenerator { } } } - + visitedTargets.update(with: target.name) } - + return dependencies.sorted(by: { $0.key < $1.key }).map { $0.value } } } diff --git a/Sources/XcodeGenKit/ProjectGenerator.swift b/Sources/XcodeGenKit/ProjectGenerator.swift index ea06743e4..a147ff175 100644 --- a/Sources/XcodeGenKit/ProjectGenerator.swift +++ b/Sources/XcodeGenKit/ProjectGenerator.swift @@ -70,7 +70,7 @@ public class ProjectGenerator { } return XCScheme.ExecutionAction(scriptText: action.script, title: action.name, environmentBuildable: environmentBuildable) } - + let target = project.getTarget(scheme.build.targets.first!.target) let shouldExecuteOnLaunch = target?.type.isExecutable == true diff --git a/Tests/Fixtures/TestProject/IMessage MessagesExtension/MessagesViewController.swift b/Tests/Fixtures/TestProject/IMessage MessagesExtension/MessagesViewController.swift index ba4609d66..9c23ee912 100644 --- a/Tests/Fixtures/TestProject/IMessage MessagesExtension/MessagesViewController.swift +++ b/Tests/Fixtures/TestProject/IMessage MessagesExtension/MessagesViewController.swift @@ -1,71 +1,63 @@ -// -// MessagesViewController.swift -// IMessage MessagesExtension -// -// Created by Yonas Kolb on 26/6/18. -// - -import UIKit import Messages +import UIKit class MessagesViewController: MSMessagesAppViewController { - + override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } - + override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - + // MARK: - Conversation Handling - + override func willBecomeActive(with conversation: MSConversation) { // Called when the extension is about to move from the inactive to active state. // This will happen when the extension is about to present UI. - + // Use this method to configure the extension and restore previously stored state. } - + override func didResignActive(with conversation: MSConversation) { // Called when the extension is about to move from the active to inactive state. // This will happen when the user dissmises the extension, changes to a different // conversation or quits Messages. - + // Use this method to release shared resources, save user data, invalidate timers, // and store enough state information to restore your extension to its current state // in case it is terminated later. } - + override func didReceive(_ message: MSMessage, conversation: MSConversation) { // Called when a message arrives that was generated by another instance of this // extension on a remote device. - + // Use this method to trigger UI updates in response to the message. } - + override func didStartSending(_ message: MSMessage, conversation: MSConversation) { // Called when the user taps the send button. } - + override func didCancelSending(_ message: MSMessage, conversation: MSConversation) { // Called when the user deletes the message without sending it. - + // Use this to clean up state related to the deleted message. } - + override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) { // Called before the extension transitions to a new presentation style. - + // Use this method to prepare for the change in presentation style. } - + override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { // Called after the extension transitions to a new presentation style. - + // Use this method to finalize any behaviors associated with the change in presentation style. } - } diff --git a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift index da6418df2..c6c26ac30 100644 --- a/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/ProjectGeneratorTests.swift @@ -267,7 +267,7 @@ class ProjectGeneratorTests: XCTestCase { try expect(dependencies[0].object.target) == nativeTargets.first { $0.object.name == framework.name }!.reference try expect(dependencies[1].object.target) == nativeTargets.first { $0.object.name == app.name }!.reference } - + $0.it("generates targets with correct transient embeds") { // App # Embeds it's frameworks, so shouldn't embed in tests // dependencies: @@ -321,11 +321,11 @@ class ProjectGeneratorTests: XCTestCase { // - target: iOSFrameworkB // - carthage: CarthageD // - + var expectedResourceFiles: [String: Set] = [:] var expectedLinkedFiles: [String: Set] = [:] var expectedEmbeddedFrameworks: [String: Set] = [:] - + let app = Target( name: "App", type: .application, @@ -344,7 +344,7 @@ class ProjectGeneratorTests: XCTestCase { expectedEmbeddedFrameworks[app.name] = Set([ "FrameworkA.framework", ]) - + let staticLibrary = Target( name: "StaticLibrary", type: .staticLibrary, @@ -355,7 +355,7 @@ class ProjectGeneratorTests: XCTestCase { expectedResourceFiles[staticLibrary.name] = Set() expectedLinkedFiles[staticLibrary.name] = Set([]) expectedEmbeddedFrameworks[staticLibrary.name] = Set() - + let resourceBundle = Target( name: "ResourceBundle", type: .bundle, @@ -365,7 +365,7 @@ class ProjectGeneratorTests: XCTestCase { expectedResourceFiles[resourceBundle.name] = Set() expectedLinkedFiles[resourceBundle.name] = Set() expectedEmbeddedFrameworks[resourceBundle.name] = Set() - + let iosFrameworkA = Target( name: "iOSFrameworkA", type: .framework, @@ -387,7 +387,7 @@ class ProjectGeneratorTests: XCTestCase { "CarthageB.framework", ]) expectedEmbeddedFrameworks[iosFrameworkA.name] = Set() - + let iosFrameworkB = Target( name: "iOSFrameworkB", type: .framework, @@ -415,7 +415,7 @@ class ProjectGeneratorTests: XCTestCase { expectedEmbeddedFrameworks[iosFrameworkB.name] = Set([ "FrameworkE.framework", ]) - + let appTest = Target( name: "AppTest", type: .unitTestBundle, @@ -443,7 +443,7 @@ class ProjectGeneratorTests: XCTestCase { iosFrameworkB.filename, "FrameworkD.framework", ]) - + var appTestWithoutTransient = appTest appTestWithoutTransient.name = "AppTestWithoutTransient" appTestWithoutTransient.transientlyLinkDependencies = false @@ -455,9 +455,9 @@ class ProjectGeneratorTests: XCTestCase { expectedEmbeddedFrameworks[appTestWithoutTransient.name] = Set([ iosFrameworkB.filename, ]) - + let targets = [app, staticLibrary, resourceBundle, iosFrameworkA, iosFrameworkB, appTest, appTestWithoutTransient] - + let project = Project( basePath: "", name: "test", @@ -465,7 +465,7 @@ class ProjectGeneratorTests: XCTestCase { options: SpecOptions(transientlyLinkDependencies: true) ) let pbxProject = try project.generatePbxProj() - + for target in targets { guard let nativeTarget = pbxProject.objects.nativeTargets.referenceValues.first(where: { $0.name == target.name }) else { throw failure("PBXNativeTarget for \(target) not found") @@ -474,7 +474,7 @@ class ProjectGeneratorTests: XCTestCase { let resourcesPhases = pbxProject.objects.resourcesBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } let frameworkPhases = pbxProject.objects.frameworksBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } let copyFilesPhases = pbxProject.objects.copyFilesBuildPhases.objectReferences.filter { buildPhases.contains($0.reference) } - + // ensure only the right resources are copies, no more, no less let expectedResourceFiles = expectedResourceFiles[target.name]! try expect(resourcesPhases.count) == (expectedResourceFiles.isEmpty ? 0 : 1) @@ -483,7 +483,7 @@ class ProjectGeneratorTests: XCTestCase { .compactMap { pbxProject.objects.buildFiles[$0]?.fileRef.flatMap { pbxProject.objects.fileReferences[$0]?.nameOrPath } } try expect(Set(resourceFiles)) == expectedResourceFiles } - + // ensure only the right things are linked, no more, no less let expectedLinkedFiles = expectedLinkedFiles[target.name]! try expect(frameworkPhases.count) == (expectedLinkedFiles.isEmpty ? 0 : 1) @@ -492,7 +492,7 @@ class ProjectGeneratorTests: XCTestCase { .compactMap { pbxProject.objects.buildFiles[$0]?.fileRef.flatMap { pbxProject.objects.fileReferences[$0]?.nameOrPath } } try expect(Set(linkFrameworks)) == expectedLinkedFiles } - + // ensure only the right things are embedded, no more, no less let expectedEmbeddedFrameworks = expectedEmbeddedFrameworks[target.name]! try expect(copyFilesPhases.count) == (expectedEmbeddedFrameworks.isEmpty ? 0 : 1) @@ -557,10 +557,12 @@ class ProjectGeneratorTests: XCTestCase { action: .script("do thing"), name: "My Rule", outputFiles: ["file1.swift", "file2.swift"], - outputFilesCompilerFlags: ["--zee", "--bee"]), + outputFilesCompilerFlags: ["--zee", "--bee"] + ), BuildRule( fileType: .pattern("*.plist"), - action: .compilerSpec("com.apple.build-tasks.copy-plist-file")) + action: .compilerSpec("com.apple.build-tasks.copy-plist-file") + ), ] let pbxProject = try scriptSpec.generatePbxProj() @@ -585,7 +587,6 @@ class ProjectGeneratorTests: XCTestCase { try expect(second.script).beNil() try expect(second.outputFiles) == [] try expect(second.outputFilesCompilerFlags) == [] - } } } diff --git a/Tests/XcodeGenKitTests/SpecLoadingTests.swift b/Tests/XcodeGenKitTests/SpecLoadingTests.swift index 5a2ec7ef8..76d803ad3 100644 --- a/Tests/XcodeGenKitTests/SpecLoadingTests.swift +++ b/Tests/XcodeGenKitTests/SpecLoadingTests.swift @@ -409,8 +409,8 @@ class SpecLoadingTests: XCTestCase { $0.it("decodes dots in dictionary keys") { let dictionary: [String: Any] = [ "test": [ - "one.two": true - ] + "one.two": true, + ], ] let booleans: [String: Bool] = try dictionary.json(atKeyPath: "test")