Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to specify "full" scheme actions with TargetScheme #832

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions Sources/ProjectSpec/Scheme.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ public struct Scheme: Equatable {
public var name: String
public var build: Build
public var run: Run?
public var archive: Archive?
public var analyze: Analyze?
public var test: Test?
public var profile: Profile?
public var analyze: Analyze?
public var archive: Archive?

public init(
name: String,
Expand Down Expand Up @@ -62,6 +62,7 @@ public struct Scheme: Equatable {
public var script: String
public var name: String
public var settingsTarget: String?

public init(name: String, script: String, settingsTarget: String? = nil) {
self.script = script
self.name = name
Expand All @@ -78,6 +79,7 @@ public struct Scheme: Equatable {
public var buildImplicitDependencies: Bool
public var preActions: [ExecutionAction]
public var postActions: [ExecutionAction]

public init(
targets: [BuildTarget],
parallelizeBuild: Bool = parallelizeBuildDefault,
Expand Down Expand Up @@ -198,7 +200,6 @@ public struct Scheme: Equatable {
coverageTargets: [TargetReference] = [],
disableMainThreadChecker: Bool = disableMainThreadCheckerDefault,
randomExecutionOrder: Bool = false,
parallelizable: Bool = false,
commandLineArguments: [String: Bool] = [:],
targets: [TestTarget] = [],
preActions: [ExecutionAction] = [],
Expand Down Expand Up @@ -229,6 +230,7 @@ public struct Scheme: Equatable {

public struct Analyze: BuildAction {
public var config: String?

public init(config: String) {
self.config = config
}
Expand All @@ -240,6 +242,7 @@ public struct Scheme: Equatable {
public var preActions: [ExecutionAction]
public var postActions: [ExecutionAction]
public var environmentVariables: [XCScheme.EnvironmentVariable]

public init(
config: String,
commandLineArguments: [String: Bool] = [:],
Expand Down Expand Up @@ -267,6 +270,7 @@ public struct Scheme: Equatable {
public var revealArchiveInOrganizer: Bool
public var preActions: [ExecutionAction]
public var postActions: [ExecutionAction]

public init(
config: String,
customArchiveName: String? = nil,
Expand Down
89 changes: 69 additions & 20 deletions Sources/ProjectSpec/TargetScheme.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,45 +3,63 @@ import JSONUtilities
import XcodeProj

public struct TargetScheme: Equatable {
public static let gatherCoverageDataDefault = false
public static let disableMainThreadCheckerDefault = false
public static let stopOnEveryMainThreadCheckerIssueDefault = false
public static let buildImplicitDependenciesDefault = true
// Explicit action overrides. If these are specified they take precedence over generated actions.
public var build: Scheme.Build?
public var run: Scheme.Run?
public var test: Scheme.Test?
public var profile: Scheme.Profile?
public var analyze: Scheme.Analyze?
public var archive: Scheme.Archive?

public var testTargets: [Scheme.Test.TestTarget]
public var configVariants: [String]
public var gatherCoverageData: Bool
public var gatherCoverageData: Bool?
public var language: String?
public var region: String?
public var disableMainThreadChecker: Bool
public var stopOnEveryMainThreadCheckerIssue: Bool
public var buildImplicitDependencies: Bool
public var disableMainThreadChecker: Bool?
public var stopOnEveryMainThreadCheckerIssue: Bool?
public var parallelizeBuild: Bool?
public var buildImplicitDependencies: Bool?
public var commandLineArguments: [String: Bool]
public var environmentVariables: [XCScheme.EnvironmentVariable]
public var preActions: [Scheme.ExecutionAction]
public var postActions: [Scheme.ExecutionAction]

public init(
build: Scheme.Build? = nil,
run: Scheme.Run? = nil,
test: Scheme.Test? = nil,
profile: Scheme.Profile? = nil,
analyze: Scheme.Analyze? = nil,
archive: Scheme.Archive? = nil,
testTargets: [Scheme.Test.TestTarget] = [],
configVariants: [String] = [],
gatherCoverageData: Bool = gatherCoverageDataDefault,
gatherCoverageData: Bool? = nil,
language: String? = nil,
region: String? = nil,
disableMainThreadChecker: Bool = disableMainThreadCheckerDefault,
stopOnEveryMainThreadCheckerIssue: Bool = stopOnEveryMainThreadCheckerIssueDefault,
buildImplicitDependencies: Bool = buildImplicitDependenciesDefault,
disableMainThreadChecker: Bool? = nil,
stopOnEveryMainThreadCheckerIssue: Bool? = nil,
parallelizeBuild: Bool? = nil,
buildImplicitDependencies: Bool? = nil,
commandLineArguments: [String: Bool] = [:],
environmentVariables: [XCScheme.EnvironmentVariable] = [],
preActions: [Scheme.ExecutionAction] = [],
postActions: [Scheme.ExecutionAction] = []
) {
self.build = build
self.run = run
self.test = test
self.profile = profile
self.analyze = analyze
self.archive = archive
self.testTargets = testTargets
self.configVariants = configVariants
self.gatherCoverageData = gatherCoverageData
self.language = language
self.region = region
self.disableMainThreadChecker = disableMainThreadChecker
self.stopOnEveryMainThreadCheckerIssue = stopOnEveryMainThreadCheckerIssue
self.parallelizeBuild = parallelizeBuild
self.buildImplicitDependencies = buildImplicitDependencies
self.commandLineArguments = commandLineArguments
self.environmentVariables = environmentVariables
Expand All @@ -53,6 +71,13 @@ public struct TargetScheme: Equatable {
extension TargetScheme: JSONObjectConvertible {

public init(jsonDictionary: JSONDictionary) throws {
build = jsonDictionary.json(atKeyPath: "build")
run = jsonDictionary.json(atKeyPath: "run")
test = jsonDictionary.json(atKeyPath: "test")
profile = jsonDictionary.json(atKeyPath: "profile")
analyze = jsonDictionary.json(atKeyPath: "analyze")
archive = jsonDictionary.json(atKeyPath: "archive")

if let targets = jsonDictionary["testTargets"] as? [Any] {
testTargets = try targets.compactMap { target in
if let string = target as? String {
Expand All @@ -67,12 +92,13 @@ extension TargetScheme: JSONObjectConvertible {
testTargets = []
}
configVariants = jsonDictionary.json(atKeyPath: "configVariants") ?? []
gatherCoverageData = jsonDictionary.json(atKeyPath: "gatherCoverageData") ?? TargetScheme.gatherCoverageDataDefault
gatherCoverageData = jsonDictionary.json(atKeyPath: "gatherCoverageData")
language = jsonDictionary.json(atKeyPath: "language")
region = jsonDictionary.json(atKeyPath: "region")
disableMainThreadChecker = jsonDictionary.json(atKeyPath: "disableMainThreadChecker") ?? TargetScheme.disableMainThreadCheckerDefault
stopOnEveryMainThreadCheckerIssue = jsonDictionary.json(atKeyPath: "stopOnEveryMainThreadCheckerIssue") ?? TargetScheme.stopOnEveryMainThreadCheckerIssueDefault
buildImplicitDependencies = jsonDictionary.json(atKeyPath: "buildImplicitDependencies") ?? TargetScheme.buildImplicitDependenciesDefault
disableMainThreadChecker = jsonDictionary.json(atKeyPath: "disableMainThreadChecker")
stopOnEveryMainThreadCheckerIssue = jsonDictionary.json(atKeyPath: "stopOnEveryMainThreadCheckerIssue")
parallelizeBuild = jsonDictionary.json(atKeyPath: "parallelizeBuild")
buildImplicitDependencies = jsonDictionary.json(atKeyPath: "buildImplicitDependencies")
commandLineArguments = jsonDictionary.json(atKeyPath: "commandLineArguments") ?? [:]
environmentVariables = try XCScheme.EnvironmentVariable.parseAll(jsonDictionary: jsonDictionary)
preActions = jsonDictionary.json(atKeyPath: "preActions") ?? []
Expand All @@ -90,20 +116,43 @@ extension TargetScheme: JSONEncodable {
"preActions": preActions.map { $0.toJSONValue() },
"postActions": postActions.map { $0.toJSONValue() },
]

if let build = build {
dict["build"] = build.toJSONValue()
}
if let run = run {
dict["run"] = run.toJSONValue()
}
if let test = test {
dict["test"] = test.toJSONValue()
}
if let profile = profile {
dict["profile"] = profile.toJSONValue()
}
if let analyze = analyze {
dict["analyze"] = analyze.toJSONValue()
}
if let archive = archive {
dict["archive"] = archive.toJSONValue()
}

if gatherCoverageData != TargetScheme.gatherCoverageDataDefault {
if let gatherCoverageData = gatherCoverageData {
dict["gatherCoverageData"] = gatherCoverageData
}

if disableMainThreadChecker != TargetScheme.disableMainThreadCheckerDefault {
if let disableMainThreadChecker = disableMainThreadChecker {
dict["disableMainThreadChecker"] = disableMainThreadChecker
}

if stopOnEveryMainThreadCheckerIssue != TargetScheme.stopOnEveryMainThreadCheckerIssueDefault {
if let stopOnEveryMainThreadCheckerIssue = stopOnEveryMainThreadCheckerIssue {
dict["stopOnEveryMainThreadCheckerIssue"] = stopOnEveryMainThreadCheckerIssue
}

if let parallelizeBuild = parallelizeBuild {
dict["parallelizeBuild"] = parallelizeBuild
}

if buildImplicitDependencies != TargetScheme.buildImplicitDependenciesDefault {
if let buildImplicitDependencies = buildImplicitDependencies {
dict["buildImplicitDependencies"] = buildImplicitDependencies
}

Expand Down
23 changes: 12 additions & 11 deletions Sources/XcodeGenKit/SchemeGenerator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -312,40 +312,41 @@ extension Scheme {
public init(name: String, target: Target, targetScheme: TargetScheme, project: Project, debugConfig: String, releaseConfig: String) {
self.init(
name: name,
build: .init(
build: targetScheme.build ?? .init(
targets: Scheme.buildTargets(for: target, project: project),
buildImplicitDependencies: targetScheme.buildImplicitDependencies,
parallelizeBuild: targetScheme.parallelizeBuild ?? Build.parallelizeBuildDefault,
buildImplicitDependencies: targetScheme.buildImplicitDependencies ?? Build.buildImplicitDependenciesDefault,
preActions: targetScheme.preActions,
postActions: targetScheme.postActions
),
run: .init(
run: targetScheme.run ?? .init(
config: debugConfig,
commandLineArguments: targetScheme.commandLineArguments,
environmentVariables: targetScheme.environmentVariables,
disableMainThreadChecker: targetScheme.disableMainThreadChecker,
stopOnEveryMainThreadCheckerIssue: targetScheme.stopOnEveryMainThreadCheckerIssue,
disableMainThreadChecker: targetScheme.disableMainThreadChecker ?? Run.disableMainThreadCheckerDefault,
stopOnEveryMainThreadCheckerIssue: targetScheme.stopOnEveryMainThreadCheckerIssue ?? Run.stopOnEveryMainThreadCheckerIssueDefault,
language: targetScheme.language,
region: targetScheme.region
),
test: .init(
test: targetScheme.test ?? .init(
config: debugConfig,
gatherCoverageData: targetScheme.gatherCoverageData,
disableMainThreadChecker: targetScheme.disableMainThreadChecker,
gatherCoverageData: targetScheme.gatherCoverageData ?? Test.gatherCoverageDataDefault,
disableMainThreadChecker: targetScheme.disableMainThreadChecker ?? Test.disableMainThreadCheckerDefault,
commandLineArguments: targetScheme.commandLineArguments,
targets: targetScheme.testTargets,
environmentVariables: targetScheme.environmentVariables,
language: targetScheme.language,
region: targetScheme.region
),
profile: .init(
profile: targetScheme.profile ?? .init(
config: releaseConfig,
commandLineArguments: targetScheme.commandLineArguments,
environmentVariables: targetScheme.environmentVariables
),
analyze: .init(
analyze: targetScheme.analyze ?? .init(
config: debugConfig
),
archive: .init(
archive: targetScheme.archive ?? .init(
config: releaseConfig
)
)
Expand Down
Loading