dependabot-python 0.211.0 → 0.213.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/build +1 -6
  3. data/helpers/lib/parser.py +52 -0
  4. data/helpers/requirements.txt +3 -3
  5. data/helpers/run.py +2 -0
  6. data/lib/dependabot/python/file_fetcher.rb +24 -14
  7. data/lib/dependabot/python/file_parser/{poetry_files_parser.rb → pyproject_files_parser.rb} +87 -5
  8. data/lib/dependabot/python/file_parser/python_requirement_parser.rb +1 -2
  9. data/lib/dependabot/python/file_parser/setup_file_parser.rb +5 -5
  10. data/lib/dependabot/python/file_parser.rb +5 -29
  11. data/lib/dependabot/python/file_updater/pip_compile_file_updater.rb +14 -29
  12. data/lib/dependabot/python/file_updater/pipfile_file_updater.rb +7 -9
  13. data/lib/dependabot/python/file_updater/poetry_file_updater.rb +7 -6
  14. data/lib/dependabot/python/file_updater/pyproject_preparer.rb +3 -2
  15. data/lib/dependabot/python/file_updater/requirement_file_updater.rb +2 -2
  16. data/lib/dependabot/python/file_updater/requirement_replacer.rb +2 -2
  17. data/lib/dependabot/python/file_updater/setup_file_sanitizer.rb +8 -8
  18. data/lib/dependabot/python/file_updater.rb +15 -2
  19. data/lib/dependabot/python/helpers.rb +20 -0
  20. data/lib/dependabot/python/metadata_finder.rb +2 -0
  21. data/lib/dependabot/python/native_helpers.rb +1 -1
  22. data/lib/dependabot/python/python_versions.rb +5 -5
  23. data/lib/dependabot/python/requirement.rb +7 -4
  24. data/lib/dependabot/python/requirement_parser.rb +20 -23
  25. data/lib/dependabot/python/update_checker/index_finder.rb +2 -2
  26. data/lib/dependabot/python/update_checker/latest_version_finder.rb +10 -7
  27. data/lib/dependabot/python/update_checker/pip_compile_version_resolver.rb +17 -19
  28. data/lib/dependabot/python/update_checker/pipenv_version_resolver.rb +29 -34
  29. data/lib/dependabot/python/update_checker/poetry_version_resolver.rb +45 -26
  30. data/lib/dependabot/python/update_checker/requirements_updater.rb +18 -5
  31. data/lib/dependabot/python/update_checker.rb +82 -27
  32. data/lib/dependabot/python/version.rb +2 -2
  33. metadata +16 -43
@@ -3,6 +3,7 @@
3
3
  require "excon"
4
4
  require "toml-rb"
5
5
  require "open3"
6
+ require "uri"
6
7
  require "dependabot/dependency"
7
8
  require "dependabot/errors"
8
9
  require "dependabot/shared_helpers"
@@ -23,18 +24,30 @@ module Dependabot
23
24
  # This class does version resolution for pyproject.toml files.
24
25
  class PoetryVersionResolver
25
26
  GIT_REFERENCE_NOT_FOUND_REGEX = /
26
- 'git'.*pypoetry-git-(?<name>.+?).{8}',
27
+ (?:'git'.*pypoetry-git-(?<name>.+?).{8}',
27
28
  'checkout',
28
29
  '(?<tag>.+?)'
29
- /x.freeze
30
+ |
31
+ Failed to checkout
32
+ (?<tag>.+?)
33
+ (?<url>.+?).git at '(?<tag>.+?)'
34
+ |
35
+ ...Failedtoclone
36
+ (?<url>.+?).gitat'(?<tag>.+?)',
37
+ verifyrefexistsonremote)
38
+ /x # TODO: remove the first clause and | when py3.6 support is EoL
30
39
  GIT_DEPENDENCY_UNREACHABLE_REGEX = /
31
- '\['git',
32
- \s+'clone',
33
- \s+'--recurse-submodules',
34
- \s+'(--)?',
35
- \s+'(?<url>.+?)'.*
36
- \s+exit\s+status\s+128
37
- /mx.freeze
40
+ (?:'\['git',
41
+ \s+'clone',
42
+ \s+'--recurse-submodules',
43
+ \s+'(--)?',
44
+ \s+'(?<url>.+?)'.*
45
+ \s+exit\s+status\s+128
46
+ |
47
+ \s+Failed\sto\sclone
48
+ \s+(?<url>.+?),
49
+ \s+check\syour\sgit\sconfiguration)
50
+ /mx # TODO: remove the first clause and | when py3.6 support is EoL
38
51
 
39
52
  attr_reader :dependency, :dependency_files, :credentials
40
53
 
@@ -61,7 +74,8 @@ module Dependabot
61
74
  false
62
75
  end
63
76
  rescue SharedHelpers::HelperSubprocessFailed => e
64
- raise unless e.message.include?("SolverProblemError")
77
+ raise unless e.message.include?("SolverProblemError") || # TODO: Remove once py3.6 is EoL
78
+ e.message.include?("version solving failed.")
65
79
 
66
80
  @resolvable[version] = false
67
81
  end
@@ -78,13 +92,11 @@ module Dependabot
78
92
  write_temporary_dependency_files(updated_req: requirement)
79
93
  add_auth_env_vars
80
94
 
81
- if python_version && !pre_installed_python?(python_version)
82
- run_poetry_command("pyenv install -s #{python_version}")
83
- run_poetry_command("pyenv exec pip install --upgrade pip")
84
- run_poetry_command(
85
- "pyenv exec pip install -r "\
86
- "#{NativeHelpers.python_requirements_path}"
87
- )
95
+ Helpers.install_required_python(python_version)
96
+
97
+ # use system git instead of the pure Python dulwich
98
+ unless python_version&.start_with?("3.6")
99
+ run_poetry_command("pyenv exec poetry config experimental.system-git-client true")
88
100
  end
89
101
 
90
102
  # Shell out to Poetry, which handles everything for us.
@@ -118,8 +130,13 @@ module Dependabot
118
130
  def handle_poetry_errors(error)
119
131
  if error.message.gsub(/\s/, "").match?(GIT_REFERENCE_NOT_FOUND_REGEX)
120
132
  message = error.message.gsub(/\s/, "")
121
- name = message.match(GIT_REFERENCE_NOT_FOUND_REGEX).
122
- named_captures.fetch("name")
133
+ match = message.match(GIT_REFERENCE_NOT_FOUND_REGEX)
134
+ name = if (url = match.named_captures.fetch("url"))
135
+ File.basename(URI.parse(url).path)
136
+ else
137
+ message.match(GIT_REFERENCE_NOT_FOUND_REGEX).
138
+ named_captures.fetch("name")
139
+ end
123
140
  raise GitDependencyReferenceNotFound, name
124
141
  end
125
142
 
@@ -130,7 +147,8 @@ module Dependabot
130
147
  end
131
148
 
132
149
  raise unless error.message.include?("SolverProblemError") ||
133
- error.message.include?("PackageNotFound")
150
+ error.message.include?("PackageNotFound") ||
151
+ error.message.include?("version solving failed.")
134
152
 
135
153
  check_original_requirements_resolvable
136
154
 
@@ -161,7 +179,8 @@ module Dependabot
161
179
  @original_reqs_resolvable = true
162
180
  rescue SharedHelpers::HelperSubprocessFailed => e
163
181
  raise unless e.message.include?("SolverProblemError") ||
164
- e.message.include?("PackageNotFound")
182
+ e.message.include?("PackageNotFound") ||
183
+ e.message.include?("version solving failed.")
165
184
 
166
185
  msg = clean_error_message(e.message)
167
186
  raise DependencyFileNotResolvable, msg
@@ -214,9 +233,9 @@ module Dependabot
214
233
  end
215
234
  return version if version
216
235
 
217
- msg = "Dependabot detected the following Python requirements "\
218
- "for your project: '#{requirements}'.\n\nCurrently, the "\
219
- "following Python versions are supported in Dependabot: "\
236
+ msg = "Dependabot detected the following Python requirements " \
237
+ "for your project: '#{requirements}'.\n\nCurrently, the " \
238
+ "following Python versions are supported in Dependabot: " \
220
239
  "#{PythonVersions::SUPPORTED_VERSIONS.join(', ')}."
221
240
  raise DependencyFileNotResolvable, msg
222
241
  end
@@ -265,7 +284,7 @@ module Dependabot
265
284
  pyproject_object = TomlRB.parse(pyproject_content)
266
285
  poetry_object = pyproject_object.dig("tool", "poetry")
267
286
 
268
- Dependabot::Python::FileParser::PoetryFilesParser::POETRY_DEPENDENCY_TYPES.each do |type|
287
+ Dependabot::Python::FileParser::PyprojectFilesParser::POETRY_DEPENDENCY_TYPES.each do |type|
269
288
  names = poetry_object[type]&.keys || []
270
289
  pkg_name = names.find { |nm| normalise(nm) == dependency.name }
271
290
  next unless pkg_name
@@ -318,7 +337,7 @@ module Dependabot
318
337
  stdout, process = Open3.capture2e(command)
319
338
  time_taken = Time.now - start
320
339
 
321
- # Raise an error with the output from the shell session if Pipenv
340
+ # Raise an error with the output from the shell session if poetry
322
341
  # returns a non-zero status
323
342
  return if process.success?
324
343
 
@@ -9,8 +9,8 @@ module Dependabot
9
9
  module Python
10
10
  class UpdateChecker
11
11
  class RequirementsUpdater
12
- PYPROJECT_OR_SEPARATOR = /(?<=[a-zA-Z0-9*])\s*\|+/.freeze
13
- PYPROJECT_SEPARATOR = /#{PYPROJECT_OR_SEPARATOR}|,/.freeze
12
+ PYPROJECT_OR_SEPARATOR = /(?<=[a-zA-Z0-9*])\s*\|+/
13
+ PYPROJECT_SEPARATOR = /#{PYPROJECT_OR_SEPARATOR}|,/
14
14
 
15
15
  class UnfixableRequirement < StandardError; end
16
16
 
@@ -175,11 +175,25 @@ module Dependabot
175
175
  end
176
176
  # rubocop:enable Metrics/PerceivedComplexity
177
177
 
178
- # rubocop:disable Metrics/PerceivedComplexity
179
178
  def updated_requirement(req)
180
179
  return req unless latest_resolvable_version
181
180
  return req unless req.fetch(:requirement)
182
181
 
182
+ case update_strategy
183
+ when :bump_versions
184
+ update_requirement(req)
185
+ when :bump_versions_if_necessary
186
+ update_requirement_if_needed(req)
187
+ end
188
+ end
189
+
190
+ def update_requirement_if_needed(req)
191
+ return req if new_version_satisfies?(req)
192
+
193
+ update_requirement(req)
194
+ end
195
+
196
+ def update_requirement(req)
183
197
  requirement_strings = req[:requirement].split(",").map(&:strip)
184
198
 
185
199
  new_requirement =
@@ -197,7 +211,6 @@ module Dependabot
197
211
  rescue UnfixableRequirement
198
212
  req.merge(requirement: :unfixable)
199
213
  end
200
- # rubocop:enable Metrics/PerceivedComplexity
201
214
 
202
215
  def new_version_satisfies?(req)
203
216
  requirement_class.
@@ -260,7 +273,7 @@ module Dependabot
260
273
  # Updates the version in a constraint to be the given version
261
274
  def bump_version(req_string, version_to_be_permitted)
262
275
  old_version = req_string.
263
- match(/(#{RequirementParser::VERSION})/).
276
+ match(/(#{RequirementParser::VERSION})/o).
264
277
  captures.first
265
278
 
266
279
  req_string.sub(
@@ -26,7 +26,7 @@ module Dependabot
26
26
  https://pypi.python.org/simple/
27
27
  https://pypi.org/simple/
28
28
  ).freeze
29
- VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-_]+)*/.freeze
29
+ VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-_]+)*/
30
30
 
31
31
  def latest_version
32
32
  @latest_version ||= fetch_latest_version
@@ -89,7 +89,7 @@ module Dependabot
89
89
 
90
90
  def updated_requirements
91
91
  RequirementsUpdater.new(
92
- requirements: dependency.requirements,
92
+ requirements: requirements,
93
93
  latest_resolvable_version: preferred_resolvable_version&.to_s,
94
94
  update_strategy: requirements_update_strategy,
95
95
  has_lockfile: !(pipfile_lock || poetry_lock || pyproject_lock).nil?
@@ -100,8 +100,8 @@ module Dependabot
100
100
  # If passed in as an option (in the base class) honour that option
101
101
  return @requirements_update_strategy.to_sym if @requirements_update_strategy
102
102
 
103
- # Otherwise, check if this is a poetry library or not
104
- poetry_library? ? :widen_ranges : :bump_versions
103
+ # Otherwise, check if this is a library or not
104
+ library? ? :widen_ranges : :bump_versions
105
105
  end
106
106
 
107
107
  private
@@ -115,6 +115,17 @@ module Dependabot
115
115
  raise NotImplementedError
116
116
  end
117
117
 
118
+ def preferred_version_resolvable_with_unlock?
119
+ # Our requirements file updater doesn't currently support widening
120
+ # ranges, so avoid updating this dependency if widening ranges has been
121
+ # required and the dependency is present on a requirements file.
122
+ # Otherwise, we will crash later on. TODO: Consider what the correct
123
+ # behavior is in these cases.
124
+ return false if requirements_update_strategy == :widen_ranges && updating_requirements_file?
125
+
126
+ super
127
+ end
128
+
118
129
  def fetch_lowest_resolvable_security_fix_version
119
130
  fix_version = lowest_security_fix_version
120
131
  return latest_resolvable_version if fix_version.nil?
@@ -132,10 +143,8 @@ module Dependabot
132
143
  resolver.resolvable?(version: fix_version) ? fix_version : nil
133
144
  end
134
145
 
135
- # rubocop:disable Metrics/PerceivedComplexity
136
146
  def resolver_type
137
- reqs = dependency.requirements
138
- req_files = reqs.map { |r| r.fetch(:file) }
147
+ reqs = requirements
139
148
 
140
149
  # If there are no requirements then this is a sub-dependency. It
141
150
  # must come from one of Pipenv, Poetry or pip-tools, and can't come
@@ -144,9 +153,9 @@ module Dependabot
144
153
 
145
154
  # Otherwise, this is a top-level dependency, and we can figure out
146
155
  # which resolver to use based on the filename of its requirements
147
- return :pipenv if req_files.any? { |f| f == "Pipfile" }
148
- return :poetry if req_files.any? { |f| f == "pyproject.toml" }
149
- return :pip_compile if req_files.any? { |f| f.end_with?(".in") }
156
+ return :pipenv if updating_pipfile?
157
+ return pyproject_resolver if updating_pyproject?
158
+ return :pip_compile if updating_in_file?
150
159
 
151
160
  if dependency.version && !exact_requirement?(reqs)
152
161
  subdependency_resolver
@@ -154,7 +163,6 @@ module Dependabot
154
163
  :requirements
155
164
  end
156
165
  end
157
- # rubocop:enable Metrics/PerceivedComplexity
158
166
 
159
167
  def subdependency_resolver
160
168
  return :pipenv if pipfile_lock
@@ -164,6 +172,12 @@ module Dependabot
164
172
  raise "Claimed to be a sub-dependency, but no lockfile exists!"
165
173
  end
166
174
 
175
+ def pyproject_resolver
176
+ return :poetry if poetry_based?
177
+
178
+ :requirements
179
+ end
180
+
167
181
  def exact_requirement?(reqs)
168
182
  reqs = reqs.map { |r| r.fetch(:requirement) }
169
183
  reqs = reqs.compact
@@ -204,16 +218,14 @@ module Dependabot
204
218
  end
205
219
 
206
220
  def current_requirement_string
207
- reqs = dependency.requirements
221
+ reqs = requirements
208
222
  return if reqs.none?
209
223
 
210
- requirement =
211
- case resolver_type
212
- when :pipenv then reqs.find { |r| r[:file] == "Pipfile" }
213
- when :poetry then reqs.find { |r| r[:file] == "pyproject.toml" }
214
- when :pip_compile then reqs.find { |r| r[:file].end_with?(".in") }
215
- when :requirements then reqs.find { |r| r[:file].end_with?(".txt") }
216
- end
224
+ requirement = reqs.find do |r|
225
+ file = r[:file]
226
+
227
+ file == "Pipfile" || file == "pyproject.toml" || file.end_with?(".in") || file.end_with?(".txt")
228
+ end
217
229
 
218
230
  requirement&.fetch(:requirement)
219
231
  end
@@ -238,7 +250,7 @@ module Dependabot
238
250
  return ">= #{dependency.version}" if dependency.version
239
251
 
240
252
  version_for_requirement =
241
- dependency.requirements.map { |r| r[:requirement] }.compact.
253
+ requirements.filter_map { |r| r[:requirement] }.
242
254
  reject { |req_string| req_string.start_with?("<") }.
243
255
  select { |req_string| req_string.match?(VERSION_REGEX) }.
244
256
  map { |req_string| req_string.match(VERSION_REGEX) }.
@@ -263,26 +275,53 @@ module Dependabot
263
275
  )
264
276
  end
265
277
 
266
- def poetry_library?
267
- return false unless pyproject
278
+ def poetry_based?
279
+ updating_pyproject? && !poetry_details.nil?
280
+ end
281
+
282
+ def library?
283
+ return unless updating_pyproject?
268
284
 
269
285
  # Hit PyPi and check whether there are details for a library with a
270
286
  # matching name and description
271
- details = TomlRB.parse(pyproject.content).dig("tool", "poetry")
272
- return false unless details
273
-
274
287
  index_response = Dependabot::RegistryClient.get(
275
- url: "https://pypi.org/pypi/#{normalised_name(details['name'])}/json/"
288
+ url: "https://pypi.org/pypi/#{normalised_name(library_details['name'])}/json/"
276
289
  )
277
290
 
278
291
  return false unless index_response.status == 200
279
292
 
280
293
  pypi_info = JSON.parse(index_response.body)["info"] || {}
281
- pypi_info["summary"] == details["description"]
294
+ pypi_info["summary"] == library_details["description"]
295
+ rescue Excon::Error::Timeout
296
+ false
282
297
  rescue URI::InvalidURIError
283
298
  false
284
299
  end
285
300
 
301
+ def updating_pipfile?
302
+ requirement_files.any?("Pipfile")
303
+ end
304
+
305
+ def updating_pyproject?
306
+ requirement_files.any?("pyproject.toml")
307
+ end
308
+
309
+ def updating_in_file?
310
+ requirement_files.any? { |f| f.end_with?(".in") }
311
+ end
312
+
313
+ def updating_requirements_file?
314
+ requirement_files.any? { |f| f =~ /\.txt$|\.in$/ }
315
+ end
316
+
317
+ def requirement_files
318
+ requirements.map { |r| r.fetch(:file) }
319
+ end
320
+
321
+ def requirements
322
+ dependency.requirements
323
+ end
324
+
286
325
  def normalised_name(name)
287
326
  NameNormaliser.normalise(name)
288
327
  end
@@ -307,6 +346,22 @@ module Dependabot
307
346
  dependency_files.find { |f| f.name == "poetry.lock" }
308
347
  end
309
348
 
349
+ def library_details
350
+ @library_details ||= poetry_details || standard_details
351
+ end
352
+
353
+ def poetry_details
354
+ @poetry_details ||= toml_content.dig("tool", "poetry")
355
+ end
356
+
357
+ def standard_details
358
+ @standard_details ||= toml_content["project"]
359
+ end
360
+
361
+ def toml_content
362
+ @toml_content ||= TomlRB.parse(pyproject.content)
363
+ end
364
+
310
365
  def pip_compile_files
311
366
  dependency_files.select { |f| f.name.end_with?(".in") }
312
367
  end
@@ -16,9 +16,9 @@ module Dependabot
16
16
 
17
17
  # See https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
18
18
  VERSION_PATTERN = 'v?([1-9][0-9]*!)?[0-9]+[0-9a-zA-Z]*(?>\.[0-9a-zA-Z]+)*' \
19
- '(-[0-9A-Za-z-]+(\.[0-9a-zA-Z-]+)*)?' \
19
+ '(-[0-9A-Za-z]+(\.[0-9a-zA-Z]+)*)?' \
20
20
  '(\+[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)*)?'
21
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/.freeze
21
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/
22
22
 
23
23
  def self.correct?(version)
24
24
  return false if version.nil?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-python
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.211.0
4
+ version: 0.213.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-23 00:00:00.000000000 Z
11
+ date: 2022-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,42 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.211.0
19
+ version: 0.213.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.211.0
27
- - !ruby/object:Gem::Dependency
28
- name: debase
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '='
32
- - !ruby/object:Gem::Version
33
- version: 0.2.3
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '='
39
- - !ruby/object:Gem::Version
40
- version: 0.2.3
41
- - !ruby/object:Gem::Dependency
42
- name: debase-ruby_core_source
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 0.10.16
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 0.10.16
26
+ version: 0.213.0
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: debug
57
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +58,14 @@ dependencies:
86
58
  requirements:
87
59
  - - "~>"
88
60
  - !ruby/object:Gem::Version
89
- version: 3.11.1
61
+ version: 3.13.0
90
62
  type: :development
91
63
  prerelease: false
92
64
  version_requirements: !ruby/object:Gem::Requirement
93
65
  requirements:
94
66
  - - "~>"
95
67
  - !ruby/object:Gem::Version
96
- version: 3.11.1
68
+ version: 3.13.0
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: rake
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -142,28 +114,28 @@ dependencies:
142
114
  requirements:
143
115
  - - "~>"
144
116
  - !ruby/object:Gem::Version
145
- version: 1.35.1
117
+ version: 1.37.1
146
118
  type: :development
147
119
  prerelease: false
148
120
  version_requirements: !ruby/object:Gem::Requirement
149
121
  requirements:
150
122
  - - "~>"
151
123
  - !ruby/object:Gem::Version
152
- version: 1.35.1
124
+ version: 1.37.1
153
125
  - !ruby/object:Gem::Dependency
154
- name: ruby-debug-ide
126
+ name: rubocop-performance
155
127
  requirement: !ruby/object:Gem::Requirement
156
128
  requirements:
157
129
  - - "~>"
158
130
  - !ruby/object:Gem::Version
159
- version: 0.7.3
131
+ version: 1.15.0
160
132
  type: :development
161
133
  prerelease: false
162
134
  version_requirements: !ruby/object:Gem::Requirement
163
135
  requirements:
164
136
  - - "~>"
165
137
  - !ruby/object:Gem::Version
166
- version: 0.7.3
138
+ version: 1.15.0
167
139
  - !ruby/object:Gem::Dependency
168
140
  name: simplecov
169
141
  requirement: !ruby/object:Gem::Requirement
@@ -252,7 +224,7 @@ files:
252
224
  - lib/dependabot/python/file_fetcher.rb
253
225
  - lib/dependabot/python/file_parser.rb
254
226
  - lib/dependabot/python/file_parser/pipfile_files_parser.rb
255
- - lib/dependabot/python/file_parser/poetry_files_parser.rb
227
+ - lib/dependabot/python/file_parser/pyproject_files_parser.rb
256
228
  - lib/dependabot/python/file_parser/python_requirement_parser.rb
257
229
  - lib/dependabot/python/file_parser/setup_file_parser.rb
258
230
  - lib/dependabot/python/file_updater.rb
@@ -265,6 +237,7 @@ files:
265
237
  - lib/dependabot/python/file_updater/requirement_file_updater.rb
266
238
  - lib/dependabot/python/file_updater/requirement_replacer.rb
267
239
  - lib/dependabot/python/file_updater/setup_file_sanitizer.rb
240
+ - lib/dependabot/python/helpers.rb
268
241
  - lib/dependabot/python/metadata_finder.rb
269
242
  - lib/dependabot/python/name_normaliser.rb
270
243
  - lib/dependabot/python/native_helpers.rb
@@ -292,14 +265,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
292
265
  requirements:
293
266
  - - ">="
294
267
  - !ruby/object:Gem::Version
295
- version: 2.7.0
268
+ version: 3.1.0
296
269
  required_rubygems_version: !ruby/object:Gem::Requirement
297
270
  requirements:
298
271
  - - ">="
299
272
  - !ruby/object:Gem::Version
300
- version: 2.7.0
273
+ version: 3.1.0
301
274
  requirements: []
302
- rubygems_version: 3.1.6
275
+ rubygems_version: 3.3.7
303
276
  signing_key:
304
277
  specification_version: 4
305
278
  summary: Python support for dependabot