danger-spm_version_updates 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -9,6 +9,7 @@ RSpec::Core::RakeTask.new(:specs)
9
9
 
10
10
  task default: :specs
11
11
 
12
+ desc "Run all test and lint tasks"
12
13
  task :spec do
13
14
  Rake::Task["specs"].invoke
14
15
  Rake::Task["rubocop"].invoke
@@ -19,6 +20,7 @@ desc "Run RuboCop on the lib/specs directory"
19
20
  RuboCop::RakeTask.new(:rubocop) { |task|
20
21
  task.requires << "rubocop-rspec"
21
22
  task.requires << "rubocop-rake"
23
+ task.requires << "rubocop-performance"
22
24
  task.patterns = ["lib/**/*.rb", "spec/**/*.rb"]
23
25
  }
24
26
 
@@ -13,34 +13,38 @@ Gem::Specification.new do |spec|
13
13
  spec.summary = "A Danger plugin to detect if there are any updates to your Swift Package Manager dependencies."
14
14
  spec.homepage = "https://github.com/hbmartin/danger-spm_version_updates"
15
15
  spec.license = "MIT"
16
- spec.required_ruby_version = ">= 2.7"
16
+ spec.required_ruby_version = ">= 3.0"
17
17
 
18
18
  spec.files = `git ls-files`.split($/)
19
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
20
  spec.require_paths = ["lib"]
21
+ spec.metadata["rubygems_mfa_required"] = "true"
22
22
 
23
23
  spec.add_runtime_dependency("danger-plugin-api", "~> 1.0")
24
24
  spec.add_runtime_dependency("semantic", "~> 1.6")
25
- spec.add_runtime_dependency("xcodeproj", "~> 1.23")
25
+ spec.add_runtime_dependency("xcodeproj", "~> 1.24")
26
26
 
27
27
  # General ruby development
28
28
  spec.add_development_dependency("bundler", "~> 2.0")
29
29
  spec.add_development_dependency("rake", "~> 13.0")
30
30
 
31
31
  # Testing support
32
- spec.add_development_dependency("rspec", "~> 3.4")
32
+ spec.add_development_dependency("rspec", "~> 3.9")
33
+ spec.add_development_dependency("simplecov", "~> 0.22")
34
+ spec.add_development_dependency("simplecov-cobertura", "~> 2.1")
33
35
 
34
36
  # Linting code and docs
35
37
  spec.add_development_dependency("reek")
36
- spec.add_development_dependency("rubocop")
38
+ spec.add_development_dependency("rubocop", "~> 1.62")
39
+ spec.add_development_dependency("rubocop-performance")
37
40
  spec.add_development_dependency("rubocop-rake")
38
41
  spec.add_development_dependency("rubocop-rspec")
39
- spec.add_development_dependency("yard")
42
+ spec.add_development_dependency("yard", "~> 0.9.36")
40
43
 
41
44
  # Makes testing easy via `bundle exec guard`
42
- spec.add_development_dependency("guard", "~> 2.14")
45
+ spec.add_development_dependency("guard", "~> 2.16")
43
46
  spec.add_development_dependency("guard-rspec", "~> 4.7")
47
+ spec.add_development_dependency("guard-rubocop", "~> 1.2")
44
48
 
45
49
  # If you want to work on older builds of ruby
46
50
  spec.add_development_dependency("listen", "3.0.7")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SpmVersionUpdates
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
@@ -35,16 +35,8 @@ module Danger
35
35
  # The path to your Xcode project
36
36
  # @return [void]
37
37
  def check_for_updates(xcodeproj_path)
38
- raise(XcodeprojPathMustBeSet) if xcodeproj_path.nil?
39
-
40
- project = Xcodeproj::Project.open(xcodeproj_path)
41
- remote_packages = filter_remote_packages(project)
42
-
43
- resolved_path = find_packages_resolved(xcodeproj_path)
44
- raise(CouldNotFindResolvedFile) unless File.exist?(resolved_path)
45
-
46
- resolved_versions = JSON.load_file!(resolved_path)["pins"]
47
- .to_h { |pin| [pin["location"], pin["state"]["version"] || pin["state"]["revision"]] }
38
+ remote_packages = get_remote_package(xcodeproj_path)
39
+ resolved_versions = get_resolved_versions(xcodeproj_path)
48
40
 
49
41
  remote_packages.each { |repository_url, requirement|
50
42
  next if ignore_repos&.include?(repository_url)
@@ -55,9 +47,10 @@ module Danger
55
47
 
56
48
  # kind can be major, minor, range, exact, branch, or commit
57
49
 
58
- if kind == "branch" && check_when_exact
59
- last_commit = git_branch_last_commit(repository_url, requirement["branch"])
60
- warn("Newer commit available for #{name}: #{last_commit}") unless last_commit == resolved_version
50
+ if kind == "branch"
51
+ branch = requirement["branch"]
52
+ last_commit = git_branch_last_commit(repository_url, branch)
53
+ warn("Newer commit available for #{name} (#{branch}): #{last_commit}") unless last_commit == resolved_version
61
54
  next
62
55
  end
63
56
 
@@ -70,12 +63,34 @@ module Danger
70
63
  warn_for_new_versions(:major, available_versions, name, resolved_version)
71
64
  elsif kind == "upToNextMinorVersion"
72
65
  warn_for_new_versions(:minor, available_versions, name, resolved_version)
73
- elsif kind == "range"
66
+ elsif kind == "versionRange"
74
67
  warn_for_new_versions_range(available_versions, name, requirement, resolved_version)
75
68
  end
76
69
  }
77
70
  end
78
71
 
72
+ # Extracts remote packages from an Xcode project
73
+ # @param [String] xcodeproj_path
74
+ # The path to your Xcode project
75
+ # @return [Hash<String, Hash>]
76
+ def get_remote_package(xcodeproj_path)
77
+ raise(XcodeprojPathMustBeSet) if xcodeproj_path.nil?
78
+
79
+ filter_remote_packages(Xcodeproj::Project.open(xcodeproj_path))
80
+ end
81
+
82
+ # Extracts resolved versions from Package.resolved relative to an Xcode project
83
+ # @param [String] xcodeproj_path
84
+ # The path to your Xcode project
85
+ # @return [Hash<String, String>]
86
+ def get_resolved_versions(xcodeproj_path)
87
+ resolved_path = find_packages_resolved_file(xcodeproj_path)
88
+ raise(CouldNotFindResolvedFile) unless File.exist?(resolved_path)
89
+
90
+ JSON.load_file!(resolved_path)["pins"]
91
+ .to_h { |pin| [pin["location"], pin["state"]["version"] || pin["state"]["revision"]] }
92
+ end
93
+
79
94
  # Extract a readable name for the repo given the url, generally org/repo
80
95
  # @return [String]
81
96
  def repo_name(repo_url)
@@ -100,7 +115,7 @@ module Danger
100
115
 
101
116
  # Find the Packages.resolved file
102
117
  # @return [String]
103
- def find_packages_resolved(xcodeproj_path)
118
+ def find_packages_resolved_file(xcodeproj_path)
104
119
  if Dir.exist?(xcodeproj_path.sub("xcodeproj", "xcworkspace"))
105
120
  File.join(xcodeproj_path.sub("xcodeproj", "xcworkspace"), "xcshareddata", "swiftpm", "Package.resolved")
106
121
  else
@@ -129,7 +144,7 @@ Newer version of #{name}: #{newest_version} (but this package is set to exact ve
129
144
  newest_meeting_reqs = available_versions.find { |version|
130
145
  version < max_version && (report_pre_releases ? true : version.pre.nil?)
131
146
  }
132
- warn("Newer version of #{name}: #{newest_meeting_reqs} ") unless newest_meeting_reqs.to_s == resolved_version
147
+ warn("Newer version of #{name}: #{newest_meeting_reqs}") unless newest_meeting_reqs.to_s == resolved_version
133
148
  warn(
134
149
  <<-TEXT
135
150
  Newest version of #{name}: #{available_versions.first} (but this package is configured up to the next #{max_version} version)
@@ -160,7 +175,7 @@ Newest version of #{name}: #{available_versions.first} (but this package is conf
160
175
  # Remove git call to list tags
161
176
  # @return [Array<Semantic::Version>]
162
177
  def git_versions(repo_url)
163
- `git ls-remote -t #{repo_url}`
178
+ versions = `git ls-remote -t #{repo_url}`
164
179
  .split("\n")
165
180
  .map { |line| line.split("/tags/").last }
166
181
  .filter_map { |line|
@@ -170,8 +185,9 @@ Newest version of #{name}: #{available_versions.first} (but this package is conf
170
185
  nil
171
186
  end
172
187
  }
173
- .sort
174
- .reverse
188
+ versions.sort!
189
+ versions.reverse!
190
+ versions
175
191
  end
176
192
 
177
193
  def git_branch_last_commit(repo_url, branch_name)
data/spec/spec_helper.rb CHANGED
@@ -11,12 +11,6 @@ require "pry"
11
11
  require "danger"
12
12
  require "rspec"
13
13
 
14
- if `git remote -v` == ""
15
- puts "You cannot run tests without setting a local git remote on this repo"
16
- puts "It's a weird side-effect of Danger's internals."
17
- exit(0)
18
- end
19
-
20
14
  # Use coloured output, it's the best.
21
15
  RSpec.configure do |config|
22
16
  config.filter_gems_from_backtrace("bundler")
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "simplecov"
4
+ SimpleCov.start
5
+
6
+ require "simplecov-cobertura"
7
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
8
+
3
9
  require File.expand_path("spec_helper", __dir__)
4
10
 
5
11
  module Danger
@@ -139,6 +145,36 @@ module Danger
139
145
 
140
146
  expect(@dangerfile.status_report[:warnings]).to eq(["Newest version of kean/Nuke: 13.0.0 (but this package is configured up to the next major version)\n"])
141
147
  end
148
+
149
+ it "Does report new versions for ranges" do
150
+ allow(@my_plugin).to receive(:git_versions)
151
+ .and_return [
152
+ Semantic::Version.new("13.0.0"),
153
+ Semantic::Version.new("12.1.6"),
154
+ Semantic::Version.new("12.1.7"),
155
+ ].sort.reverse
156
+
157
+ @my_plugin.check_for_updates("#{File.dirname(__FILE__)}/support/fixtures/VersionRange.xcodeproj")
158
+
159
+ expect(@dangerfile.status_report[:warnings]).to eq(
160
+ [
161
+ "Newer version of kean/Nuke: 12.1.7",
162
+ ]
163
+ )
164
+ end
165
+
166
+ it "Does report new versions for branches" do
167
+ allow(@my_plugin).to receive(:git_branch_last_commit)
168
+ .and_return "d658f302f56abfd7a163e3b5f44de39b780a64c2"
169
+
170
+ @my_plugin.check_for_updates("#{File.dirname(__FILE__)}/support/fixtures/Branch.xcodeproj")
171
+
172
+ expect(@dangerfile.status_report[:warnings]).to eq(
173
+ [
174
+ "Newer commit available for kean/Nuke (main): d658f302f56abfd7a163e3b5f44de39b780a64c2",
175
+ ]
176
+ )
177
+ end
142
178
  end
143
179
  end
144
180
  end
@@ -0,0 +1,80 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 54;
7
+ objects = {
8
+ /* Begin PBXGroup section */
9
+ F1465EF423AA94BF0055F7C3 = {
10
+ isa = PBXGroup;
11
+ children = (
12
+ F1465EFF23AA94BF0055F7C3 /* Demo */,
13
+ );
14
+ sourceTree = "<group>";
15
+ };
16
+ F1465EFF23AA94BF0055F7C3 /* Demo */ = {
17
+ isa = PBXGroup;
18
+ children = ();
19
+ path = Demo;
20
+ sourceTree = "<group>";
21
+ };
22
+ /* End PBXGroup section */
23
+
24
+ /* Begin PBXProject section */
25
+ F1465EF523AA94BF0055F7C3 /* Project object */ = {
26
+ isa = PBXProject;
27
+ attributes = {
28
+ BuildIndependentTargetsInParallel = YES;
29
+ LastSwiftUpdateCheck = 1420;
30
+ LastUpgradeCheck = 1420;
31
+ TargetAttributes = {
32
+ F1465EFC23AA94BF0055F7C3 = {
33
+ CreatedOnToolsVersion = 11.2.1;
34
+ };
35
+ };
36
+ };
37
+ buildConfigurationList = F1465EF823AA94BF0055F7C3 /* Build configuration list for PBXProject "Demo" */;
38
+ compatibilityVersion = "Xcode 9.3";
39
+ developmentRegion = en;
40
+ hasScannedForEncodings = 0;
41
+ knownRegions = (
42
+ en,
43
+ Base,
44
+ es,
45
+ "zh-Hans",
46
+ fr,
47
+ );
48
+ mainGroup = F1465EF423AA94BF0055F7C3;
49
+ packageReferences = (
50
+ 11BBD37629C1571400F7A968 /* XCRemoteSwiftPackageReference "Nuke" */,
51
+ );
52
+ productRefGroup = F1465EFE23AA94BF0055F7C3 /* Products */;
53
+ projectDirPath = "";
54
+ projectRoot = "";
55
+ targets = ();
56
+ };
57
+ /* End PBXProject section */
58
+
59
+ /* Begin XCConfigurationList section */
60
+ F1465EF823AA94BF0055F7C3 /* Build configuration list for PBXNativeTarget "Demo" */ = {
61
+ isa = XCConfigurationList;
62
+ buildConfigurations = ();
63
+ defaultConfigurationIsVisible = 0;
64
+ defaultConfigurationName = Release;
65
+ };
66
+ /* End XCConfigurationList section */
67
+
68
+ /* Begin XCRemoteSwiftPackageReference section */
69
+ 11BBD37629C1571400F7A968 /* XCRemoteSwiftPackageReference "Nuke" */ = {
70
+ isa = XCRemoteSwiftPackageReference;
71
+ repositoryURL = "https://github.com/kean/Nuke";
72
+ requirement = {
73
+ branch = main;
74
+ kind = branch;
75
+ };
76
+ };
77
+ /* End XCRemoteSwiftPackageReference section */
78
+ };
79
+ rootObject = F1465EF523AA94BF0055F7C3 /* Project object */;
80
+ }
@@ -0,0 +1,265 @@
1
+ {
2
+ "pins" : [
3
+ {
4
+ "identity" : "abseil-cpp-binary",
5
+ "kind" : "remoteSourceControl",
6
+ "location" : "https://github.com/google/abseil-cpp-binary.git",
7
+ "state" : {
8
+ "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c",
9
+ "version" : "1.2022062300.0"
10
+ }
11
+ },
12
+ {
13
+ "identity" : "analytics-swift",
14
+ "kind" : "remoteSourceControl",
15
+ "location" : "git@github.com:hbmartin/analytics-swift.git",
16
+ "state" : {
17
+ "branch" : "main",
18
+ "revision" : "81ed4a83fc87ef074bb71b2b0bced199811dc3bb"
19
+ }
20
+ },
21
+ {
22
+ "identity" : "firebase-ios-sdk",
23
+ "kind" : "remoteSourceControl",
24
+ "location" : "https://github.com/firebase/firebase-ios-sdk",
25
+ "state" : {
26
+ "revision" : "8a8ec57a272e0d31480fb0893dda0cf4f769b57e",
27
+ "version" : "10.15.0"
28
+ }
29
+ },
30
+ {
31
+ "identity" : "googleappmeasurement",
32
+ "kind" : "remoteSourceControl",
33
+ "location" : "https://github.com/google/GoogleAppMeasurement.git",
34
+ "state" : {
35
+ "revision" : "03b9beee1a61f62d32c521e172e192a1663a5e8b",
36
+ "version" : "10.13.0"
37
+ }
38
+ },
39
+ {
40
+ "identity" : "googledatatransport",
41
+ "kind" : "remoteSourceControl",
42
+ "location" : "https://github.com/google/GoogleDataTransport.git",
43
+ "state" : {
44
+ "revision" : "aae45a320fd0d11811820335b1eabc8753902a40",
45
+ "version" : "9.2.5"
46
+ }
47
+ },
48
+ {
49
+ "identity" : "googleutilities",
50
+ "kind" : "remoteSourceControl",
51
+ "location" : "https://github.com/google/GoogleUtilities.git",
52
+ "state" : {
53
+ "revision" : "c38ce365d77b04a9a300c31061c5227589e5597b",
54
+ "version" : "7.11.5"
55
+ }
56
+ },
57
+ {
58
+ "identity" : "grpc-binary",
59
+ "kind" : "remoteSourceControl",
60
+ "location" : "https://github.com/google/grpc-binary.git",
61
+ "state" : {
62
+ "revision" : "f1b366129d1125be7db83247e003fc333104b569",
63
+ "version" : "1.50.2"
64
+ }
65
+ },
66
+ {
67
+ "identity" : "gtm-session-fetcher",
68
+ "kind" : "remoteSourceControl",
69
+ "location" : "https://github.com/google/gtm-session-fetcher.git",
70
+ "state" : {
71
+ "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd",
72
+ "version" : "3.1.1"
73
+ }
74
+ },
75
+ {
76
+ "identity" : "interop-ios-for-google-sdks",
77
+ "kind" : "remoteSourceControl",
78
+ "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
79
+ "state" : {
80
+ "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
81
+ "version" : "100.0.0"
82
+ }
83
+ },
84
+ {
85
+ "identity" : "leveldb",
86
+ "kind" : "remoteSourceControl",
87
+ "location" : "https://github.com/firebase/leveldb.git",
88
+ "state" : {
89
+ "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
90
+ "version" : "1.22.2"
91
+ }
92
+ },
93
+ {
94
+ "identity" : "lookingglassui",
95
+ "kind" : "remoteSourceControl",
96
+ "location" : "https://github.com/ryanlintott/LookingGlassUI",
97
+ "state" : {
98
+ "revision" : "3257e1b5392a8b39e4620e09cfdb672d2be42855",
99
+ "version" : "0.3.1"
100
+ }
101
+ },
102
+ {
103
+ "identity" : "maplibre-gl-native-distribution",
104
+ "kind" : "remoteSourceControl",
105
+ "location" : "https://github.com/maplibre/maplibre-gl-native-distribution",
106
+ "state" : {
107
+ "revision" : "ffda61e298c1490d4860d5184e80d618aaadc089",
108
+ "version" : "5.13.0"
109
+ }
110
+ },
111
+ {
112
+ "identity" : "nanopb",
113
+ "kind" : "remoteSourceControl",
114
+ "location" : "https://github.com/firebase/nanopb.git",
115
+ "state" : {
116
+ "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692",
117
+ "version" : "2.30909.0"
118
+ }
119
+ },
120
+ {
121
+ "identity" : "nuke",
122
+ "kind" : "remoteSourceControl",
123
+ "location" : "https://github.com/kean/Nuke",
124
+ "state" : {
125
+ "branch" : "main",
126
+ "revision" : "3f666f120b63ea7de57d42e9a7c9b47f8e7a290b"
127
+ }
128
+ },
129
+ {
130
+ "identity" : "phonenumberkit",
131
+ "kind" : "remoteSourceControl",
132
+ "location" : "https://github.com/marmelroy/PhoneNumberKit.git",
133
+ "state" : {
134
+ "revision" : "b456f2f9be10c1d183158220b831afd22697dd68",
135
+ "version" : "3.7.4"
136
+ }
137
+ },
138
+ {
139
+ "identity" : "promises",
140
+ "kind" : "remoteSourceControl",
141
+ "location" : "https://github.com/google/promises.git",
142
+ "state" : {
143
+ "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e",
144
+ "version" : "2.3.1"
145
+ }
146
+ },
147
+ {
148
+ "identity" : "sentry-cocoa",
149
+ "kind" : "remoteSourceControl",
150
+ "location" : "https://github.com/getsentry/sentry-cocoa.git",
151
+ "state" : {
152
+ "revision" : "14aa6e47b03b820fd2b338728637570b9e969994",
153
+ "version" : "8.12.0"
154
+ }
155
+ },
156
+ {
157
+ "identity" : "sovran-swift",
158
+ "kind" : "remoteSourceControl",
159
+ "location" : "https://github.com/segmentio/Sovran-Swift.git",
160
+ "state" : {
161
+ "revision" : "64f3b5150c282a34af4578188dce2fd597e600e3",
162
+ "version" : "1.1.0"
163
+ }
164
+ },
165
+ {
166
+ "identity" : "swift-algorithms",
167
+ "kind" : "remoteSourceControl",
168
+ "location" : "https://github.com/apple/swift-algorithms.git",
169
+ "state" : {
170
+ "revision" : "bcd4f369ac962bc3e5244c9df778739f8f5bdbf1",
171
+ "version" : "1.1.0"
172
+ }
173
+ },
174
+ {
175
+ "identity" : "swift-argument-parser",
176
+ "kind" : "remoteSourceControl",
177
+ "location" : "https://github.com/apple/swift-argument-parser.git",
178
+ "state" : {
179
+ "revision" : "8f4d2753f0e4778c76d5f05ad16c74f707390531",
180
+ "version" : "1.2.3"
181
+ }
182
+ },
183
+ {
184
+ "identity" : "swift-asn1",
185
+ "kind" : "remoteSourceControl",
186
+ "location" : "https://github.com/apple/swift-asn1.git",
187
+ "state" : {
188
+ "revision" : "3664efa98bd302ec90e5b27ee1c0649fbcc365bc"
189
+ }
190
+ },
191
+ {
192
+ "identity" : "swift-case-paths",
193
+ "kind" : "remoteSourceControl",
194
+ "location" : "https://github.com/pointfreeco/swift-case-paths",
195
+ "state" : {
196
+ "revision" : "5da6989aae464f324eef5c5b52bdb7974725ab81",
197
+ "version" : "1.0.0"
198
+ }
199
+ },
200
+ {
201
+ "identity" : "swift-custom-dump",
202
+ "kind" : "remoteSourceControl",
203
+ "location" : "https://github.com/pointfreeco/swift-custom-dump",
204
+ "state" : {
205
+ "revision" : "3efbfba0e4e56c7187cc19137ee16b7c95346b79",
206
+ "version" : "1.1.0"
207
+ }
208
+ },
209
+ {
210
+ "identity" : "swift-numerics",
211
+ "kind" : "remoteSourceControl",
212
+ "location" : "https://github.com/apple/swift-numerics.git",
213
+ "state" : {
214
+ "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b",
215
+ "version" : "1.0.2"
216
+ }
217
+ },
218
+ {
219
+ "identity" : "swift-protobuf",
220
+ "kind" : "remoteSourceControl",
221
+ "location" : "https://github.com/apple/swift-protobuf.git",
222
+ "state" : {
223
+ "revision" : "cf62cdaea48b77f1a631e5cb3aeda6047c2cba1d",
224
+ "version" : "1.23.0"
225
+ }
226
+ },
227
+ {
228
+ "identity" : "swift-snapshot-testing",
229
+ "kind" : "remoteSourceControl",
230
+ "location" : "https://github.com/pointfreeco/swift-snapshot-testing",
231
+ "state" : {
232
+ "revision" : "696b86a6d151578bca7c1a2a3ed419a5f834d40f",
233
+ "version" : "1.13.0"
234
+ }
235
+ },
236
+ {
237
+ "identity" : "swift-syntax",
238
+ "kind" : "remoteSourceControl",
239
+ "location" : "https://github.com/apple/swift-syntax.git",
240
+ "state" : {
241
+ "revision" : "74203046135342e4a4a627476dd6caf8b28fe11b",
242
+ "version" : "509.0.0"
243
+ }
244
+ },
245
+ {
246
+ "identity" : "swiftui-navigation",
247
+ "kind" : "remoteSourceControl",
248
+ "location" : "https://github.com/pointfreeco/swiftui-navigation",
249
+ "state" : {
250
+ "revision" : "6eb293c49505d86e9e24232cb6af6be7fff93bd5",
251
+ "version" : "1.0.2"
252
+ }
253
+ },
254
+ {
255
+ "identity" : "xctest-dynamic-overlay",
256
+ "kind" : "remoteSourceControl",
257
+ "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay",
258
+ "state" : {
259
+ "revision" : "23cbf2294e350076ea4dbd7d5d047c1e76b03631",
260
+ "version" : "1.0.2"
261
+ }
262
+ }
263
+ ],
264
+ "version" : 2
265
+ }
@@ -0,0 +1,81 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 54;
7
+ objects = {
8
+ /* Begin PBXGroup section */
9
+ F1465EF423AA94BF0055F7C3 = {
10
+ isa = PBXGroup;
11
+ children = (
12
+ F1465EFF23AA94BF0055F7C3 /* Demo */,
13
+ );
14
+ sourceTree = "<group>";
15
+ };
16
+ F1465EFF23AA94BF0055F7C3 /* Demo */ = {
17
+ isa = PBXGroup;
18
+ children = ();
19
+ path = Demo;
20
+ sourceTree = "<group>";
21
+ };
22
+ /* End PBXGroup section */
23
+
24
+ /* Begin PBXProject section */
25
+ F1465EF523AA94BF0055F7C3 /* Project object */ = {
26
+ isa = PBXProject;
27
+ attributes = {
28
+ BuildIndependentTargetsInParallel = YES;
29
+ LastSwiftUpdateCheck = 1420;
30
+ LastUpgradeCheck = 1420;
31
+ TargetAttributes = {
32
+ F1465EFC23AA94BF0055F7C3 = {
33
+ CreatedOnToolsVersion = 11.2.1;
34
+ };
35
+ };
36
+ };
37
+ buildConfigurationList = F1465EF823AA94BF0055F7C3 /* Build configuration list for PBXProject "Demo" */;
38
+ compatibilityVersion = "Xcode 9.3";
39
+ developmentRegion = en;
40
+ hasScannedForEncodings = 0;
41
+ knownRegions = (
42
+ en,
43
+ Base,
44
+ es,
45
+ "zh-Hans",
46
+ fr,
47
+ );
48
+ mainGroup = F1465EF423AA94BF0055F7C3;
49
+ packageReferences = (
50
+ 11BBD37629C1571400F7A968 /* XCRemoteSwiftPackageReference "Nuke" */,
51
+ );
52
+ productRefGroup = F1465EFE23AA94BF0055F7C3 /* Products */;
53
+ projectDirPath = "";
54
+ projectRoot = "";
55
+ targets = ();
56
+ };
57
+ /* End PBXProject section */
58
+
59
+ /* Begin XCConfigurationList section */
60
+ F1465EF823AA94BF0055F7C3 /* Build configuration list for PBXNativeTarget "Demo" */ = {
61
+ isa = XCConfigurationList;
62
+ buildConfigurations = ();
63
+ defaultConfigurationIsVisible = 0;
64
+ defaultConfigurationName = Release;
65
+ };
66
+ /* End XCConfigurationList section */
67
+
68
+ /* Begin XCRemoteSwiftPackageReference section */
69
+ 11BBD37629C1571400F7A968 /* XCRemoteSwiftPackageReference "Nuke" */ = {
70
+ isa = XCRemoteSwiftPackageReference;
71
+ repositoryURL = "https://github.com/kean/Nuke";
72
+ requirement = {
73
+ kind = versionRange;
74
+ maximumVersion = 13.0.0;
75
+ minimumVersion = 12.0.0;
76
+ };
77
+ };
78
+ /* End XCRemoteSwiftPackageReference section */
79
+ };
80
+ rootObject = F1465EF523AA94BF0055F7C3 /* Project object */;
81
+ }