Skip to content

Commit b4a433d

Browse files
Merge pull request #3 from emans/feature/support_commit
Support Revision and Branch attributes
2 parents 4576c47 + 6c91a49 commit b4a433d

File tree

15 files changed

+379
-13
lines changed

15 files changed

+379
-13
lines changed

Example/Config/RemoteDependencies.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99
"name": "RemoteDependencyB",
1010
"url": "https://github.com/DependencyB",
1111
"version": "2.0.0"
12+
},
13+
{
14+
"name": "RemoteDependencyC",
15+
"url": "https://github.com/DependencyC",
16+
"revision": "abcde1235kjh"
17+
},
18+
{
19+
"name": "RemoteDependencyD",
20+
"url": "https://github.com/DependencyC",
21+
"branch": "master"
1222
}
1323
]
1424
}

Example/Packages/Example/Example.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
},
2626
{
2727
"name": "RemoteDependencyB"
28+
},
29+
{
30+
"name": "RemoteDependencyC"
2831
}
2932
],
3033
"targets": [

Example/Packages/Example/Package.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ let package = Package(
3030
url: "https://github.com/DependencyB",
3131
exact: "2.0.0"
3232
),
33+
.package(
34+
url: "https://github.com/DependencyC",
35+
revision: "abcde1235kjh"
36+
),
3337
],
3438
targets: [
3539
.target(

README.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,21 @@ The command `generate-package` requires the following arguments:
2727
"name": "ViewInspector",
2828
"url": "https://github.com/nalexn/ViewInspector",
2929
"version": "0.9.2"
30+
},
31+
{
32+
"name": "ViewInspector",
33+
"url": "https://github.com/nalexn/ViewInspector",
34+
"version": "0.9.2"
35+
},
36+
{
37+
"name": "SnapshotTesting",
38+
"url": "https://github.com/pointfreeco/swift-snapshot-testing",
39+
"branch": "master"
40+
},
41+
{
42+
"name": "Fastlane",
43+
"url": "https://github.com/fastlane/fastlane.git",
44+
"revision": "2c4f29fe161c5998e30000f96d23384fd0eebe90"
3045
}
3146
]
3247
}
@@ -60,6 +75,12 @@ Packages should be contained in respective folders inside a packages folder and
6075
"name": "ViewInspector",
6176
"version": "1.2.3"
6277
},
78+
{
79+
"name": "Fastlane"
80+
},
81+
{
82+
"name": "SnapshotTesting"
83+
},
6384
],
6485
"targets": [
6586
{
@@ -68,6 +89,9 @@ Packages should be contained in respective folders inside a packages folder and
6889
"dependencies": [
6990
{
7091
"name": "Alamofire"
92+
},
93+
{
94+
"name": "Fastlane"
7195
}
7296
],
7397
"sourcesPath": "Framework/Sources",
@@ -83,6 +107,9 @@ Packages should be contained in respective folders inside a packages folder and
83107
},
84108
{
85109
"name": "ViewInspector"
110+
},
111+
{
112+
"name": "SnapshotTesting"
86113
}
87114
],
88115
"sourcesPath": "Tests/Sources",
@@ -92,7 +119,7 @@ Packages should be contained in respective folders inside a packages folder and
92119
}
93120
```
94121

95-
> Note that `PackageGenerator` will automatically retrieve `url` & `version` values for `remoteDependencies` from the `RemoteDependencies.json` file. If you need to override those values, you can set them in the package spec.
122+
> Note that `PackageGenerator` will automatically retrieve `url` & ( `version` || `branch` || `revision` ) values for `remoteDependencies` from the `RemoteDependencies.json` file. If you need to override those values, you can set them in the package spec.
96123
97124
We provide a default Stencil template that `PackageGenerator` can work with.
98125

Sources/Core/SpecGenerator.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ final class SpecGenerator {
4545
guard let dependency = dependencies.first(where: { $0.name == remoteDependency.name }) else { return nil }
4646
return RemoteDependency(name: dependency.name,
4747
url: remoteDependency.url ?? dependency.url,
48-
version: remoteDependency.version ?? dependency.version)
48+
version: remoteDependency.version ?? dependency.version,
49+
revision: remoteDependency.revision ?? dependency.revision,
50+
branch: remoteDependency.branch ?? dependency.branch)
4951
}
5052

5153
return Spec(name: partialSpec.name,

Sources/Models/Dependencies.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,19 @@ struct Dependencies: Decodable {
99
struct Dependency: Decodable {
1010
let name: String
1111
let url: String
12-
let version: String
12+
let version: String?
13+
let revision: String?
14+
let branch: String?
15+
16+
init(name: String, url: String, version: String?, revision: String?, branch: String?) {
17+
guard version != nil || revision != nil || branch != nil else {
18+
fatalError("You need to provide at least one of the following: version, revision or branch")
19+
}
20+
21+
self.name = name
22+
self.url = url
23+
self.version = version
24+
self.revision = revision
25+
self.branch = branch
26+
}
1327
}

Sources/Models/Spec.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,36 @@ struct RemoteDependency: Decodable {
8383
let name: String
8484
let url: String?
8585
let version: String?
86-
86+
let revision: String?
87+
let branch: String?
88+
8789
enum CodingKeys: CodingKey {
8890
case name
8991
case url
9092
case version
93+
case revision
94+
case branch
9195
}
9296

9397
init(from decoder: Decoder) throws {
9498
let container = try decoder.container(keyedBy: CodingKeys.self)
9599
self.name = try container.decode(String.self, forKey: .name)
96100
self.url = try container.decodeIfPresent(String.self, forKey: .url)
97101
self.version = try container.decodeIfPresent(String.self, forKey: .version)
102+
self.revision = try container.decodeIfPresent(String.self, forKey: .revision)
103+
self.branch = try container.decodeIfPresent(String.self, forKey: .branch)
98104
}
99105

100-
init(name: String, url: String, version: String) {
106+
init(name: String, url: String, version: String?, revision: String?, branch: String?) {
107+
guard version != nil || revision != nil || branch != nil else {
108+
fatalError("You need to provide at least one of the following: version, revision or branch")
109+
}
110+
101111
self.name = name
102112
self.url = url
103113
self.version = version
114+
self.revision = revision
115+
self.branch = branch
104116
}
105117
}
106118

Templates/Package.stencil

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,13 @@ let package = Package(
9595
{% for remote_dependency in remote_dependencies %}
9696
.package(
9797
url: "{{ remote_dependency.url }}",
98+
{% if remote_dependency.version %}
9899
exact: "{{ remote_dependency.version }}"
100+
{% elif remote_dependency.revision %}
101+
revision: "{{ remote_dependency.revision }}"
102+
{% elif remote_dependency.branch %}
103+
branch: "{{ remote_dependency.branch }}"
104+
{% endif %}
99105
),
100106
{% endfor %}
101107
],

Tests/PackageGeneratorTests.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import XCTest
66
final class PackageGeneratorTests: XCTestCase {
77

88
enum PackageType: String {
9+
case revisionProduct = "RevisionProduct"
10+
case branchProduct = "BranchProduct"
911
case singleProduct = "SingleProduct"
1012
case multipleProducts = "MultipleProducts"
1113
case customPlatforms = "CustomPlatforms"
@@ -14,23 +16,31 @@ final class PackageGeneratorTests: XCTestCase {
1416
case executableProduct = "ExecutableProduct"
1517
case plugins = "PluginProduct"
1618
}
17-
19+
1820
let resourcesFolder = URL(fileURLWithPath: #file)
1921
.deletingLastPathComponent()
2022
.appendingPathComponent("Resources")
21-
23+
2224
lazy var packagesFolderUrl = resourcesFolder.appendingPathComponent("Packages")
2325
lazy var dependenciesUrl = resourcesFolder.appendingPathComponent("TestRemoteDependencies.json")
2426
lazy var templatePath = resourcesFolder.appendingPathComponent("Package.stencil")
25-
27+
2628
func test_SingleProduct() throws {
2729
try assertPackage(for: .singleProduct)
2830
}
29-
31+
32+
func test_RevisionProduct() throws {
33+
try assertPackage(for: .revisionProduct)
34+
}
35+
36+
func test_BranchProduct() throws {
37+
try assertPackage(for: .branchProduct)
38+
}
39+
3040
func test_MultipleProducts() throws {
3141
try assertPackage(for: .multipleProducts)
3242
}
33-
43+
3444
func test_customPlatforms() throws {
3545
try assertPackage(for: .customPlatforms)
3646
}
@@ -50,20 +60,20 @@ final class PackageGeneratorTests: XCTestCase {
5060
func test_pluginProduct() throws {
5161
try assertPackage(for: .plugins)
5262
}
53-
63+
5464
private func assertPackage(for packageType: PackageType) throws {
5565
let packageSpecUrl = resourcesFolder
5666
.appendingPathComponent("Packages")
5767
.appendingPathComponent(packageType.rawValue)
5868
.appendingPathComponent(packageType.rawValue)
5969
.appendingPathExtension("json")
60-
70+
6171
let packageUrl = resourcesFolder
6272
.appendingPathComponent("Packages")
6373
.appendingPathComponent(packageType.rawValue)
6474
.appendingPathComponent("\(packageType.rawValue)Package")
6575
.appendingPathExtension("swift")
66-
76+
6777
let specGenerator = SpecGenerator(dependenciesUrl: dependenciesUrl, packagesFolder: packagesFolderUrl)
6878
let spec = try specGenerator.makeSpec(for: packageType.rawValue, specUrl: packageSpecUrl)
6979
let templater = Templater(templatePath: templatePath.absoluteString)

Tests/Resources/Package.stencil

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,13 @@ let package = Package(
9595
{% for remote_dependency in remote_dependencies %}
9696
.package(
9797
url: "{{ remote_dependency.url }}",
98+
{% if remote_dependency.version %}
9899
exact: "{{ remote_dependency.version }}"
100+
{% elif remote_dependency.revision %}
101+
revision: "{{ remote_dependency.revision }}"
102+
{% elif remote_dependency.branch %}
103+
branch: "{{ remote_dependency.branch }}"
104+
{% endif %}
99105
),
100106
{% endfor %}
101107
],

0 commit comments

Comments
 (0)