danger-spm_version_updates 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 067f3b06cb1a331d6f12dca4e9f8be0b02f8a4888547aa6b235b8f1b87f26197
4
- data.tar.gz: 07ab0f2b6b729fe4e2bb7b3956ed67ee63ba2c59f4db9f435b3e0237a47fdeb0
3
+ metadata.gz: e09f13ea3447749c8a464e7583af7df15daa485a2fd4859642686dfa099d6686
4
+ data.tar.gz: 29cdfaae73b66e0288cd94c84b14d674f9ab2d1f6c3fd30431f31ad49b1d4fdc
5
5
  SHA512:
6
- metadata.gz: 164e7eb99a8fc9f1ba227be7683236995047adb066c4e21da3c70827917d800ab84d6508001a0d06e995610e12760e73930626638cce019dfd19a2ea92ed676a
7
- data.tar.gz: 043e6a93d677bdc70e94563594f6703feeca2f9790823f1a63327100e99ca20c19dc5e111a0d7545658bfc626086d61cf8c66c446f58d4bd950ef9b1c5e7b963
6
+ metadata.gz: 885f9f92765ee4dad799321b3251cf8e8961196470b3e934d6ca25067cad96356759d88b845f1ccd2adde92008cc80239e57caa5d0f4833fefe1f6f49a0c9deb
7
+ data.tar.gz: 124352559472f974630fb4a28d3fa436b7f30360a23cc21864c20939b47718047bffd08190e61676c429ee567306089c5e0c6c7dc69b451ea42185b486db7541
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-spm_version_updates (0.0.1)
4
+ danger-spm_version_updates (0.0.3)
5
5
  danger-plugin-api (~> 1.0)
6
6
  semantic (~> 1.6)
7
+ xcodeproj (~> 1.23)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
@@ -13,6 +13,7 @@ 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
17
 
17
18
  spec.files = `git ls-files`.split($/)
18
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -21,6 +22,7 @@ Gem::Specification.new do |spec|
21
22
 
22
23
  spec.add_runtime_dependency("danger-plugin-api", "~> 1.0")
23
24
  spec.add_runtime_dependency("semantic", "~> 1.6")
25
+ spec.add_runtime_dependency("xcodeproj", "~> 1.23")
24
26
 
25
27
  # General ruby development
26
28
  spec.add_development_dependency("bundler", "~> 2.0")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SpmVersionUpdates
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
@@ -4,46 +4,50 @@ require "semantic"
4
4
  require "xcodeproj"
5
5
 
6
6
  module Danger
7
+ # A plugin for checking if there are versions upgrades available for SPM packages
8
+ #
7
9
  # @example Ensure people are well warned about merging on Mondays
8
10
  #
9
- # my_plugin.warn_on_mondays
11
+ # spm_version_updates.check_for_updates("MyApp.xcodeproj")
10
12
  #
11
13
  # @see Harold Martin/danger-spm_version_updates
12
14
  # @tags swift, spm, swift package manager, xcode, xcodeproj, version, updates
13
15
  #
14
16
  class DangerSpmVersionUpdates < Plugin
15
- # The path to the xcodeproj file
16
- # @return [String]
17
- attr_accessor :xcodeproj_path
18
-
19
17
  # Whether to check when dependencies are exact versions or commits, default false
20
18
  # @return [Boolean]
21
19
  attr_accessor :check_when_exact
22
20
 
23
- # Whether to ignore version above the maximum version range, default true
21
+ # Whether to ignore versions above the maximum version range, default true
24
22
  # @return [Boolean]
25
23
  attr_accessor :quiet_above_maximum
26
24
 
25
+ # Whether to report pre-release versions, default false
26
+ # @return [Boolean]
27
+ attr_accessor :report_pre_releases
28
+
27
29
  # A list of repositories to ignore entirely, must exactly match the URL as configured in the Xcode project
28
30
  # @return [Array<String>]
29
31
  attr_accessor :ignore_repos
30
32
 
31
33
  # A method that you can call from your Dangerfile
32
- # @return [Array<String>]
33
- def check_for_updates
34
+ # @param [String] xcodeproj_path
35
+ # The path to your Xcode project
36
+ # @return [void]
37
+ def check_for_updates(xcodeproj_path)
34
38
  raise(XcodeprojPathMustBeSet) if xcodeproj_path.nil?
35
39
 
36
40
  project = Xcodeproj::Project.open(xcodeproj_path)
37
41
  remote_packages = filter_remote_packages(project)
38
42
 
39
- resolved_path = find_packages_resolved
43
+ resolved_path = find_packages_resolved(xcodeproj_path)
40
44
  raise(CouldNotFindResolvedFile) unless File.exist?(resolved_path)
41
45
 
42
46
  resolved_versions = JSON.load_file!(resolved_path)["pins"]
43
47
  .to_h { |pin| [pin["location"], pin["state"]["version"] || pin["state"]["revision"]] }
44
48
 
45
49
  remote_packages.each { |repository_url, requirement|
46
- next if ignore_repos != nil && ignore_repos.include?(repository_url)
50
+ next if ignore_repos&.include?(repository_url)
47
51
 
48
52
  name = repo_name(repository_url)
49
53
  resolved_version = resolved_versions[repository_url]
@@ -76,6 +80,8 @@ Newer version of #{name}: #{available_versions.first} (but this package is set t
76
80
  }
77
81
  end
78
82
 
83
+ # Extract a readable name for the repo given the url, generally org/repo
84
+ # @return [String]
79
85
  def repo_name(repo_url)
80
86
  match = repo_url.match(%r{([\w-]+/[\w-]+)(.git)?$})
81
87
 
@@ -86,6 +92,8 @@ Newer version of #{name}: #{available_versions.first} (but this package is set t
86
92
  end
87
93
  end
88
94
 
95
+ # Find the configured SPM dependencies in the xcodeproj
96
+ # @return [Hash<String, Hash>]
89
97
  def filter_remote_packages(project)
90
98
  project.objects.select { |obj|
91
99
  obj.kind_of?(Xcodeproj::Project::Object::XCRemoteSwiftPackageReference) &&
@@ -94,7 +102,9 @@ Newer version of #{name}: #{available_versions.first} (but this package is set t
94
102
  .to_h { |package| [package.repositoryURL, package.requirement] }
95
103
  end
96
104
 
97
- def find_packages_resolved
105
+ # Find the Packages.resolved file
106
+ # @return [String]
107
+ def find_packages_resolved(xcodeproj_path)
98
108
  if Dir.exist?(xcodeproj_path.sub("xcodeproj", "xcworkspace"))
99
109
  File.join(xcodeproj_path.sub("xcodeproj", "xcworkspace"), "xcshareddata", "swiftpm", "Package.resolved")
100
110
  else
@@ -110,7 +120,7 @@ Newer version of #{name}: #{available_versions.first} (but this package is set t
110
120
  warn("Newer version of #{name}: #{available_versions.first}")
111
121
  else
112
122
  newest_meeting_reqs = available_versions.find { |version|
113
- version < max_version
123
+ version < max_version && report_pre_releases ? true : version.pre.nil?
114
124
  }
115
125
  warn("Newer version of #{name}: #{newest_meeting_reqs} ") unless newest_meeting_reqs.to_s == resolved_version
116
126
  warn(
@@ -127,7 +137,7 @@ Newest version of #{name}: #{available_versions.first} (but this package is conf
127
137
  warn("Newer version of #{name}: #{available_versions.first}")
128
138
  else
129
139
  newest_meeting_reqs = available_versions.find { |version|
130
- version.send(major_or_minor) == resolved_version.send(major_or_minor)
140
+ version.send(major_or_minor) == resolved_version.send(major_or_minor) && report_pre_releases ? true : version.pre.nil?
131
141
  }
132
142
  warn("Newer version of #{name}: #{newest_meeting_reqs}") unless newest_meeting_reqs == resolved_version
133
143
  warn(
@@ -22,35 +22,27 @@ module Danger
22
22
  allow(@my_plugin.github).to receive(:pr_json).and_return(json)
23
23
  end
24
24
 
25
- it "raises error if xcodeproj_path is not set" do
26
- expect { @my_plugin.check_for_updates }
27
- .to raise_error(Danger::XcodeprojPathMustBeSet)
28
- end
29
-
30
25
  it "Reports none without exact version matching" do
31
- monday_date = Date.parse("2016-07-11")
32
- allow(Date).to receive(:today).and_return monday_date
26
+ allow(@my_plugin).to receive(:git_versions).and_return false
33
27
 
34
- @my_plugin.xcodeproj_path = "#{File.dirname(__FILE__)}/support/fixtures/Example.xcodeproj"
35
- @my_plugin.check_for_updates
28
+ @my_plugin.check_for_updates("#{File.dirname(__FILE__)}/support/fixtures/Example.xcodeproj")
36
29
 
37
30
  expect(@dangerfile.status_report[:warnings]).to eq([])
38
31
  end
39
32
 
40
33
  it "Reports some with exact version matching" do
41
34
  # TODO: mock git calls
42
- # allow(@my_plugin).to receive(:git_versions).and_return false
35
+ allow(@my_plugin).to receive(:git_versions).and_return false
43
36
 
44
- @my_plugin.xcodeproj_path = "#{File.dirname(__FILE__)}/support/fixtures/Example.xcodeproj"
45
37
  @my_plugin.check_when_exact = true
46
- @my_plugin.check_for_updates
38
+ @my_plugin.check_for_updates("#{File.dirname(__FILE__)}/support/fixtures/Example.xcodeproj")
47
39
 
48
40
  expect(@dangerfile.status_report[:warnings]).to eq(
49
41
  [
50
42
  "Newer version of pointfreeco/swift-snapshot-testing: 1.14.2 (but this package is set to exact version 1.13.0)\n",
51
43
  "Newer version of kean/Nuke: 12.2.0-beta.2 (but this package is set to exact version 12.1.6)\n",
52
44
  "Newer version of pointfreeco/swiftui-navigation: 1.0.3 (but this package is set to exact version 1.0.2)\n",
53
- "Newer version of getsentry/sentry-cocoa: 8.14.2 (but this package is set to exact version 8.12.0)\n",
45
+ "Newer version of getsentry/sentry-cocoa: 8.15.0 (but this package is set to exact version 8.12.0)\n",
54
46
  "Newer version of firebase/firebase-ios-sdk: 10.17.0 (but this package is set to exact version 10.15.0)\n",
55
47
  ]
56
48
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-spm_version_updates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harold Martin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-06 00:00:00.000000000 Z
11
+ date: 2023-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: xcodeproj
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.23'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.23'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -247,7 +261,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
247
261
  requirements:
248
262
  - - ">="
249
263
  - !ruby/object:Gem::Version
250
- version: '0'
264
+ version: '2.7'
251
265
  required_rubygems_version: !ruby/object:Gem::Requirement
252
266
  requirements:
253
267
  - - ">="