dependabot-bundler 0.95.5 → 0.95.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. metadata +4 -38
  3. data/helpers/Makefile +0 -9
  4. data/helpers/build +0 -26
  5. data/lib/dependabot/bundler.rb +0 -27
  6. data/lib/dependabot/bundler/file_fetcher.rb +0 -216
  7. data/lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb +0 -68
  8. data/lib/dependabot/bundler/file_fetcher/gemspec_finder.rb +0 -96
  9. data/lib/dependabot/bundler/file_fetcher/path_gemspec_finder.rb +0 -112
  10. data/lib/dependabot/bundler/file_fetcher/require_relative_finder.rb +0 -65
  11. data/lib/dependabot/bundler/file_parser.rb +0 -297
  12. data/lib/dependabot/bundler/file_parser/file_preparer.rb +0 -84
  13. data/lib/dependabot/bundler/file_parser/gemfile_checker.rb +0 -46
  14. data/lib/dependabot/bundler/file_updater.rb +0 -125
  15. data/lib/dependabot/bundler/file_updater/gemfile_updater.rb +0 -114
  16. data/lib/dependabot/bundler/file_updater/gemspec_dependency_name_finder.rb +0 -50
  17. data/lib/dependabot/bundler/file_updater/gemspec_sanitizer.rb +0 -298
  18. data/lib/dependabot/bundler/file_updater/gemspec_updater.rb +0 -62
  19. data/lib/dependabot/bundler/file_updater/git_pin_replacer.rb +0 -78
  20. data/lib/dependabot/bundler/file_updater/git_source_remover.rb +0 -100
  21. data/lib/dependabot/bundler/file_updater/lockfile_updater.rb +0 -387
  22. data/lib/dependabot/bundler/file_updater/requirement_replacer.rb +0 -221
  23. data/lib/dependabot/bundler/metadata_finder.rb +0 -204
  24. data/lib/dependabot/bundler/requirement.rb +0 -29
  25. data/lib/dependabot/bundler/update_checker.rb +0 -334
  26. data/lib/dependabot/bundler/update_checker/file_preparer.rb +0 -279
  27. data/lib/dependabot/bundler/update_checker/force_updater.rb +0 -259
  28. data/lib/dependabot/bundler/update_checker/latest_version_finder.rb +0 -165
  29. data/lib/dependabot/bundler/update_checker/requirements_updater.rb +0 -281
  30. data/lib/dependabot/bundler/update_checker/ruby_requirement_setter.rb +0 -113
  31. data/lib/dependabot/bundler/update_checker/shared_bundler_helpers.rb +0 -244
  32. data/lib/dependabot/bundler/update_checker/version_resolver.rb +0 -272
  33. data/lib/dependabot/bundler/version.rb +0 -13
  34. data/lib/dependabot/monkey_patches/bundler/definition_bundler_version_patch.rb +0 -15
  35. data/lib/dependabot/monkey_patches/bundler/definition_ruby_version_patch.rb +0 -14
  36. data/lib/dependabot/monkey_patches/bundler/git_source_patch.rb +0 -27
@@ -1,334 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dependabot/update_checkers"
4
- require "dependabot/update_checkers/base"
5
- require "dependabot/bundler/file_updater/requirement_replacer"
6
- require "dependabot/bundler/version"
7
- require "dependabot/git_commit_checker"
8
-
9
- module Dependabot
10
- module Bundler
11
- class UpdateChecker < Dependabot::UpdateCheckers::Base
12
- require_relative "update_checker/force_updater"
13
- require_relative "update_checker/file_preparer"
14
- require_relative "update_checker/requirements_updater"
15
- require_relative "update_checker/version_resolver"
16
- require_relative "update_checker/latest_version_finder"
17
-
18
- def latest_version
19
- return latest_version_for_git_dependency if git_dependency?
20
-
21
- latest_version_details&.fetch(:version)
22
- end
23
-
24
- def latest_resolvable_version
25
- return latest_resolvable_version_for_git_dependency if git_dependency?
26
-
27
- latest_resolvable_version_details&.fetch(:version)
28
- end
29
-
30
- def latest_resolvable_version_with_no_unlock
31
- current_ver = dependency.version
32
- return current_ver if git_dependency? && git_commit_checker.pinned?
33
-
34
- @latest_resolvable_version_detail_with_no_unlock ||=
35
- version_resolver(
36
- remove_git_source: false,
37
- unlock_requirement: false
38
- ).latest_resolvable_version_details
39
-
40
- if git_dependency?
41
- @latest_resolvable_version_detail_with_no_unlock&.fetch(:commit_sha)
42
- else
43
- @latest_resolvable_version_detail_with_no_unlock&.fetch(:version)
44
- end
45
- end
46
-
47
- def updated_requirements
48
- RequirementsUpdater.new(
49
- requirements: dependency.requirements,
50
- update_strategy: requirements_update_strategy,
51
- updated_source: updated_source,
52
- latest_version: latest_version_details&.fetch(:version)&.to_s,
53
- latest_resolvable_version:
54
- latest_resolvable_version_details&.fetch(:version)&.to_s
55
- ).updated_requirements
56
- end
57
-
58
- def requirements_unlocked_or_can_be?
59
- dependency.requirements.
60
- reject { |r| r[:requirement].nil? }.
61
- all? do |req|
62
- requirement = requirement_class.new(req[:requirement])
63
- next true if requirement.satisfied_by?(Gem::Version.new("100000"))
64
-
65
- file = dependency_files.find { |f| f.name == req.fetch(:file) }
66
- updated = FileUpdater::RequirementReplacer.new(
67
- dependency: dependency,
68
- file_type: file.name.end_with?("gemspec") ? :gemspec : :gemfile,
69
- updated_requirement: "whatever"
70
- ).rewrite(file.content)
71
-
72
- updated != file.content
73
- end
74
- end
75
-
76
- def requirements_update_strategy
77
- # If passed in as an option (in the base class) honour that option
78
- if @requirements_update_strategy
79
- return @requirements_update_strategy.to_sym
80
- end
81
-
82
- # Otherwise, widen ranges for libraries and bump versions for apps
83
- dependency.version.nil? ? :bump_versions_if_necessary : :bump_versions
84
- end
85
-
86
- private
87
-
88
- def latest_version_resolvable_with_full_unlock?
89
- return false unless latest_version
90
-
91
- updated_dependencies = force_updater.updated_dependencies
92
-
93
- updated_dependencies.none? do |dep|
94
- old_version = dep.previous_version
95
- next unless Gem::Version.correct?(old_version)
96
- next if Gem::Version.new(old_version).prerelease?
97
-
98
- Gem::Version.new(dep.version).prerelease?
99
- end
100
- rescue Dependabot::DependencyFileNotResolvable
101
- false
102
- end
103
-
104
- def updated_dependencies_after_full_unlock
105
- force_updater.updated_dependencies
106
- end
107
-
108
- def git_dependency?
109
- git_commit_checker.git_dependency?
110
- end
111
-
112
- def latest_version_details(remove_git_source: false)
113
- @latest_version_details ||= {}
114
- @latest_version_details[remove_git_source] ||=
115
- latest_version_finder(remove_git_source: remove_git_source).
116
- latest_version_details
117
- end
118
-
119
- def latest_resolvable_version_details(remove_git_source: false)
120
- @latest_resolvable_version_details ||= {}
121
- @latest_resolvable_version_details[remove_git_source] ||=
122
- version_resolver(remove_git_source: remove_git_source).
123
- latest_resolvable_version_details
124
- end
125
-
126
- def latest_version_for_git_dependency
127
- latest_release =
128
- latest_version_details(remove_git_source: true)&.
129
- fetch(:version)
130
-
131
- # If there's been a release that includes the current pinned ref or
132
- # that the current branch is behind, we switch to that release.
133
- return latest_release if git_branch_or_ref_in_release?(latest_release)
134
-
135
- # Otherwise, if the gem isn't pinned, the latest version is just the
136
- # latest commit for the specified branch.
137
- unless git_commit_checker.pinned?
138
- return git_commit_checker.head_commit_for_current_branch
139
- end
140
-
141
- # If the dependency is pinned to a tag that looks like a version then
142
- # we want to update that tag. The latest version will then be the SHA
143
- # of the latest tag that looks like a version.
144
- if git_commit_checker.pinned_ref_looks_like_version?
145
- latest_tag = git_commit_checker.local_tag_for_latest_version
146
- return latest_tag&.fetch(:tag_sha) || dependency.version
147
- end
148
-
149
- # If the dependency is pinned to a tag that doesn't look like a
150
- # version then there's nothing we can do.
151
- dependency.version
152
- end
153
-
154
- def latest_resolvable_version_for_git_dependency
155
- latest_release = latest_resolvable_version_without_git_source
156
-
157
- # If there's a resolvable release that includes the current pinned
158
- # ref or that the current branch is behind, we switch to that release.
159
- return latest_release if git_branch_or_ref_in_release?(latest_release)
160
-
161
- # Otherwise, if the gem isn't pinned, the latest version is just the
162
- # latest commit for the specified branch.
163
- unless git_commit_checker.pinned?
164
- return latest_resolvable_commit_with_unchanged_git_source
165
- end
166
-
167
- # If the dependency is pinned to a tag that looks like a version then
168
- # we want to update that tag. The latest version will then be the SHA
169
- # of the latest tag that looks like a version.
170
- if git_commit_checker.pinned_ref_looks_like_version? &&
171
- latest_git_tag_is_resolvable?
172
- new_tag = git_commit_checker.local_tag_for_latest_version
173
- return new_tag.fetch(:tag_sha)
174
- end
175
-
176
- # If the dependency is pinned to a tag that doesn't look like a
177
- # version then there's nothing we can do.
178
- dependency.version
179
- end
180
-
181
- def latest_resolvable_version_without_git_source
182
- return nil unless latest_version.is_a?(Gem::Version)
183
-
184
- latest_resolvable_version_details(remove_git_source: true)&.
185
- fetch(:version)
186
- rescue Dependabot::DependencyFileNotResolvable
187
- nil
188
- end
189
-
190
- def latest_resolvable_commit_with_unchanged_git_source
191
- details = latest_resolvable_version_details(remove_git_source: false)
192
-
193
- # If this dependency has a git version in the Gemfile.lock but not in
194
- # the Gemfile (i.e., because they're out-of-sync) we might not get a
195
- # commit_sha back from Bundler. In that case, return `nil`.
196
- return unless details.key?(:commit_sha)
197
-
198
- details.fetch(:commit_sha)
199
- rescue Dependabot::DependencyFileNotResolvable
200
- nil
201
- end
202
-
203
- def latest_git_tag_is_resolvable?
204
- return @git_tag_resolvable if @latest_git_tag_is_resolvable_checked
205
-
206
- @latest_git_tag_is_resolvable_checked = true
207
-
208
- return false if git_commit_checker.local_tag_for_latest_version.nil?
209
-
210
- replacement_tag = git_commit_checker.local_tag_for_latest_version
211
-
212
- VersionResolver.new(
213
- dependency: dependency,
214
- unprepared_dependency_files: dependency_files,
215
- credentials: credentials,
216
- ignored_versions: ignored_versions,
217
- replacement_git_pin: replacement_tag.fetch(:tag)
218
- ).latest_resolvable_version_details
219
-
220
- @git_tag_resolvable = true
221
- rescue Dependabot::DependencyFileNotResolvable
222
- @git_tag_resolvable = false
223
- end
224
-
225
- def git_branch_or_ref_in_release?(release)
226
- return false unless release
227
-
228
- git_commit_checker.branch_or_ref_in_release?(release)
229
- end
230
-
231
- def updated_source
232
- # Never need to update source, unless a git_dependency
233
- return dependency_source_details unless git_dependency?
234
-
235
- # Source becomes `nil` if switching to default rubygems
236
- return nil if should_switch_source_from_git_to_rubygems?
237
-
238
- # Update the git tag if updating a pinned version
239
- if git_commit_checker.pinned_ref_looks_like_version? &&
240
- latest_git_tag_is_resolvable?
241
- new_tag = git_commit_checker.local_tag_for_latest_version
242
- return dependency_source_details.merge(ref: new_tag.fetch(:tag))
243
- end
244
-
245
- # Otherwise return the original source
246
- dependency_source_details
247
- end
248
-
249
- def dependency_source_details
250
- sources =
251
- dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
252
-
253
- raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
254
-
255
- sources.first
256
- end
257
-
258
- def should_switch_source_from_git_to_rubygems?
259
- return false unless git_dependency?
260
- return false if latest_resolvable_version_for_git_dependency.nil?
261
-
262
- Gem::Version.correct?(latest_resolvable_version_for_git_dependency)
263
- end
264
-
265
- def force_updater
266
- @force_updater ||=
267
- ForceUpdater.new(
268
- dependency: dependency,
269
- dependency_files: dependency_files,
270
- credentials: credentials,
271
- target_version: latest_version,
272
- requirements_update_strategy: requirements_update_strategy
273
- )
274
- end
275
-
276
- def git_commit_checker
277
- @git_commit_checker ||=
278
- GitCommitChecker.new(
279
- dependency: dependency,
280
- credentials: credentials
281
- )
282
- end
283
-
284
- def version_resolver(remove_git_source:, unlock_requirement: true)
285
- @version_resolver ||= {}
286
- @version_resolver[remove_git_source] ||= {}
287
- @version_resolver[remove_git_source][unlock_requirement] ||=
288
- begin
289
- VersionResolver.new(
290
- dependency: dependency,
291
- unprepared_dependency_files: dependency_files,
292
- credentials: credentials,
293
- ignored_versions: ignored_versions,
294
- remove_git_source: remove_git_source,
295
- unlock_requirement: unlock_requirement,
296
- latest_allowable_version: latest_version
297
- )
298
- end
299
- end
300
-
301
- def latest_version_finder(remove_git_source:)
302
- @latest_version_finder ||= {}
303
- @latest_version_finder[remove_git_source] ||=
304
- begin
305
- prepared_dependency_files = prepared_dependency_files(
306
- remove_git_source: remove_git_source,
307
- unlock_requirement: true
308
- )
309
-
310
- LatestVersionFinder.new(
311
- dependency: dependency,
312
- dependency_files: prepared_dependency_files,
313
- credentials: credentials,
314
- ignored_versions: ignored_versions
315
- )
316
- end
317
- end
318
-
319
- def prepared_dependency_files(remove_git_source:, unlock_requirement:,
320
- latest_allowable_version: nil)
321
- FilePreparer.new(
322
- dependency: dependency,
323
- dependency_files: dependency_files,
324
- remove_git_source: remove_git_source,
325
- unlock_requirement: unlock_requirement,
326
- latest_allowable_version: latest_allowable_version
327
- ).prepared_dependency_files
328
- end
329
- end
330
- end
331
- end
332
-
333
- Dependabot::UpdateCheckers.
334
- register("bundler", Dependabot::Bundler::UpdateChecker)
@@ -1,279 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dependabot/dependency_file"
4
- require "dependabot/bundler/update_checker"
5
- require "dependabot/bundler/file_updater/gemspec_sanitizer"
6
- require "dependabot/bundler/file_updater/git_pin_replacer"
7
- require "dependabot/bundler/file_updater/git_source_remover"
8
- require "dependabot/bundler/file_updater/requirement_replacer"
9
- require "dependabot/bundler/file_updater/gemspec_dependency_name_finder"
10
- require "dependabot/bundler/file_updater/lockfile_updater"
11
- require "dependabot/bundler/update_checker/ruby_requirement_setter"
12
-
13
- module Dependabot
14
- module Bundler
15
- class UpdateChecker
16
- # This class takes a set of dependency files and sanitizes them for use
17
- # in UpdateCheckers::Ruby::Bundler. In particular, it:
18
- # - Removes any version requirement on the dependency being updated
19
- # (in the Gemfile)
20
- # - Sanitizes any provided gemspecs to remove file imports etc. (since
21
- # Dependabot doesn't pull down the entire repo). This process is
22
- # imperfect - an alternative would be to clone the repo
23
- # - Sets the ruby version in the Gemfile to be the lowest possible
24
- # version allowed by the gemspec, if the gemspec has a required ruby
25
- # version range
26
- class FilePreparer
27
- VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-_]+)*/.freeze
28
-
29
- # Can't be a constant because some of these don't exist in bundler
30
- # 1.15, which Heroku uses, which causes an exception on boot.
31
- def gemspec_sources
32
- [
33
- ::Bundler::Source::Path,
34
- ::Bundler::Source::Gemspec
35
- ]
36
- end
37
-
38
- def initialize(dependency_files:, dependency:,
39
- remove_git_source: false,
40
- unlock_requirement: true,
41
- replacement_git_pin: nil,
42
- latest_allowable_version: nil,
43
- lock_ruby_version: true)
44
- @dependency_files = dependency_files
45
- @dependency = dependency
46
- @remove_git_source = remove_git_source
47
- @unlock_requirement = unlock_requirement
48
- @replacement_git_pin = replacement_git_pin
49
- @latest_allowable_version = latest_allowable_version
50
- @lock_ruby_version = lock_ruby_version
51
- end
52
-
53
- # rubocop:disable Metrics/AbcSize
54
- # rubocop:disable Metrics/MethodLength
55
- def prepared_dependency_files
56
- files = []
57
-
58
- if gemfile
59
- files << DependencyFile.new(
60
- name: gemfile.name,
61
- content: gemfile_content_for_update_check(gemfile),
62
- directory: gemfile.directory
63
- )
64
- end
65
-
66
- top_level_gemspecs.each do |gemspec|
67
- files << DependencyFile.new(
68
- name: gemspec.name,
69
- content: gemspec_content_for_update_check(gemspec),
70
- directory: gemspec.directory
71
- )
72
- end
73
-
74
- path_gemspecs.each do |file|
75
- files << DependencyFile.new(
76
- name: file.name,
77
- content: sanitize_gemspec_content(file.content),
78
- directory: file.directory,
79
- support_file: file.support_file?
80
- )
81
- end
82
-
83
- evaled_gemfiles.each do |file|
84
- files << DependencyFile.new(
85
- name: file.name,
86
- content: gemfile_content_for_update_check(file),
87
- directory: file.directory
88
- )
89
- end
90
-
91
- # No editing required for lockfile or Ruby version file
92
- files += [lockfile, ruby_version_file, *imported_ruby_files].compact
93
- end
94
- # rubocop:enable Metrics/AbcSize
95
- # rubocop:enable Metrics/MethodLength
96
-
97
- private
98
-
99
- attr_reader :dependency_files, :dependency, :replacement_git_pin,
100
- :latest_allowable_version
101
-
102
- def remove_git_source?
103
- @remove_git_source
104
- end
105
-
106
- def unlock_requirement?
107
- @unlock_requirement
108
- end
109
-
110
- def replace_git_pin?
111
- !replacement_git_pin.nil?
112
- end
113
-
114
- def gemfile
115
- dependency_files.find { |f| f.name == "Gemfile" } ||
116
- dependency_files.find { |f| f.name == "gems.rb" }
117
- end
118
-
119
- def evaled_gemfiles
120
- dependency_files.
121
- reject { |f| f.name.end_with?(".gemspec") }.
122
- reject { |f| f.name.end_with?(".lock") }.
123
- reject { |f| f.name.end_with?(".ruby-version") }.
124
- reject { |f| f.name == "Gemfile" }.
125
- reject { |f| f.name == "gems.rb" }.
126
- reject { |f| f.name == "gems.locked" }
127
- end
128
-
129
- def lockfile
130
- dependency_files.find { |f| f.name == "Gemfile.lock" } ||
131
- dependency_files.find { |f| f.name == "gems.locked" }
132
- end
133
-
134
- def top_level_gemspecs
135
- dependency_files.
136
- select { |f| f.name.end_with?(".gemspec") }.
137
- reject(&:support_file?)
138
- end
139
-
140
- def ruby_version_file
141
- dependency_files.find { |f| f.name == ".ruby-version" }
142
- end
143
-
144
- def path_gemspecs
145
- all = dependency_files.select { |f| f.name.end_with?(".gemspec") }
146
- all - top_level_gemspecs
147
- end
148
-
149
- def imported_ruby_files
150
- dependency_files.
151
- select { |f| f.name.end_with?(".rb") }.
152
- reject { |f| f.name == "gems.rb" }
153
- end
154
-
155
- def gemfile_content_for_update_check(file)
156
- content = file.content
157
- content = replace_gemfile_constraint(content, file.name)
158
- content = remove_git_source(content) if remove_git_source?
159
- content = replace_git_pin(content) if replace_git_pin?
160
- content = lock_ruby_version(content) if lock_ruby_version?(file)
161
- content
162
- end
163
-
164
- def gemspec_content_for_update_check(gemspec)
165
- content = gemspec.content
166
- content = replace_gemspec_constraint(content, gemspec.name)
167
- sanitize_gemspec_content(content)
168
- end
169
-
170
- def replace_gemfile_constraint(content, filename)
171
- FileUpdater::RequirementReplacer.new(
172
- dependency: dependency,
173
- file_type: :gemfile,
174
- updated_requirement: updated_version_requirement_string(filename),
175
- insert_if_bare: true
176
- ).rewrite(content)
177
- end
178
-
179
- def replace_gemspec_constraint(content, filename)
180
- FileUpdater::RequirementReplacer.new(
181
- dependency: dependency,
182
- file_type: :gemspec,
183
- updated_requirement: updated_version_requirement_string(filename),
184
- insert_if_bare: true
185
- ).rewrite(content)
186
- end
187
-
188
- def sanitize_gemspec_content(gemspec_content)
189
- new_version = replacement_version_for_gemspec(gemspec_content)
190
-
191
- FileUpdater::GemspecSanitizer.
192
- new(replacement_version: new_version).
193
- rewrite(gemspec_content)
194
- end
195
-
196
- def updated_version_requirement_string(filename)
197
- lower_bound_req = updated_version_req_lower_bound(filename)
198
-
199
- return lower_bound_req if latest_allowable_version.nil?
200
- unless Gem::Version.correct?(latest_allowable_version)
201
- return lower_bound_req
202
- end
203
-
204
- lower_bound_req + ", <= #{latest_allowable_version}"
205
- end
206
-
207
- def updated_version_req_lower_bound(filename)
208
- original_req = dependency.requirements.
209
- find { |r| r.fetch(:file) == filename }&.
210
- fetch(:requirement)
211
-
212
- if original_req && !unlock_requirement? then original_req
213
- elsif dependency.version&.match?(/^[0-9a-f]{40}$/) then ">= 0"
214
- elsif dependency.version then ">= #{dependency.version}"
215
- else
216
- version_for_requirement =
217
- dependency.requirements.map { |r| r[:requirement] }.
218
- reject { |req_string| req_string.start_with?("<") }.
219
- select { |req_string| req_string.match?(VERSION_REGEX) }.
220
- map { |req_string| req_string.match(VERSION_REGEX) }.
221
- select { |version| Gem::Version.correct?(version) }.
222
- max_by { |version| Gem::Version.new(version) }
223
-
224
- ">= #{version_for_requirement || 0}"
225
- end
226
- end
227
-
228
- def remove_git_source(content)
229
- FileUpdater::GitSourceRemover.new(
230
- dependency: dependency
231
- ).rewrite(content)
232
- end
233
-
234
- def replace_git_pin(content)
235
- FileUpdater::GitPinReplacer.new(
236
- dependency: dependency,
237
- new_pin: replacement_git_pin
238
- ).rewrite(content)
239
- end
240
-
241
- def lock_ruby_version(gemfile_content)
242
- top_level_gemspecs.each do |gs|
243
- gemfile_content =
244
- RubyRequirementSetter.new(gemspec: gs).rewrite(gemfile_content)
245
- end
246
-
247
- gemfile_content
248
- end
249
-
250
- def lock_ruby_version?(file)
251
- @lock_ruby_version && file == gemfile
252
- end
253
-
254
- def replacement_version_for_gemspec(gemspec_content)
255
- return "0.0.1" unless lockfile
256
-
257
- gemspec_specs =
258
- ::Bundler::LockfileParser.new(sanitized_lockfile_content).specs.
259
- select { |s| gemspec_sources.include?(s.source.class) }
260
-
261
- gem_name =
262
- FileUpdater::GemspecDependencyNameFinder.
263
- new(gemspec_content: gemspec_content).
264
- dependency_name
265
-
266
- return gemspec_specs.first&.version || "0.0.1" unless gem_name
267
-
268
- spec = gemspec_specs.find { |s| s.name == gem_name }
269
- spec&.version || gemspec_specs.first&.version || "0.0.1"
270
- end
271
-
272
- def sanitized_lockfile_content
273
- re = FileUpdater::LockfileUpdater::LOCKFILE_ENDING
274
- lockfile.content.gsub(re, "")
275
- end
276
- end
277
- end
278
- end
279
- end