dependabot-python 0.95.54 → 0.95.55

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 74f22700f2b7bb90f947e612663e7804dcbc3f1204d0755d199b956248f39723
4
- data.tar.gz: 30e4c2db194af67f082d90f00f44ff2b71744fd83a49482c655cc0489be22626
3
+ metadata.gz: fa4c36a5edfef2e030d8a2a0ef9fba45c033fe49a69bc35d633617b552dcc0fc
4
+ data.tar.gz: 228f9bca574583710c4175eb963911be3ae534d4d5260250ce718dadcf1e7e53
5
5
  SHA512:
6
- metadata.gz: 38dc4824a6195dbe0b672e51e4bdb19c66130fb07f0d82ee2c9cdcdf458af1b7846fed377243fe6ae9f3eec1c6abe2bd0701c9a8cd559ec80a949aa5e5071b9d
7
- data.tar.gz: cd1eb2935c0955bdb30586589b980e6884bc8fa63c7c472eb0406cf1666065841af77907044bba4982eaf16349f07b804c28248aa5c17ce75d2491260d10c744
6
+ metadata.gz: 7faac2287e48dd8ec444516847d261616f31416aee54ac3d4d0c7c0985e0a38626793abebb75bf5bf0868de38e064186a180516ac2e2738b7d429adf16843002
7
+ data.tar.gz: 001a51d1416b8009de478bb768d4875904388a03a453f0a93ae41e8dfcb6f86fc0084fb55f08a8b13079f7368517652100a8a0a00130b3dbc9b35f216b0f40f4
@@ -6,6 +6,7 @@ require "dependabot/python/file_fetcher"
6
6
  require "dependabot/python/file_updater"
7
7
  require "dependabot/shared_helpers"
8
8
  require "dependabot/python/native_helpers"
9
+ require "dependabot/python/python_versions"
9
10
 
10
11
  # rubocop:disable Metrics/ClassLength
11
12
  module Dependabot
@@ -57,22 +58,26 @@ module Dependabot
57
58
  def compile_new_requirement_files
58
59
  SharedHelpers.in_a_temporary_directory do
59
60
  write_updated_dependency_files
61
+ install_required_python
60
62
 
61
63
  filenames_to_compile.each do |filename|
62
64
  # Shell out to pip-compile, generate a new set of requirements.
63
65
  # This is slow, as pip-compile needs to do installs.
64
- run_command(
66
+ run_pip_compile_command(
65
67
  "pyenv exec pip-compile #{pip_compile_options(filename)} "\
66
68
  "-P #{dependency.name}==#{dependency.version} #{filename}"
67
69
  )
68
70
  # Run pip-compile a second time, without an update argument, to
69
71
  # ensure it resets the right comments.
70
- run_command(
72
+ run_pip_compile_command(
71
73
  "pyenv exec pip-compile #{pip_compile_options(filename)} "\
72
74
  "#{filename}"
73
75
  )
74
76
  end
75
77
 
78
+ # Remove any .python-version file before parsing the reqs
79
+ FileUtils.remove_entry(".python-version", true)
80
+
76
81
  dependency_files.map do |file|
77
82
  next unless file.name.end_with?(".txt")
78
83
 
@@ -124,7 +129,6 @@ module Dependabot
124
129
  ).updated_dependency_files
125
130
  end
126
131
 
127
- # rubocop:disable Metrics/MethodLength
128
132
  def run_command(command)
129
133
  command = command.dup
130
134
  env_cmd = [python_env, command].compact
@@ -132,9 +136,7 @@ module Dependabot
132
136
  stdout, process = Open3.capture2e(*env_cmd)
133
137
  time_taken = Time.now - start
134
138
 
135
- # Raise an error with the output from the shell session if
136
- # pip-compile returns a non-zero status
137
- return if process.success?
139
+ return stdout if process.success?
138
140
 
139
141
  raise SharedHelpers::HelperSubprocessFailed.new(
140
142
  message: stdout,
@@ -144,6 +146,11 @@ module Dependabot
144
146
  process_exit_value: process.to_s
145
147
  }
146
148
  )
149
+ end
150
+
151
+ def run_pip_compile_command(command)
152
+ local_command = "pyenv local #{python_version} && " + command
153
+ run_command(local_command)
147
154
  rescue SharedHelpers::HelperSubprocessFailed => error
148
155
  original_error ||= error
149
156
  msg = error.message
@@ -154,14 +161,15 @@ module Dependabot
154
161
  end
155
162
 
156
163
  raise relevant_error unless error_suggests_bad_python_version?(msg)
157
- raise relevant_error if File.exist?(".python-version")
164
+ raise relevant_error if user_specified_python_version
165
+ raise relevant_error if python_version == "2.7.15"
158
166
 
159
- command = "pyenv local 2.7.15 && " + command
167
+ @python_version = "2.7.15"
160
168
  retry
161
169
  ensure
170
+ @python_version = nil
162
171
  FileUtils.remove_entry(".python-version", true)
163
172
  end
164
- # rubocop:enable Metrics/MethodLength
165
173
 
166
174
  def python_env
167
175
  env = {}
@@ -186,13 +194,14 @@ module Dependabot
186
194
 
187
195
  def write_updated_dependency_files
188
196
  dependency_files.each do |file|
189
- next if file.name == ".python-version"
190
-
191
197
  path = file.name
192
198
  FileUtils.mkdir_p(Pathname.new(path).dirname)
193
199
  File.write(path, freeze_dependency_requirement(file))
194
200
  end
195
201
 
202
+ # Overwrite the .python-version with updated content
203
+ File.write(".python-version", python_version) if python_version
204
+
196
205
  setup_files.each do |file|
197
206
  path = file.name
198
207
  FileUtils.mkdir_p(Pathname.new(path).dirname)
@@ -206,6 +215,15 @@ module Dependabot
206
215
  end
207
216
  end
208
217
 
218
+ def install_required_python
219
+ if python_version &&
220
+ !run_command("pyenv versions").include?(python_version)
221
+ run_command("pyenv install -s")
222
+ run_command("pyenv exec pip install -r " + \
223
+ NativeHelpers.python_requirements_path)
224
+ end
225
+ end
226
+
209
227
  def sanitized_setup_file_content(file)
210
228
  @sanitized_setup_file_content ||= {}
211
229
  if @sanitized_setup_file_content[file.name]
@@ -475,6 +493,22 @@ module Dependabot
475
493
  end
476
494
  end
477
495
 
496
+ def python_version
497
+ # TODO: Add better Python version detection using dependency versions
498
+ # (e.g., Django 2.x implies Python 3)
499
+ @python_version ||=
500
+ user_specified_python_version ||
501
+ PythonVersions::PRE_INSTALLED_PYTHON_VERSIONS.first
502
+ end
503
+
504
+ def user_specified_python_version
505
+ python_version_file&.content&.strip
506
+ end
507
+
508
+ def pre_installed_python?(version)
509
+ PythonVersions::PRE_INSTALLED_PYTHON_VERSIONS.include?(version)
510
+ end
511
+
478
512
  def setup_files
479
513
  dependency_files.select { |f| f.name.end_with?("setup.py") }
480
514
  end
@@ -486,6 +520,10 @@ module Dependabot
486
520
  def setup_cfg_files
487
521
  dependency_files.select { |f| f.name.end_with?("setup.cfg") }
488
522
  end
523
+
524
+ def python_version_file
525
+ dependency_files.find { |f| f.name == ".python-version" }
526
+ end
489
527
  end
490
528
  end
491
529
  end
@@ -10,6 +10,7 @@ require "dependabot/python/file_updater/setup_file_sanitizer"
10
10
  require "dependabot/python/version"
11
11
  require "dependabot/shared_helpers"
12
12
  require "dependabot/python/native_helpers"
13
+ require "dependabot/python/python_versions"
13
14
 
14
15
  # rubocop:disable Metrics/ClassLength
15
16
  module Dependabot
@@ -52,16 +53,18 @@ module Dependabot
52
53
  SharedHelpers.in_a_temporary_directory do
53
54
  SharedHelpers.with_git_configured(credentials: credentials) do
54
55
  write_temporary_dependency_files
56
+ install_required_python
55
57
 
56
58
  filenames_to_compile.each do |filename|
57
59
  # Shell out to pip-compile.
58
60
  # This is slow, as pip-compile needs to do installs.
59
- cmd = "pyenv exec pip-compile --allow-unsafe "\
60
- "-P #{dependency.name} #{filename}"
61
- run_command(cmd)
61
+ run_pip_compile_command(
62
+ "pyenv exec pip-compile --allow-unsafe "\
63
+ "-P #{dependency.name} #{filename}"
64
+ )
62
65
  # Run pip-compile a second time, without an update argument,
63
66
  # to ensure it handles markers correctly
64
- run_command(
67
+ run_pip_compile_command(
65
68
  "pyenv exec pip-compile --allow-unsafe #{filename}"
66
69
  )
67
70
  end
@@ -139,7 +142,6 @@ module Dependabot
139
142
  end
140
143
  end
141
144
 
142
- # rubocop:disable Metrics/MethodLength
143
145
  def run_command(command)
144
146
  command = command.dup
145
147
  env_cmd = [python_env, command].compact
@@ -147,9 +149,7 @@ module Dependabot
147
149
  stdout, process = Open3.capture2e(*env_cmd)
148
150
  time_taken = Time.now - start
149
151
 
150
- # Raise an error with the output from the shell session if
151
- # pip-compile returns a non-zero status
152
- return if process.success?
152
+ return stdout if process.success?
153
153
 
154
154
  raise SharedHelpers::HelperSubprocessFailed.new(
155
155
  message: stdout,
@@ -159,6 +159,11 @@ module Dependabot
159
159
  process_exit_value: process.to_s
160
160
  }
161
161
  )
162
+ end
163
+
164
+ def run_pip_compile_command(command)
165
+ local_command = "pyenv local #{python_version} && " + command
166
+ run_command(local_command)
162
167
  rescue SharedHelpers::HelperSubprocessFailed => error
163
168
  original_error ||= error
164
169
  msg = error.message
@@ -169,14 +174,15 @@ module Dependabot
169
174
  end
170
175
 
171
176
  raise relevant_error unless error_suggests_bad_python_version?(msg)
172
- raise relevant_error if File.exist?(".python-version")
177
+ raise relevant_error if user_specified_python_version
178
+ raise relevant_error if python_version == "2.7.15"
173
179
 
174
- command = "pyenv local 2.7.15 && " + command
180
+ @python_version = "2.7.15"
175
181
  retry
176
182
  ensure
183
+ @python_version = nil
177
184
  FileUtils.remove_entry(".python-version", true)
178
185
  end
179
- # rubocop:enable Metrics/MethodLength
180
186
 
181
187
  def python_env
182
188
  env = {}
@@ -202,8 +208,6 @@ module Dependabot
202
208
 
203
209
  def write_temporary_dependency_files(unlock_requirement: true)
204
210
  dependency_files.each do |file|
205
- next if file.name == ".python-version"
206
-
207
211
  path = file.name
208
212
  FileUtils.mkdir_p(Pathname.new(path).dirname)
209
213
  File.write(
@@ -212,6 +216,9 @@ module Dependabot
212
216
  )
213
217
  end
214
218
 
219
+ # Overwrite the .python-version with updated content
220
+ File.write(".python-version", python_version) if python_version
221
+
215
222
  setup_files.each do |file|
216
223
  path = file.name
217
224
  FileUtils.mkdir_p(Pathname.new(path).dirname)
@@ -225,6 +232,15 @@ module Dependabot
225
232
  end
226
233
  end
227
234
 
235
+ def install_required_python
236
+ if python_version &&
237
+ !run_command("pyenv versions").include?(python_version)
238
+ run_command("pyenv install -s")
239
+ run_command("pyenv exec pip install -r " + \
240
+ NativeHelpers.python_requirements_path)
241
+ end
242
+ end
243
+
228
244
  def sanitized_setup_file_content(file)
229
245
  @sanitized_setup_file_content ||= {}
230
246
  if @sanitized_setup_file_content[file.name]
@@ -384,6 +400,22 @@ module Dependabot
384
400
  ).parse.find { |d| d.name == dependency.name }&.version
385
401
  end
386
402
 
403
+ def python_version
404
+ # TODO: Add better Python version detection using dependency versions
405
+ # (e.g., Django 2.x implies Python 3)
406
+ @python_version ||=
407
+ user_specified_python_version ||
408
+ PythonVersions::PRE_INSTALLED_PYTHON_VERSIONS.first
409
+ end
410
+
411
+ def user_specified_python_version
412
+ python_version_file&.content&.strip
413
+ end
414
+
415
+ def pre_installed_python?(version)
416
+ PythonVersions::PRE_INSTALLED_PYTHON_VERSIONS.include?(version)
417
+ end
418
+
387
419
  def setup_files
388
420
  dependency_files.select { |f| f.name.end_with?("setup.py") }
389
421
  end
@@ -395,6 +427,10 @@ module Dependabot
395
427
  def setup_cfg_files
396
428
  dependency_files.select { |f| f.name.end_with?("setup.cfg") }
397
429
  end
430
+
431
+ def python_version_file
432
+ dependency_files.find { |f| f.name == ".python-version" }
433
+ end
398
434
  end
399
435
  end
400
436
  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.95.54
4
+ version: 0.95.55
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
11
+ date: 2019-02-22 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.95.54
19
+ version: 0.95.55
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.95.54
26
+ version: 0.95.55
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement