Skip to content

Commit 6f5232e

Browse files
authored
Supports parsing .target(name:) syntax (#13)
* Supports parsing .target(name:) syntax * Fixes SwiftLint errors
1 parent a80c039 commit 6f5232e

9 files changed

Lines changed: 155 additions & 35 deletions

File tree

Sources/Library/Parsing/PackageSwiftFileParserLive/Internal/IntermediatePackageSwiftFile+Target+Dependency.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ extension IntermediatePackageSwiftFile.Target {
22
enum Dependency: Decodable {
33
private enum CodingKeys: CodingKey {
44
case byName
5+
case target
56
case product
67
}
78

@@ -20,7 +21,9 @@ extension IntermediatePackageSwiftFile.Target {
2021
init(from decoder: Decoder) throws {
2122
let container = try decoder.container(keyedBy: CodingKeys.self)
2223
if container.allKeys.contains(CodingKeys.byName) {
23-
self = try .decodeByName(using: container)
24+
self = try .decodeName(using: container, forKey: .byName)
25+
} else if container.allKeys.contains(CodingKeys.target) {
26+
self = try .decodeName(using: container, forKey: .target)
2427
} else if container.allKeys.contains(CodingKeys.product) {
2528
self = try .decodeProduct(using: container)
2629
} else {
@@ -33,8 +36,8 @@ extension IntermediatePackageSwiftFile.Target {
3336
}
3437

3538
private extension IntermediatePackageSwiftFile.Target.Dependency {
36-
private static func decodeByName(using container: KeyedDecodingContainer<Self.CodingKeys>) throws -> Self {
37-
let values = try container.decode([ByNameComponent].self, forKey: .byName)
39+
private static func decodeName(using container: KeyedDecodingContainer<Self.CodingKeys>, forKey key: CodingKeys) throws -> Self {
40+
let values = try container.decode([NameComponent].self, forKey: key)
3841
guard values.count >= 1 else {
3942
let debugDescription = "Expected to decode at least 1 string but found \(values.count)"
4043
throw DecodingError.dataCorrupted(.init(codingPath: container.codingPath, debugDescription: debugDescription))
@@ -67,7 +70,7 @@ private extension IntermediatePackageSwiftFile.Target.Dependency {
6770
}
6871

6972
extension IntermediatePackageSwiftFile.Target.Dependency {
70-
private enum ByNameComponent: Decodable {
73+
private enum NameComponent: Decodable {
7174
struct PlatformNamesContainer: Decodable {
7275
let platformNames: [String]
7376
}

Tests/PackageSwiftFileParserLiveTests/Mock/DumpPackageServiceMock.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import Foundation
33

44
struct DumpPackageServiceMock: DumpPackageService {
55
private let fileURLMap: [URL: URL] = [
6-
URL.Mock.examplePackageA: Bundle.module.url(forMockDumpPackageNamed: "example-package-a"),
7-
URL.Mock.examplePackageB: Bundle.module.url(forMockDumpPackageNamed: "example-package-b"),
8-
URL.Mock.examplePackageC: Bundle.module.url(forMockDumpPackageNamed: "example-package-c"),
9-
URL.Mock.examplePackageD: Bundle.module.url(forMockDumpPackageNamed: "example-package-d")
6+
URL.Mock.Example.packageA: Bundle.module.url(forMockDataNamed: "example-package-a"),
7+
URL.Mock.Example.packageB: Bundle.module.url(forMockDataNamed: "example-package-b"),
8+
URL.Mock.Example.packageC: Bundle.module.url(forMockDataNamed: "example-package-c"),
9+
URL.Mock.DependencySyntax.byNameWithPlatformNames: Bundle.module.url(forMockDataNamed: "dependency-syntax-byname-with-platform-names"),
10+
URL.Mock.DependencySyntax.target: Bundle.module.url(forMockDataNamed: "dependency-syntax-target")
1011
]
1112

1213
func dumpPackageForSwiftPackageFile(at fileURL: URL) throws -> Data {
@@ -16,7 +17,7 @@ struct DumpPackageServiceMock: DumpPackageService {
1617
}
1718

1819
private extension Bundle {
19-
func url(forMockDumpPackageNamed filename: String) -> URL {
20+
func url(forMockDataNamed filename: String) -> URL {
2021
return url(forResource: "MockData/" + filename, withExtension: "json")!
2122
}
2223
}

Tests/PackageSwiftFileParserLiveTests/Mock/URL+Mock.swift

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@ import Foundation
22

33
extension URL {
44
enum Mock {
5-
static var examplePackageA: URL {
6-
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/ExamplePackageA/Package.swift")
7-
}
5+
enum Example {
6+
static var packageA: URL {
7+
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/PackageA/Package.swift")
8+
}
89

9-
static var examplePackageB: URL {
10-
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/ExamplePackageB/Package.swift")
11-
}
10+
static var packageB: URL {
11+
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/PackageB/Package.swift")
12+
}
1213

13-
static var examplePackageC: URL {
14-
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/ExamplePackageC/Package.swift")
14+
static var packageC: URL {
15+
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/PackageC/Package.swift")
16+
}
1517
}
1618

17-
static var examplePackageD: URL {
18-
return NSURL.fileURL(withPath: "/Users/simon/Developer/Example/ExamplePackageD/Package.swift")
19+
enum DependencySyntax {
20+
static var byNameWithPlatformNames: URL {
21+
return NSURL.fileURL(withPath: "/Users/simon/Developer/DependencySyntax/ByNamePlatformNames/Package.swift")
22+
}
23+
24+
static var target: URL {
25+
return NSURL.fileURL(withPath: "/Users/simon/Developer/DependencySyntax/Target/Package.swift")
26+
}
1927
}
2028
}
2129
}

Tests/PackageSwiftFileParserLiveTests/MockData/example-package-d.json renamed to Tests/PackageSwiftFileParserLiveTests/MockData/dependency-syntax-byname-with-platform-names.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
"fileSystem" : [
77
{
88
"identity" : "examplepackagec",
9-
"path" : "/Users/simon/Developer/Example/ExamplePackageC",
9+
"path" : "/Users/simon/Developer/Example/PackageC",
1010
"productFilter" : null
1111
}
1212
]
1313
}
1414
],
15-
"name" : "ExamplePackageD",
15+
"name" : "DependencySyntaxByNameWithPlatformNames",
1616
"packageKind" : {
1717
"root" : [
18-
"/Users/simon/Developer/Example/ExamplePackageD"
18+
"/Users/simon/Developer/DependencySyntax/ByNameWithPlatformNames"
1919
]
2020
},
2121
"pkgConfig" : null,
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"cLanguageStandard" : null,
3+
"cxxLanguageStandard" : null,
4+
"dependencies" : [
5+
{
6+
"fileSystem" : [
7+
{
8+
"identity" : "examplepackagec",
9+
"path" : "/Users/simon/Developer/Example/PackageC",
10+
"productFilter" : null
11+
}
12+
]
13+
}
14+
],
15+
"name" : "DependencySyntaxTarget",
16+
"packageKind" : {
17+
"root" : [
18+
"/Users/simon/Developer/DependencySyntax/Target"
19+
]
20+
},
21+
"pkgConfig" : null,
22+
"platforms" : [
23+
{
24+
"options" : [
25+
26+
],
27+
"platformName" : "ios",
28+
"version" : "14.0"
29+
}
30+
],
31+
"products" : [
32+
{
33+
"name" : "ExampleLibraryD",
34+
"settings" : [
35+
36+
],
37+
"targets" : [
38+
"ExampleLibraryD"
39+
],
40+
"type" : {
41+
"library" : [
42+
"automatic"
43+
]
44+
}
45+
}
46+
],
47+
"providers" : null,
48+
"swiftLanguageVersions" : null,
49+
"targets" : [
50+
{
51+
"dependencies" : [
52+
{
53+
"target" : [
54+
"ExampleLibraryC",
55+
null
56+
]
57+
}
58+
],
59+
"exclude" : [
60+
61+
],
62+
"name" : "ExampleLibraryD",
63+
"resources" : [
64+
65+
],
66+
"settings" : [
67+
68+
],
69+
"type" : "regular"
70+
}
71+
],
72+
"toolsVersion" : {
73+
"_version" : "5.7.0"
74+
}
75+
}

Tests/PackageSwiftFileParserLiveTests/MockData/example-package-a.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"name" : "ExamplePackageA",
88
"packageKind" : {
99
"root" : [
10-
"/Users/simon/Developer/Example/ExamplePackageA"
10+
"/Users/simon/Developer/Example/PackageA"
1111
]
1212
},
1313
"pkgConfig" : null,

Tests/PackageSwiftFileParserLiveTests/MockData/example-package-b.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"fileSystem" : [
77
{
88
"identity" : "examplepackagec",
9-
"path" : "/Users/simon/Developer/Example/ExamplePackageC",
9+
"path" : "/Users/simon/Developer/Example/PackageC",
1010
"productFilter" : null
1111
}
1212
]
@@ -36,7 +36,7 @@
3636
"name" : "ExamplePackageB",
3737
"packageKind" : {
3838
"root" : [
39-
"/Users/simon/Developer/Example/ExamplePackageB"
39+
"/Users/simon/Developer/Example/PackageB"
4040
]
4141
},
4242
"pkgConfig" : null,

Tests/PackageSwiftFileParserLiveTests/MockData/example-package-c.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"name" : "ExamplePackageC",
88
"packageKind" : {
99
"root" : [
10-
"/Users/simon/Developer/Example/ExamplePackageC"
10+
"/Users/simon/Developer/Example/PackageC"
1111
]
1212
},
1313
"pkgConfig" : null,

Tests/PackageSwiftFileParserLiveTests/PackageSwiftFileParserLiveTests.swift

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ final class PackageSwiftFileParserLiveTests: XCTestCase {
88
let cache = PackageSwiftFileParserCacheMock()
99
let dumpPackageService = DumpPackageServiceMock()
1010
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
11-
let packageSwiftFile = try parser.parseFile(at: URL.Mock.examplePackageA)
11+
let packageSwiftFile = try parser.parseFile(at: URL.Mock.Example.packageA)
1212
XCTAssertEqual(packageSwiftFile.name, "ExamplePackageA")
1313
}
1414

1515
func testParsesProducts() throws {
1616
let cache = PackageSwiftFileParserCacheMock()
1717
let dumpPackageService = DumpPackageServiceMock()
1818
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
19-
let packageSwiftFile = try parser.parseFile(at: URL.Mock.examplePackageA)
19+
let packageSwiftFile = try parser.parseFile(at: URL.Mock.Example.packageA)
2020
XCTAssertEqual(packageSwiftFile.products, [
2121
PackageSwiftFile.Product(name: "ExampleLibraryA", targets: ["ExampleLibraryA"])
2222
])
@@ -26,7 +26,7 @@ final class PackageSwiftFileParserLiveTests: XCTestCase {
2626
let cache = PackageSwiftFileParserCacheMock()
2727
let dumpPackageService = DumpPackageServiceMock()
2828
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
29-
let packageSwiftFile = try parser.parseFile(at: URL.Mock.examplePackageA)
29+
let packageSwiftFile = try parser.parseFile(at: URL.Mock.Example.packageA)
3030
XCTAssertEqual(packageSwiftFile.targets, [
3131
PackageSwiftFile.Target(name: "ExampleLibraryA")
3232
])
@@ -36,11 +36,11 @@ final class PackageSwiftFileParserLiveTests: XCTestCase {
3636
let cache = PackageSwiftFileParserCacheMock()
3737
let dumpPackageService = DumpPackageServiceMock()
3838
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
39-
let swiftPackageFile = try parser.parseFile(at: URL.Mock.examplePackageB)
39+
let swiftPackageFile = try parser.parseFile(at: URL.Mock.Example.packageB)
4040
XCTAssertEqual(swiftPackageFile.dependencies, [
4141
.fileSystem(
4242
identity: "examplepackagec",
43-
path: "/Users/simon/Developer/Example/ExamplePackageC",
43+
path: "/Users/simon/Developer/Example/PackageC",
4444
packageSwiftFile: PackageSwiftFile(
4545
name: "ExamplePackageC",
4646
products: [
@@ -66,13 +66,13 @@ final class PackageSwiftFileParserLiveTests: XCTestCase {
6666
XCTAssertEqual(parsedPackageSwiftFile, cachedPackageSwiftFile)
6767
}
6868

69-
func testParsesByNameDependencyWithPlatformNames() throws {
69+
func testParsesDependencySyntaxByNameDependencyWithPlatformNames() throws {
7070
let cache = PackageSwiftFileParserCacheMock()
7171
let dumpPackageService = DumpPackageServiceMock()
7272
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
73-
let packageSwiftFile = try parser.parseFile(at: URL.Mock.examplePackageD)
73+
let packageSwiftFile = try parser.parseFile(at: URL.Mock.DependencySyntax.byNameWithPlatformNames)
7474
let expectedPackageSwiftFile = PackageSwiftFile(
75-
name: "ExamplePackageD",
75+
name: "DependencySyntaxByNameWithPlatformNames",
7676
products: [
7777
PackageSwiftFile.Product(name: "ExampleLibraryD", targets: ["ExampleLibraryD"])
7878
],
@@ -84,7 +84,40 @@ final class PackageSwiftFileParserLiveTests: XCTestCase {
8484
dependencies: [
8585
.fileSystem(
8686
identity: "examplepackagec",
87-
path: "/Users/simon/Developer/Example/ExamplePackageC",
87+
path: "/Users/simon/Developer/Example/PackageC",
88+
packageSwiftFile: PackageSwiftFile(
89+
name: "ExamplePackageC",
90+
products: [
91+
.init(name: "ExampleLibraryC", targets: ["ExampleLibraryC"])
92+
],
93+
targets: [
94+
.init(name: "ExampleLibraryC")
95+
]
96+
)
97+
)
98+
])
99+
XCTAssertEqual(packageSwiftFile, expectedPackageSwiftFile)
100+
}
101+
102+
func testParsesDependencySyntaxTarget() throws {
103+
let cache = PackageSwiftFileParserCacheMock()
104+
let dumpPackageService = DumpPackageServiceMock()
105+
let parser = PackageSwiftFileParserLive(cache: cache, dumpPackageService: dumpPackageService)
106+
let packageSwiftFile = try parser.parseFile(at: URL.Mock.DependencySyntax.target)
107+
let expectedPackageSwiftFile = PackageSwiftFile(
108+
name: "DependencySyntaxTarget",
109+
products: [
110+
PackageSwiftFile.Product(name: "ExampleLibraryD", targets: ["ExampleLibraryD"])
111+
],
112+
targets: [
113+
PackageSwiftFile.Target(name: "ExampleLibraryD", dependencies: [
114+
.name("ExampleLibraryC")
115+
])
116+
],
117+
dependencies: [
118+
.fileSystem(
119+
identity: "examplepackagec",
120+
path: "/Users/simon/Developer/Example/PackageC",
88121
packageSwiftFile: PackageSwiftFile(
89122
name: "ExamplePackageC",
90123
products: [

0 commit comments

Comments
 (0)