dependabot-core 0.89.2 → 0.89.3

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: 5067da1c08eb196edb308387633bc2394063d8b4c4d0a7dc64b0e06b4b53ae27
4
- data.tar.gz: 3edaf8e1eddc3239a639a13cce6d9b31ba205055471f16b343fb91b7bb265e56
3
+ metadata.gz: 68b24cb423c178ba9f593779aba15d90eb2c63608a4533526afd1715a62fdac3
4
+ data.tar.gz: dfdc7b94a470329a808c01ea05e0412238c4596d16e22b540ea0e900e0847a62
5
5
  SHA512:
6
- metadata.gz: 2d804a781035f5ff2b18c931f416c93b6e659d08a8b8ea1ac89314eda547b441390b2e9cbbd0096728367895f0f2298d48e466899f9bc275a7e8debf7ea4963b
7
- data.tar.gz: 519c0ae88a184565045813998393d95a9e6da3212be98d76f42c03d3290be1275d9c45b2592c904a9bc5e55dc8810853d319c0b628af87ecf8579650ea38a842
6
+ metadata.gz: 9cc690016b52d4f1586c894f5e57e51184c5c7c1c09ff8968079caec11ca9f647850642418885c95e5ada945ac692e2eaf0ef28727160bb752006076072ccc67
7
+ data.tar.gz: 28de24c17cc0f5c66c02b2130a389e8426a1450d1842b1edb4e17832169442813f38975c17115221eaa42abd567df3579e6b9ab4f40cf1d76d6d277e02aace14
@@ -1,3 +1,7 @@
1
+ ## v0.89.3, 12 January 2019
2
+
3
+ - Ruby: Handle fetching gemspecs which specify a path
4
+
1
5
  ## v0.89.2, 11 January 2019
2
6
 
3
7
  - Require composer from omnibus
@@ -8,6 +8,7 @@ module Dependabot
8
8
  module FileFetchers
9
9
  module Ruby
10
10
  class Bundler < Dependabot::FileFetchers::Base
11
+ require "dependabot/file_fetchers/ruby/bundler/gemspec_finder"
11
12
  require "dependabot/file_fetchers/ruby/bundler/path_gemspec_finder"
12
13
  require "dependabot/file_fetchers/ruby/bundler/child_gemfile_finder"
13
14
  require "dependabot/file_fetchers/ruby/bundler/require_relative_finder"
@@ -30,19 +31,27 @@ module Dependabot
30
31
  fetched_files = []
31
32
  fetched_files << gemfile if gemfile
32
33
  fetched_files << lockfile if gemfile && lockfile
34
+ fetched_files += child_gemfiles
33
35
  fetched_files += gemspecs
34
36
  fetched_files << ruby_version_file if ruby_version_file
35
- fetched_files += child_gemfiles
36
37
  fetched_files += path_gemspecs
37
38
  fetched_files += require_relative_files(fetched_files)
38
39
 
40
+ fetched_files = uniq_files(fetched_files)
41
+
39
42
  check_required_files_present
40
43
 
41
44
  unless self.class.required_files_in?(fetched_files.map(&:name))
42
45
  raise "Invalid set of files: #{fetched_files.map(&:name)}"
43
46
  end
44
47
 
45
- fetched_files.uniq
48
+ fetched_files
49
+ end
50
+
51
+ def uniq_files(fetched_files)
52
+ uniq_files = fetched_files.reject(&:support_file?).uniq
53
+ uniq_files += fetched_files.
54
+ reject { |f| uniq_files.map(&:name).include?(f.name) }
46
55
  end
47
56
 
48
57
  def check_required_files_present
@@ -64,12 +73,31 @@ module Dependabot
64
73
  end
65
74
 
66
75
  def gemspecs
67
- gemspecs = repo_contents.select { |f| f.name.end_with?(".gemspec") }
68
- @gemspecs ||= gemspecs.map { |gs| fetch_file_from_host(gs.name) }
76
+ return @gemspecs if defined?(@gemspecs)
77
+
78
+ gemspecs_paths =
79
+ gemspec_directories.
80
+ flat_map do |d|
81
+ repo_contents(dir: d).
82
+ select { |f| f.name.end_with?(".gemspec") }.
83
+ map { |f| File.join(d, f.name) }
84
+ end
85
+
86
+ @gemspecs = gemspecs_paths.map { |n| fetch_file_from_host(n) }
69
87
  rescue Octokit::NotFound
70
88
  []
71
89
  end
72
90
 
91
+ def gemspec_directories
92
+ gemfiles = ([gemfile] + child_gemfiles).compact
93
+ directories =
94
+ gemfiles.flat_map do |file|
95
+ GemspecFinder.new(gemfile: file).gemspec_directories
96
+ end.uniq
97
+
98
+ directories.empty? ? ["."] : directories
99
+ end
100
+
73
101
  def ruby_version_file
74
102
  return unless gemfile
75
103
  return unless gemfile.content.include?(".ruby-version")
@@ -83,7 +111,7 @@ module Dependabot
83
111
  gemspec_files = []
84
112
  unfetchable_gems = []
85
113
 
86
- gemspec_paths.each do |path|
114
+ path_gemspec_paths.each do |path|
87
115
  # Get any gemspecs at the path itself
88
116
  gemspecs_at_path = fetch_gemspecs_from_directory(path)
89
117
 
@@ -112,8 +140,8 @@ module Dependabot
112
140
  gemspec_files.tap { |ar| ar.each { |f| f.support_file = true } }
113
141
  end
114
142
 
115
- def gemspec_paths
116
- fetch_gemspec_paths.map { |path| Pathname.new(path) }
143
+ def path_gemspec_paths
144
+ fetch_path_gemspec_paths.map { |path| Pathname.new(path) }
117
145
  end
118
146
 
119
147
  def require_relative_files(files)
@@ -136,7 +164,7 @@ module Dependabot
136
164
  map { |fp| fetch_file_from_host(fp) }
137
165
  end
138
166
 
139
- def fetch_gemspec_paths
167
+ def fetch_path_gemspec_paths
140
168
  if lockfile
141
169
  parsed_lockfile = ::Bundler::LockfileParser.new(
142
170
  sanitized_lockfile_content
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "parser/current"
5
+ require "dependabot/file_fetchers/ruby/bundler"
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module FileFetchers
10
+ module Ruby
11
+ class Bundler
12
+ # Finds the directories of any gemspecs declared using `gemspec` in the
13
+ # passed Gemfile.
14
+ class GemspecFinder
15
+ def initialize(gemfile:)
16
+ @gemfile = gemfile
17
+ end
18
+
19
+ def gemspec_directories
20
+ ast = Parser::CurrentRuby.parse(gemfile.content)
21
+ find_gemspec_paths(ast)
22
+ rescue Parser::SyntaxError
23
+ raise Dependabot::DependencyFileNotParseable, gemfile.path
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :gemfile
29
+
30
+ # rubocop:disable Security/Eval
31
+ def find_gemspec_paths(node)
32
+ return [] unless node.is_a?(Parser::AST::Node)
33
+
34
+ if declares_gemspec_dependency?(node)
35
+ path_node = path_node_for_gem_declaration(node)
36
+ return [clean_path(".")] unless path_node
37
+
38
+ begin
39
+ # We use eval here, but we know what we're doing. The
40
+ # FileFetchers helper method should only ever be run in an
41
+ # isolated environment
42
+ path = eval(path_node.loc.expression.source)
43
+ rescue StandardError
44
+ return []
45
+ end
46
+ return [clean_path(path)]
47
+ end
48
+
49
+ node.children.flat_map do |child_node|
50
+ find_gemspec_paths(child_node)
51
+ end
52
+ end
53
+ # rubocop:enable Security/Eval
54
+
55
+ def current_dir
56
+ @current_dir ||= gemfile.name.rpartition("/").first
57
+ @current_dir = nil if @current_dir == ""
58
+ @current_dir
59
+ end
60
+
61
+ def declares_gemspec_dependency?(node)
62
+ return false unless node.is_a?(Parser::AST::Node)
63
+
64
+ node.children[1] == :gemspec
65
+ end
66
+
67
+ def clean_path(path)
68
+ if Pathname.new(path).absolute?
69
+ base_path = Pathname.new(File.expand_path(Dir.pwd))
70
+ path = Pathname.new(path).relative_path_from(base_path).to_s
71
+ end
72
+ path = File.join(current_dir, path) unless current_dir.nil?
73
+ Pathname.new(path).cleanpath
74
+ end
75
+
76
+ def path_node_for_gem_declaration(node)
77
+ return unless node.children.last.is_a?(Parser::AST::Node)
78
+ return unless node.children.last.type == :hash
79
+
80
+ kwargs_node = node.children.last
81
+
82
+ path_hash_pair =
83
+ kwargs_node.children.
84
+ find { |hash_pair| key_from_hash_pair(hash_pair) == :path }
85
+
86
+ return unless path_hash_pair
87
+
88
+ path_hash_pair.children.last
89
+ end
90
+
91
+ def key_from_hash_pair(node)
92
+ node.children.first.children.first.to_sym
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -137,8 +137,7 @@ module Dependabot
137
137
  @parsed_gemspecs ||= {}
138
138
  @parsed_gemspecs[file.name] ||=
139
139
  SharedHelpers.in_a_temporary_directory do
140
- File.write(file.name, file.content)
141
- imported_ruby_files.each do |f|
140
+ [file, *imported_ruby_files].each do |f|
142
141
  path = f.name
143
142
  FileUtils.mkdir_p(Pathname.new(path).dirname)
144
143
  File.write(path, f.content)
@@ -278,10 +277,10 @@ module Dependabot
278
277
  end
279
278
 
280
279
  def gemspecs
281
- # The gemspecs for this project will be at the top level
282
- @gemspecs ||= prepared_dependency_files.select do |file|
283
- file.name.match?(%r{^[^/]*\.gemspec$})
284
- end
280
+ # Path gemspecs are excluded (they're supporting files)
281
+ @gemspecs ||= prepared_dependency_files.
282
+ select { |file| file.name.end_with?(".gemspec") }.
283
+ reject(&:support_file?)
285
284
  end
286
285
 
287
286
  def imported_ruby_files
@@ -20,7 +20,8 @@ module Dependabot
20
20
  files << DependencyFile.new(
21
21
  name: file.name,
22
22
  content: sanitize_gemspec_content(file.content),
23
- directory: file.directory
23
+ directory: file.directory,
24
+ support_file: file.support_file?
24
25
  )
25
26
  end
26
27
 
@@ -16,7 +16,7 @@ module Dependabot
16
16
  /^Gemfile\.lock$/,
17
17
  /^gems\.rb$/,
18
18
  /^gems\.locked$/,
19
- %r{^[^/]*\.gemspec$}
19
+ /^*\.gemspec$/
20
20
  ]
21
21
  end
22
22
 
@@ -113,7 +113,9 @@ module Dependabot
113
113
  end
114
114
 
115
115
  def top_level_gemspecs
116
- dependency_files.select { |f| f.name.match?(%r{^[^/]*\.gemspec$}) }
116
+ dependency_files.
117
+ select { |file| file.name.end_with?(".gemspec") }.
118
+ reject(&:support_file?)
117
119
  end
118
120
  end
119
121
  end
@@ -94,10 +94,10 @@ module Dependabot
94
94
  File.write(lockfile.name, sanitized_lockfile_body)
95
95
 
96
96
  top_level_gemspecs.each do |gemspec|
97
- File.write(
98
- gemspec.name,
99
- sanitized_gemspec_content(updated_gemspec_content(gemspec))
100
- )
97
+ path = gemspec.name
98
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
99
+ updated_content = updated_gemspec_content(gemspec)
100
+ File.write(path, sanitized_gemspec_content(updated_content))
101
101
  end
102
102
 
103
103
  write_ruby_version_file
@@ -248,7 +248,9 @@ module Dependabot
248
248
  end
249
249
 
250
250
  def top_level_gemspecs
251
- dependency_files.select { |f| f.name.match?(%r{^[^/]*\.gemspec$}) }
251
+ dependency_files.
252
+ select { |file| file.name.end_with?(".gemspec") }.
253
+ reject(&:support_file?)
252
254
  end
253
255
 
254
256
  def ruby_version_file
@@ -136,9 +136,7 @@ module Dependabot
136
136
  end
137
137
 
138
138
  def library?
139
- if files.map(&:name).any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
140
- return true
141
- end
139
+ return true if files.any? { |file| file.name.end_with?(".gemspec") }
142
140
 
143
141
  dependencies.none?(&:appears_in_lockfile?)
144
142
  end
@@ -155,7 +155,7 @@ module Dependabot
155
155
  end
156
156
 
157
157
  def library?
158
- if files.map(&:name).any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
158
+ if files.map(&:name).any? { |name| name.end_with?(".gemspec") }
159
159
  return true
160
160
  end
161
161
 
@@ -708,8 +708,7 @@ module Dependabot
708
708
  end
709
709
 
710
710
  def library?
711
- filenames = files.map(&:name)
712
- return true if filenames.any? { |nm| nm.match?(%r{^[^/]*\.gemspec$}) }
711
+ return true if files.map(&:name).any? { |nm| nm.end_with?(".gemspec") }
713
712
 
714
713
  dependencies.none?(&:appears_in_lockfile?)
715
714
  end
@@ -76,7 +76,8 @@ module Dependabot
76
76
  files << DependencyFile.new(
77
77
  name: file.name,
78
78
  content: sanitize_gemspec_content(file.content),
79
- directory: file.directory
79
+ directory: file.directory,
80
+ support_file: file.support_file?
80
81
  )
81
82
  end
82
83
 
@@ -132,7 +133,9 @@ module Dependabot
132
133
  end
133
134
 
134
135
  def top_level_gemspecs
135
- dependency_files.select { |f| f.name.match?(%r{^[^/]*\.gemspec$}) }
136
+ dependency_files.
137
+ select { |f| f.name.end_with?(".gemspec") }.
138
+ reject(&:support_file?)
136
139
  end
137
140
 
138
141
  def ruby_version_file
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.89.2"
4
+ VERSION = "0.89.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.89.2
4
+ version: 0.89.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-11 00:00:00.000000000 Z
11
+ date: 2019-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-ecr
@@ -359,6 +359,7 @@ files:
359
359
  - lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb
360
360
  - lib/dependabot/file_fetchers/ruby/bundler.rb
361
361
  - lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb
362
+ - lib/dependabot/file_fetchers/ruby/bundler/gemspec_finder.rb
362
363
  - lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb
363
364
  - lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb
364
365
  - lib/dependabot/file_parsers.rb