dependabot-python 0.104.0 → 0.104.1
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1704546d9328a26bba38bd159150a5238797253f07538aa5ee731e307d1a5a86
|
4
|
+
data.tar.gz: 4e1a258ebb51cedb6cd6c801d2ac4a7f2f191658b163b56046a7ab526c24c287
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b994991d16cafe0ece709fdc52f5bbe5f25cb3dd635ad08fab6b87885926afe281231642d28cfe24e26724bccd4427750d99dad27e718882ecc04bf333e8ff5
|
7
|
+
data.tar.gz: 37ffc6c72e569f50b2c73999089237512b08742e10473fb02f5b7047751be623ffeb9d9d8298376e1748748274dfe22c64c6a15ee60647de831317f8caf71e33
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dependabot/python/update_checker"
|
4
|
+
require "dependabot/python/authed_url_builder"
|
5
|
+
require "dependabot/errors"
|
6
|
+
|
7
|
+
module Dependabot
|
8
|
+
module Python
|
9
|
+
class UpdateChecker
|
10
|
+
class IndexFinder
|
11
|
+
PYPI_BASE_URL = "https://pypi.python.org/simple/"
|
12
|
+
ENVIRONMENT_VARIABLE_REGEX = /\$\{.+\}/.freeze
|
13
|
+
|
14
|
+
def initialize(dependency_files:, credentials:)
|
15
|
+
@dependency_files = dependency_files
|
16
|
+
@credentials = credentials
|
17
|
+
end
|
18
|
+
|
19
|
+
def index_urls
|
20
|
+
extra_index_urls =
|
21
|
+
config_variable_index_urls[:extra] +
|
22
|
+
pipfile_index_urls[:extra] +
|
23
|
+
requirement_file_index_urls[:extra] +
|
24
|
+
pip_conf_index_urls[:extra]
|
25
|
+
|
26
|
+
extra_index_urls = extra_index_urls.map do |url|
|
27
|
+
clean_check_and_remove_environment_variables(url)
|
28
|
+
end
|
29
|
+
|
30
|
+
# URL encode any `@` characters within registry URL creds.
|
31
|
+
# TODO: The test that fails if the `map` here is removed is likely a
|
32
|
+
# bug in Ruby's URI parser, and should be fixed there.
|
33
|
+
[main_index_url, *extra_index_urls].map do |url|
|
34
|
+
url.rpartition("@").tap { |a| a.first.gsub!("@", "%40") }.join
|
35
|
+
end.uniq
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :dependency_files, :credentials
|
41
|
+
|
42
|
+
def main_index_url
|
43
|
+
url =
|
44
|
+
config_variable_index_urls[:main] ||
|
45
|
+
pipfile_index_urls[:main] ||
|
46
|
+
requirement_file_index_urls[:main] ||
|
47
|
+
pip_conf_index_urls[:main] ||
|
48
|
+
PYPI_BASE_URL
|
49
|
+
|
50
|
+
return unless url
|
51
|
+
|
52
|
+
clean_check_and_remove_environment_variables(url)
|
53
|
+
end
|
54
|
+
|
55
|
+
def requirement_file_index_urls
|
56
|
+
urls = { main: nil, extra: [] }
|
57
|
+
|
58
|
+
requirements_files.each do |file|
|
59
|
+
if file.content.match?(/^--index-url\s(.+)/)
|
60
|
+
urls[:main] =
|
61
|
+
file.content.match(/^--index-url\s(.+)/).captures.first
|
62
|
+
end
|
63
|
+
urls[:extra] += file.content.scan(/^--extra-index-url\s(.+)/).
|
64
|
+
flatten
|
65
|
+
end
|
66
|
+
|
67
|
+
urls
|
68
|
+
end
|
69
|
+
|
70
|
+
def pip_conf_index_urls
|
71
|
+
urls = { main: nil, extra: [] }
|
72
|
+
|
73
|
+
return urls unless pip_conf
|
74
|
+
|
75
|
+
content = pip_conf.content
|
76
|
+
|
77
|
+
if content.match?(/^index-url\s*=/x)
|
78
|
+
urls[:main] = content.match(/^index-url\s*=\s*(.+)/).
|
79
|
+
captures.first
|
80
|
+
end
|
81
|
+
urls[:extra] += content.scan(/^extra-index-url\s*=(.+)/).flatten
|
82
|
+
|
83
|
+
urls
|
84
|
+
end
|
85
|
+
|
86
|
+
def pipfile_index_urls
|
87
|
+
urls = { main: nil, extra: [] }
|
88
|
+
|
89
|
+
return urls unless pipfile
|
90
|
+
|
91
|
+
pipfile_object = TomlRB.parse(pipfile.content)
|
92
|
+
|
93
|
+
urls[:main] = pipfile_object["source"]&.first&.fetch("url", nil)
|
94
|
+
|
95
|
+
pipfile_object["source"]&.each do |source|
|
96
|
+
urls[:extra] << source.fetch("url") if source["url"]
|
97
|
+
end
|
98
|
+
urls[:extra] = urls[:extra].uniq
|
99
|
+
|
100
|
+
urls
|
101
|
+
rescue TomlRB::ParseError, TomlRB::ValueOverwriteError
|
102
|
+
urls
|
103
|
+
end
|
104
|
+
|
105
|
+
def config_variable_index_urls
|
106
|
+
urls = { main: nil, extra: [] }
|
107
|
+
|
108
|
+
index_url_creds = credentials.
|
109
|
+
select { |cred| cred["type"] == "python_index" }
|
110
|
+
|
111
|
+
if (main_cred = index_url_creds.find { |cred| cred["replaces-base"] })
|
112
|
+
urls[:main] = AuthedUrlBuilder.authed_url(credential: main_cred)
|
113
|
+
end
|
114
|
+
|
115
|
+
urls[:extra] =
|
116
|
+
index_url_creds.
|
117
|
+
reject { |cred| cred["replaces-base"] }.
|
118
|
+
map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
|
119
|
+
|
120
|
+
urls
|
121
|
+
end
|
122
|
+
|
123
|
+
def clean_check_and_remove_environment_variables(url)
|
124
|
+
url = url.strip.gsub(%r{/*$}, "") + "/"
|
125
|
+
|
126
|
+
unless url.match?(ENVIRONMENT_VARIABLE_REGEX)
|
127
|
+
return authed_base_url(url)
|
128
|
+
end
|
129
|
+
|
130
|
+
config_variable_urls =
|
131
|
+
[
|
132
|
+
config_variable_index_urls[:main],
|
133
|
+
*config_variable_index_urls[:extra]
|
134
|
+
].
|
135
|
+
compact.
|
136
|
+
map { |u| u.strip.gsub(%r{/*$}, "") + "/" }
|
137
|
+
|
138
|
+
regexp = url.split(ENVIRONMENT_VARIABLE_REGEX).
|
139
|
+
map { |part| Regexp.quote(part) }.
|
140
|
+
join(".+")
|
141
|
+
authed_url = config_variable_urls.find { |u| u.match?(regexp) }
|
142
|
+
return authed_url if authed_url
|
143
|
+
|
144
|
+
cleaned_url = url.gsub(%r{#{ENVIRONMENT_VARIABLE_REGEX}/?}, "")
|
145
|
+
authed_url = authed_base_url(cleaned_url)
|
146
|
+
return authed_url if credential_for(cleaned_url)
|
147
|
+
|
148
|
+
raise PrivateSourceAuthenticationFailure, url
|
149
|
+
end
|
150
|
+
|
151
|
+
def authed_base_url(base_url)
|
152
|
+
cred = credential_for(base_url)
|
153
|
+
return base_url unless cred
|
154
|
+
|
155
|
+
AuthedUrlBuilder.authed_url(credential: cred).gsub(%r{/*$}, "") + "/"
|
156
|
+
end
|
157
|
+
|
158
|
+
def credential_for(url)
|
159
|
+
credentials.
|
160
|
+
select { |c| c["type"] == "python_index" }.
|
161
|
+
find do |c|
|
162
|
+
cred_url = c.fetch("index-url").gsub(%r{/*$}, "") + "/"
|
163
|
+
cred_url.include?(url)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def pip_conf
|
168
|
+
dependency_files.find { |f| f.name == "pip.conf" }
|
169
|
+
end
|
170
|
+
|
171
|
+
def pipfile
|
172
|
+
dependency_files.find { |f| f.name == "Pipfile" }
|
173
|
+
end
|
174
|
+
|
175
|
+
def pyproject
|
176
|
+
dependency_files.find { |f| f.name == "pyproject.toml" }
|
177
|
+
end
|
178
|
+
|
179
|
+
def requirements_files
|
180
|
+
dependency_files.select { |f| f.name.match?(/requirements/x) }
|
181
|
+
end
|
182
|
+
|
183
|
+
def pip_compile_files
|
184
|
+
dependency_files.select { |f| f.name.end_with?(".in") }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -10,7 +10,7 @@ module Dependabot
|
|
10
10
|
module Python
|
11
11
|
class UpdateChecker
|
12
12
|
class LatestVersionFinder
|
13
|
-
|
13
|
+
require_relative "index_finder"
|
14
14
|
|
15
15
|
def initialize(dependency:, dependency_files:, credentials:,
|
16
16
|
ignored_versions:)
|
@@ -36,21 +36,37 @@ module Dependabot
|
|
36
36
|
|
37
37
|
def fetch_latest_version
|
38
38
|
versions = available_versions
|
39
|
-
versions
|
40
|
-
versions
|
39
|
+
versions = filter_prerelease_versions(versions)
|
40
|
+
versions = filter_ignored_versions(versions)
|
41
41
|
versions.max
|
42
42
|
end
|
43
43
|
|
44
44
|
def fetch_latest_version_with_no_unlock
|
45
45
|
versions = available_versions
|
46
|
+
versions = filter_prerelease_versions(versions)
|
47
|
+
versions = filter_ignored_versions(versions)
|
48
|
+
versions = filter_out_of_range_versions(versions)
|
49
|
+
versions.max
|
50
|
+
end
|
51
|
+
|
52
|
+
def filter_prerelease_versions(versions_array)
|
53
|
+
return versions_array if wants_prerelease?
|
54
|
+
|
55
|
+
versions_array.reject(&:prerelease?)
|
56
|
+
end
|
57
|
+
|
58
|
+
def filter_ignored_versions(versions_array)
|
59
|
+
versions_array.
|
60
|
+
reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }
|
61
|
+
end
|
62
|
+
|
63
|
+
def filter_out_of_range_versions(versions_array)
|
46
64
|
reqs = dependency.requirements.map do |r|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }.
|
53
|
-
find { |v| reqs.all? { |r| r.satisfied_by?(v) } }
|
65
|
+
requirement_class.requirements_array(r.fetch(:requirement))
|
66
|
+
end.compact
|
67
|
+
|
68
|
+
versions_array.
|
69
|
+
select { |v| reqs.all? { |r| r.any? { |o| o.satisfied_by?(v) } } }
|
54
70
|
end
|
55
71
|
|
56
72
|
def wants_prerelease?
|
@@ -68,65 +84,42 @@ module Dependabot
|
|
68
84
|
# See https://www.python.org/dev/peps/pep-0503/ for details of the
|
69
85
|
# Simple Repository API we use here.
|
70
86
|
def available_versions
|
71
|
-
|
72
|
-
|
73
|
-
|
87
|
+
@available_versions ||=
|
88
|
+
index_urls.flat_map do |index_url|
|
89
|
+
sanitized_url = index_url.gsub(%r{(?<=//).*(?=@)}, "redacted")
|
90
|
+
index_response = registry_response_for_dependency(index_url)
|
91
|
+
|
92
|
+
if [401, 403].include?(index_response.status) &&
|
93
|
+
[401, 403].include?(registry_index_response(index_url).status)
|
94
|
+
raise PrivateSourceAuthenticationFailure, sanitized_url
|
95
|
+
end
|
96
|
+
|
97
|
+
index_response.body.
|
98
|
+
scan(%r{<a\s.*?>(.*?)</a>}m).flatten.
|
99
|
+
select { |n| n.match?(name_regex) }.
|
100
|
+
map do |filename|
|
101
|
+
version =
|
102
|
+
filename.
|
103
|
+
gsub(/#{name_regex}-/i, "").
|
104
|
+
split(/-|\.tar\.|\.zip|\.whl/).
|
105
|
+
first
|
106
|
+
next unless version_class.correct?(version)
|
107
|
+
|
108
|
+
version_class.new(version)
|
109
|
+
end.compact
|
110
|
+
rescue Excon::Error::Timeout, Excon::Error::Socket
|
111
|
+
raise if MAIN_PYPI_INDEXES.include?(index_url)
|
74
112
|
|
75
|
-
if [401, 403].include?(index_response.status) &&
|
76
|
-
[401, 403].include?(registry_index_response(index_url).status)
|
77
113
|
raise PrivateSourceAuthenticationFailure, sanitized_url
|
78
114
|
end
|
79
|
-
|
80
|
-
index_response.body.
|
81
|
-
scan(%r{<a\s.*?>(.*?)</a>}m).flatten.
|
82
|
-
select { |n| n.match?(name_regex) }.
|
83
|
-
map do |filename|
|
84
|
-
version =
|
85
|
-
filename.
|
86
|
-
gsub(/#{name_regex}-/i, "").
|
87
|
-
split(/-|\.tar\.|\.zip|\.whl/).
|
88
|
-
first
|
89
|
-
next unless version_class.correct?(version)
|
90
|
-
|
91
|
-
version_class.new(version)
|
92
|
-
end.compact
|
93
|
-
rescue Excon::Error::Timeout, Excon::Error::Socket
|
94
|
-
next if MAIN_PYPI_INDEXES.include?(index_url)
|
95
|
-
|
96
|
-
raise PrivateSourceAuthenticationFailure, sanitized_url
|
97
|
-
end
|
98
115
|
end
|
99
116
|
|
100
117
|
def index_urls
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
extra_index_urls = extra_index_urls.map do |url|
|
108
|
-
clean_check_and_remove_environment_variables(url)
|
109
|
-
end
|
110
|
-
|
111
|
-
# URL encode any `@` characters within registry URL creds.
|
112
|
-
# TODO: The test that fails if the `map` here is removed is likely a
|
113
|
-
# bug in Ruby's URI parser, and should be fixed there.
|
114
|
-
[main_index_url, *extra_index_urls].map do |url|
|
115
|
-
url.rpartition("@").tap { |a| a.first.gsub!("@", "%40") }.join
|
116
|
-
end.uniq
|
117
|
-
end
|
118
|
-
|
119
|
-
def main_index_url
|
120
|
-
url =
|
121
|
-
config_variable_index_urls[:main] ||
|
122
|
-
pipfile_index_urls[:main] ||
|
123
|
-
requirement_file_index_urls[:main] ||
|
124
|
-
pip_conf_index_urls[:main] ||
|
125
|
-
"https://pypi.python.org/simple/"
|
126
|
-
|
127
|
-
return unless url
|
128
|
-
|
129
|
-
clean_check_and_remove_environment_variables(url)
|
118
|
+
@index_urls ||=
|
119
|
+
IndexFinder.new(
|
120
|
+
dependency_files: dependency_files,
|
121
|
+
credentials: credentials
|
122
|
+
).index_urls
|
130
123
|
end
|
131
124
|
|
132
125
|
def registry_response_for_dependency(index_url)
|
@@ -145,118 +138,6 @@ module Dependabot
|
|
145
138
|
)
|
146
139
|
end
|
147
140
|
|
148
|
-
def requirement_file_index_urls
|
149
|
-
urls = { main: nil, extra: [] }
|
150
|
-
|
151
|
-
requirements_files.each do |file|
|
152
|
-
if file.content.match?(/^--index-url\s(.+)/)
|
153
|
-
urls[:main] =
|
154
|
-
file.content.match(/^--index-url\s(.+)/).captures.first
|
155
|
-
end
|
156
|
-
urls[:extra] += file.content.scan(/^--extra-index-url\s(.+)/).
|
157
|
-
flatten
|
158
|
-
end
|
159
|
-
|
160
|
-
urls
|
161
|
-
end
|
162
|
-
|
163
|
-
def pip_conf_index_urls
|
164
|
-
urls = { main: nil, extra: [] }
|
165
|
-
|
166
|
-
return urls unless pip_conf
|
167
|
-
|
168
|
-
content = pip_conf.content
|
169
|
-
|
170
|
-
if content.match?(/^index-url\s*=/x)
|
171
|
-
urls[:main] = content.match(/^index-url\s*=\s*(.+)/).
|
172
|
-
captures.first
|
173
|
-
end
|
174
|
-
urls[:extra] += content.scan(/^extra-index-url\s*=(.+)/).flatten
|
175
|
-
|
176
|
-
urls
|
177
|
-
end
|
178
|
-
|
179
|
-
def pipfile_index_urls
|
180
|
-
urls = { main: nil, extra: [] }
|
181
|
-
|
182
|
-
return urls unless pipfile
|
183
|
-
|
184
|
-
pipfile_object = TomlRB.parse(pipfile.content)
|
185
|
-
|
186
|
-
urls[:main] = pipfile_object["source"]&.first&.fetch("url", nil)
|
187
|
-
|
188
|
-
pipfile_object["source"]&.each do |source|
|
189
|
-
urls[:extra] << source.fetch("url") if source["url"]
|
190
|
-
end
|
191
|
-
urls[:extra] = urls[:extra].uniq
|
192
|
-
|
193
|
-
urls
|
194
|
-
rescue TomlRB::ParseError, TomlRB::ValueOverwriteError
|
195
|
-
urls
|
196
|
-
end
|
197
|
-
|
198
|
-
def config_variable_index_urls
|
199
|
-
urls = { main: nil, extra: [] }
|
200
|
-
|
201
|
-
index_url_creds = credentials.
|
202
|
-
select { |cred| cred["type"] == "python_index" }
|
203
|
-
|
204
|
-
if (main_cred = index_url_creds.find { |cred| cred["replaces-base"] })
|
205
|
-
urls[:main] = AuthedUrlBuilder.authed_url(credential: main_cred)
|
206
|
-
end
|
207
|
-
|
208
|
-
urls[:extra] =
|
209
|
-
index_url_creds.
|
210
|
-
reject { |cred| cred["replaces-base"] }.
|
211
|
-
map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
|
212
|
-
|
213
|
-
urls
|
214
|
-
end
|
215
|
-
|
216
|
-
def clean_check_and_remove_environment_variables(url)
|
217
|
-
url = url.strip.gsub(%r{/*$}, "") + "/"
|
218
|
-
|
219
|
-
unless url.match?(ENVIRONMENT_VARIABLE_REGEX)
|
220
|
-
return authed_base_url(url)
|
221
|
-
end
|
222
|
-
|
223
|
-
config_variable_urls =
|
224
|
-
[
|
225
|
-
config_variable_index_urls[:main],
|
226
|
-
*config_variable_index_urls[:extra]
|
227
|
-
].
|
228
|
-
compact.
|
229
|
-
map { |u| u.strip.gsub(%r{/*$}, "") + "/" }
|
230
|
-
|
231
|
-
regexp = url.split(ENVIRONMENT_VARIABLE_REGEX).
|
232
|
-
map { |part| Regexp.quote(part) }.
|
233
|
-
join(".+")
|
234
|
-
authed_url = config_variable_urls.find { |u| u.match?(regexp) }
|
235
|
-
return authed_url if authed_url
|
236
|
-
|
237
|
-
cleaned_url = url.gsub(%r{#{ENVIRONMENT_VARIABLE_REGEX}/?}, "")
|
238
|
-
authed_url = authed_base_url(cleaned_url)
|
239
|
-
return authed_url if credential_for(cleaned_url)
|
240
|
-
|
241
|
-
raise PrivateSourceAuthenticationFailure, url
|
242
|
-
end
|
243
|
-
|
244
|
-
def authed_base_url(base_url)
|
245
|
-
cred = credential_for(base_url)
|
246
|
-
return base_url unless cred
|
247
|
-
|
248
|
-
AuthedUrlBuilder.authed_url(credential: cred).gsub(%r{/*$}, "") + "/"
|
249
|
-
end
|
250
|
-
|
251
|
-
def credential_for(url)
|
252
|
-
credentials.
|
253
|
-
select { |c| c["type"] == "python_index" }.
|
254
|
-
find do |c|
|
255
|
-
cred_url = c.fetch("index-url").gsub(%r{/*$}, "") + "/"
|
256
|
-
cred_url.include?(url)
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
141
|
def ignore_reqs
|
261
142
|
ignored_versions.map { |req| requirement_class.new(req.split(",")) }
|
262
143
|
end
|
@@ -271,26 +152,6 @@ module Dependabot
|
|
271
152
|
/#{parts.join("[\s_.-]")}/i
|
272
153
|
end
|
273
154
|
|
274
|
-
def pip_conf
|
275
|
-
dependency_files.find { |f| f.name == "pip.conf" }
|
276
|
-
end
|
277
|
-
|
278
|
-
def pipfile
|
279
|
-
dependency_files.find { |f| f.name == "Pipfile" }
|
280
|
-
end
|
281
|
-
|
282
|
-
def pyproject
|
283
|
-
dependency_files.find { |f| f.name == "pyproject.toml" }
|
284
|
-
end
|
285
|
-
|
286
|
-
def requirements_files
|
287
|
-
dependency_files.select { |f| f.name.match?(/requirements/x) }
|
288
|
-
end
|
289
|
-
|
290
|
-
def pip_compile_files
|
291
|
-
dependency_files.select { |f| f.name.end_with?(".in") }
|
292
|
-
end
|
293
|
-
|
294
155
|
def version_class
|
295
156
|
Utils.version_class_for_package_manager(dependency.package_manager)
|
296
157
|
end
|
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.104.
|
4
|
+
version: 0.104.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dependabot-common
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.104.
|
19
|
+
version: 0.104.1
|
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.104.
|
26
|
+
version: 0.104.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: byebug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- lib/dependabot/python/requirement.rb
|
173
173
|
- lib/dependabot/python/requirement_parser.rb
|
174
174
|
- lib/dependabot/python/update_checker.rb
|
175
|
+
- lib/dependabot/python/update_checker/index_finder.rb
|
175
176
|
- lib/dependabot/python/update_checker/latest_version_finder.rb
|
176
177
|
- lib/dependabot/python/update_checker/pip_compile_version_resolver.rb
|
177
178
|
- lib/dependabot/python/update_checker/pipfile_version_resolver.rb
|