Skip to content

Commit 342fa9e

Browse files
committed
Wire up combined parsing
1 parent d0dd9db commit 342fa9e

File tree

4 files changed

+82
-43
lines changed

4 files changed

+82
-43
lines changed

Sources/ReleaseNotesCore/PackageResolved.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,23 @@ extension PackageResolved {
8383
}
8484

8585

86+
extension PackageResolved {
87+
func getPackageMap() -> [PackageId: URL] {
88+
switch self {
89+
case let .v1(value):
90+
return Dictionary(value.object.pins
91+
.map { ($0.package, $0.repositoryURL) },
92+
uniquingKeysWith: { first, _ in first })
93+
94+
case let .v2(value):
95+
return Dictionary(value.pins
96+
.map { ($0.identity, $0.location) },
97+
uniquingKeysWith: { first, _ in first })
98+
}
99+
}
100+
}
101+
102+
86103
extension PackageResolved: Decodable {
87104
init(from decoder: Decoder) throws {
88105
if let value = try? decoder.singleValueContainer().decode(V1.self) {

Sources/ReleaseNotesCore/ReleaseNotes.swift

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ struct ReleaseNotes: AsyncParsableCommand {
2525
var workingDirecory: String = "."
2626

2727
func runAsync() async throws {
28-
guard let packageMap = Self.getPackageMap(at: workingDirecory) else {
29-
print("Failed to parse Package.resolved in \(workingDirecory).")
28+
let path = URL(fileURLWithPath: workingDirecory)
29+
.appendingPathComponent("Package.resolved").path
30+
guard let packageMap = Self.getPackageMap(at: path) else {
31+
print("Failed to parse \(path).")
3032
return
3133
}
3234

@@ -90,54 +92,16 @@ struct ReleaseNotes: AsyncParsableCommand {
9092
return process
9193
}
9294

93-
// static func decodePackageResolved(at url: URL) -> [PackageId: URL]? {
94-
// // object:
95-
// // pins:
96-
// // - package: String
97-
// // repositoryURL: URL
98-
// // state:
99-
// // branch: String?
100-
// // revision: CommitHash
101-
// // version: SemVer?
102-
// // - ...
103-
// // version: 1
104-
// struct PackageResolvedV1: Decodable {
105-
// var object: Object
106-
//
107-
// struct Object: Decodable {
108-
// var pins: [Pin]
109-
//
110-
// struct Pin: Decodable {
111-
// var package: String
112-
// var repositoryURL: URL
113-
// }
114-
// }
115-
// }
116-
//
117-
// guard FileManager.default.fileExists(atPath: url.path),
118-
// let json = FileManager.default.contents(atPath: url.path),
119-
// let packageResolved = try? JSONDecoder()
120-
// .decode(PackageResolvedV1.self, from: json)
121-
// else {
122-
// return nil
123-
// }
124-
// }
125-
12695
static func getPackageMap(at path: String) -> [PackageId: URL]? {
127-
let filePath = URL(fileURLWithPath: path)
128-
.appendingPathComponent("Package.resolved").path
129-
guard FileManager.default.fileExists(atPath: filePath),
130-
let json = FileManager.default.contents(atPath: filePath),
96+
guard FileManager.default.fileExists(atPath: path),
97+
let json = FileManager.default.contents(atPath: path),
13198
let packageResolved = try? JSONDecoder()
13299
.decode(PackageResolved.self, from: json)
133100
else {
134101
return nil
135102
}
136103

137-
// return Dictionary(packageResolved.object.pins
138-
// .map { ($0.package, $0.repositoryURL) },
139-
// uniquingKeysWith: { first, _ in first })
140-
return [:]
104+
return packageResolved.getPackageMap()
141105
}
142106

143107
}

Tests/ReleaseNotesTests/PackageResolvedTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,11 @@ final class ReleaseNotesCoreTests: XCTestCase {
2525
XCTAssertEqual(map?.count, 3)
2626
}
2727

28+
func test_getPackageMap_v2() throws {
29+
let path = fixtureUrl(for: "Package.resolved-v2.json").path
30+
let map = ReleaseNotes.getPackageMap(at: path)
31+
32+
XCTAssertEqual(map?.count, 5)
33+
}
34+
2835
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright 2022 Dave Verwer, Sven A. Schmidt, and other contributors.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
@testable import ReleaseNotesCore
16+
import XCTest
17+
18+
19+
final class PackageResolvedTests: XCTestCase {
20+
21+
func test_decode_v1() throws {
22+
let data = try fixtureData(for: "Package.resolved-v1.json")
23+
let res = try JSONDecoder().decode(PackageResolved.self, from: data)
24+
25+
XCTAssertEqual(res.v1?.object.pins.count, 3)
26+
XCTAssertEqual(res.v2, nil)
27+
}
28+
29+
func test_decode_v2() throws {
30+
let data = try fixtureData(for: "Package.resolved-v2.json")
31+
let res = try JSONDecoder().decode(PackageResolved.self, from: data)
32+
33+
XCTAssertEqual(res.v1, nil)
34+
XCTAssertEqual(res.v2?.pins.count, 5)
35+
}
36+
37+
func test_getPackageMap_v1() throws {
38+
let data = try fixtureData(for: "Package.resolved-v1.json")
39+
let res = try JSONDecoder().decode(PackageResolved.self, from: data)
40+
41+
XCTAssertEqual(res.getPackageMap().count, 3)
42+
}
43+
44+
func test_getPackageMap_v2() throws {
45+
let data = try fixtureData(for: "Package.resolved-v2.json")
46+
let res = try JSONDecoder().decode(PackageResolved.self, from: data)
47+
48+
XCTAssertEqual(res.getPackageMap().count, 5)
49+
}
50+
51+
}

0 commit comments

Comments
 (0)