dependabot-core 0.89.2 → 0.89.3

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