mirror of
https://github.com/yonaskolb/XcodeGen.git
synced 2026-03-18 20:02:25 +00:00
245f17117a
* support local Swift Package test case into test scheme * update test * add test * update CHABGELOG.md * Update CHANGELOG.md * revert resolved package test * Update Sources/XcodeGenKit/SchemeGenerator.swift Co-authored-by: Kohki Miki <giginet.net@gmail.com> * make TargetReference convert from new JSON format * add .package for location of target reference * receive target reference format at target of scheme * update test * update XcodeProj * add test and fix small bugs * update docs * support multiple style of coverageTargets * add edge case of parsing test targets * fix docs * Update Docs/ProjectSpec.md Co-authored-by: Yonas Kolb <yonaskolb@users.noreply.github.com> * create TestableTargetReference for not making API complex * fix code format * fix parameter name to Testable Target Reference * support directly writing key of Testable Target Reference * fix compile error in build Co-authored-by: Kohki Miki <giginet.net@gmail.com> Co-authored-by: Yonas Kolb <yonaskolb@users.noreply.github.com>
113 lines
3.4 KiB
Swift
113 lines
3.4 KiB
Swift
import Foundation
|
|
import JSONUtilities
|
|
|
|
public struct TestableTargetReference: Hashable {
|
|
public var name: String
|
|
public var location: Location
|
|
|
|
public var targetReference: TargetReference {
|
|
switch location {
|
|
case .local:
|
|
return TargetReference(name: name, location: .local)
|
|
case .project(let projectName):
|
|
return TargetReference(name: name, location: .project(projectName))
|
|
case .package:
|
|
fatalError("Package target is only available for testable")
|
|
}
|
|
}
|
|
|
|
public enum Location: Hashable {
|
|
case local
|
|
case project(String)
|
|
case package(String)
|
|
}
|
|
|
|
public init(name: String, location: Location) {
|
|
self.name = name
|
|
self.location = location
|
|
}
|
|
}
|
|
|
|
extension TestableTargetReference {
|
|
public init(_ string: String) throws {
|
|
let paths = string.split(separator: "/")
|
|
switch paths.count {
|
|
case 2:
|
|
location = .project(String(paths[0]))
|
|
name = String(paths[1])
|
|
case 1:
|
|
location = .local
|
|
name = String(paths[0])
|
|
default:
|
|
throw SpecParsingError.invalidTargetReference(string)
|
|
}
|
|
}
|
|
|
|
public static func local(_ name: String) -> TestableTargetReference {
|
|
TestableTargetReference(name: name, location: .local)
|
|
}
|
|
|
|
public static func project(_ name: String) -> TestableTargetReference {
|
|
let paths = name.split(separator: "/")
|
|
return TestableTargetReference(name: String(paths[1]), location: .project(String(paths[0])))
|
|
}
|
|
|
|
public static func package(_ name: String) -> TestableTargetReference {
|
|
let paths = name.split(separator: "/")
|
|
return TestableTargetReference(name: String(paths[1]), location: .package(String(paths[0])))
|
|
}
|
|
}
|
|
|
|
extension TestableTargetReference: ExpressibleByStringLiteral {
|
|
public init(stringLiteral value: String) {
|
|
try! self.init(value)
|
|
}
|
|
}
|
|
|
|
extension TestableTargetReference: CustomStringConvertible {
|
|
public var reference: String {
|
|
switch location {
|
|
case .local: return name
|
|
case .project(let root), .package(let root):
|
|
return "\(root)/\(name)"
|
|
}
|
|
}
|
|
|
|
public var description: String {
|
|
reference
|
|
}
|
|
}
|
|
|
|
extension TestableTargetReference: JSONObjectConvertible {
|
|
|
|
public init(jsonDictionary: JSONDictionary) throws {
|
|
if let project: String = jsonDictionary.json(atKeyPath: "project") {
|
|
let paths = project.split(separator: "/")
|
|
name = String(paths[1])
|
|
location = .project(String(paths[0]))
|
|
} else if let project: String = jsonDictionary.json(atKeyPath: "package") {
|
|
let paths = project.split(separator: "/")
|
|
name = String(paths[1])
|
|
location = .package(String(paths[0]))
|
|
} else {
|
|
name = try jsonDictionary.json(atKeyPath: "local")
|
|
location = .local
|
|
}
|
|
}
|
|
}
|
|
|
|
extension TestableTargetReference: JSONEncodable {
|
|
public func toJSONValue() -> Any {
|
|
var dictionary: JSONDictionary = [:]
|
|
switch self.location {
|
|
case .package(let packageName):
|
|
dictionary["package"] = "\(packageName)/\(name)"
|
|
case .project(let projectName):
|
|
dictionary["project"] = "\(projectName)/\(name)"
|
|
case .local:
|
|
dictionary["local"] = name
|
|
}
|
|
return dictionary
|
|
}
|
|
}
|