dependabot-python 0.211.0 → 0.213.0

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.
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