bundler 1.11.2 → 1.12.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +24 -0
  3. data/.gitignore +2 -2
  4. data/.rubocop.yml +17 -2
  5. data/.rubocop_todo.yml +145 -18
  6. data/.travis.yml +9 -2
  7. data/CHANGELOG.md +42 -0
  8. data/Rakefile +20 -13
  9. data/bin/rake +5 -0
  10. data/bin/rspec +5 -0
  11. data/bin/rubocop +7 -1
  12. data/bundler.gemspec +2 -1
  13. data/exe/bundle +10 -2
  14. data/exe/bundle_ruby +2 -1
  15. data/exe/bundler +3 -1
  16. data/lib/bundler.rb +54 -51
  17. data/lib/bundler/capistrano.rb +1 -0
  18. data/lib/bundler/cli.rb +26 -4
  19. data/lib/bundler/cli/binstubs.rb +1 -0
  20. data/lib/bundler/cli/cache.rb +1 -0
  21. data/lib/bundler/cli/check.rb +4 -1
  22. data/lib/bundler/cli/clean.rb +1 -0
  23. data/lib/bundler/cli/common.rb +1 -0
  24. data/lib/bundler/cli/config.rb +5 -5
  25. data/lib/bundler/cli/console.rb +1 -0
  26. data/lib/bundler/cli/exec.rb +4 -9
  27. data/lib/bundler/cli/gem.rb +12 -9
  28. data/lib/bundler/cli/init.rb +1 -0
  29. data/lib/bundler/cli/inject.rb +1 -0
  30. data/lib/bundler/cli/install.rb +8 -5
  31. data/lib/bundler/cli/lock.rb +2 -0
  32. data/lib/bundler/cli/open.rb +1 -0
  33. data/lib/bundler/cli/outdated.rb +36 -9
  34. data/lib/bundler/cli/package.rb +1 -0
  35. data/lib/bundler/cli/platform.rb +4 -1
  36. data/lib/bundler/cli/show.rb +1 -0
  37. data/lib/bundler/cli/update.rb +6 -6
  38. data/lib/bundler/cli/viz.rb +4 -6
  39. data/lib/bundler/constants.rb +1 -0
  40. data/lib/bundler/current_ruby.rb +34 -168
  41. data/lib/bundler/definition.rb +41 -15
  42. data/lib/bundler/dep_proxy.rb +1 -0
  43. data/lib/bundler/dependency.rb +10 -0
  44. data/lib/bundler/deployment.rb +1 -0
  45. data/lib/bundler/deprecate.rb +1 -0
  46. data/lib/bundler/dsl.rb +19 -9
  47. data/lib/bundler/endpoint_specification.rb +37 -8
  48. data/lib/bundler/env.rb +4 -3
  49. data/lib/bundler/environment.rb +1 -0
  50. data/lib/bundler/errors.rb +51 -32
  51. data/lib/bundler/fetcher.rb +44 -30
  52. data/lib/bundler/fetcher/base.rb +3 -2
  53. data/lib/bundler/fetcher/compact_index.rb +98 -0
  54. data/lib/bundler/fetcher/dependency.rb +36 -36
  55. data/lib/bundler/fetcher/downloader.rb +14 -8
  56. data/lib/bundler/fetcher/index.rb +28 -5
  57. data/lib/bundler/friendly_errors.rb +93 -85
  58. data/lib/bundler/gem_helper.rb +20 -21
  59. data/lib/bundler/gem_helpers.rb +9 -2
  60. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  61. data/lib/bundler/gem_tasks.rb +1 -0
  62. data/lib/bundler/graph.rb +16 -17
  63. data/lib/bundler/index.rb +4 -6
  64. data/lib/bundler/injector.rb +1 -0
  65. data/lib/bundler/inline.rb +8 -2
  66. data/lib/bundler/installer.rb +4 -4
  67. data/lib/bundler/installer/gem_installer.rb +1 -0
  68. data/lib/bundler/installer/parallel_installer.rb +3 -2
  69. data/lib/bundler/installer/standalone.rb +5 -1
  70. data/lib/bundler/lazy_specification.rb +5 -2
  71. data/lib/bundler/lockfile_parser.rb +22 -15
  72. data/lib/bundler/match_platform.rb +1 -0
  73. data/lib/bundler/mirror.rb +218 -0
  74. data/lib/bundler/path_preserver.rb +12 -0
  75. data/lib/bundler/psyched_yaml.rb +1 -0
  76. data/lib/bundler/remote_specification.rb +4 -1
  77. data/lib/bundler/resolver.rb +17 -16
  78. data/lib/bundler/retry.rb +1 -0
  79. data/lib/bundler/ruby_dsl.rb +8 -2
  80. data/lib/bundler/ruby_version.rb +58 -61
  81. data/lib/bundler/rubygems_ext.rb +4 -3
  82. data/lib/bundler/rubygems_gem_installer.rb +1 -0
  83. data/lib/bundler/rubygems_integration.rb +9 -14
  84. data/lib/bundler/runtime.rb +17 -22
  85. data/lib/bundler/settings.rb +17 -21
  86. data/lib/bundler/setup.rb +1 -0
  87. data/lib/bundler/shared_helpers.rb +47 -17
  88. data/lib/bundler/similarity_detector.rb +1 -0
  89. data/lib/bundler/source.rb +2 -1
  90. data/lib/bundler/source/git.rb +2 -1
  91. data/lib/bundler/source/git/git_proxy.rb +33 -7
  92. data/lib/bundler/source/path.rb +17 -10
  93. data/lib/bundler/source/path/installer.rb +1 -0
  94. data/lib/bundler/source/rubygems.rb +4 -3
  95. data/lib/bundler/source/rubygems/remote.rb +16 -0
  96. data/lib/bundler/source_list.rb +1 -0
  97. data/lib/bundler/spec_set.rb +1 -0
  98. data/lib/bundler/ssl_certs/certificate_manager.rb +1 -0
  99. data/lib/bundler/stub_specification.rb +1 -0
  100. data/lib/bundler/templates/Executable +1 -0
  101. data/lib/bundler/templates/Gemfile +1 -0
  102. data/lib/bundler/templates/newgem/.travis.yml.tt +1 -0
  103. data/lib/bundler/templates/newgem/newgem.gemspec.tt +2 -2
  104. data/lib/bundler/ui.rb +1 -0
  105. data/lib/bundler/ui/rg_proxy.rb +1 -0
  106. data/lib/bundler/ui/shell.rb +2 -1
  107. data/lib/bundler/ui/silent.rb +1 -0
  108. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +78 -0
  109. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +97 -0
  110. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +55 -0
  111. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +3 -0
  112. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +4 -0
  113. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +13 -0
  114. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +5 -0
  115. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  116. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +2 -1
  117. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +37 -14
  118. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -1
  119. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +7 -7
  120. data/lib/bundler/vendored_molinillo.rb +1 -0
  121. data/lib/bundler/vendored_persistent.rb +1 -0
  122. data/lib/bundler/vendored_thor.rb +1 -0
  123. data/lib/bundler/version.rb +6 -1
  124. data/lib/bundler/vlad.rb +1 -0
  125. data/lib/bundler/worker.rb +12 -2
  126. data/man/bundle-config.ronn +6 -0
  127. data/man/bundle-gem.ronn +5 -5
  128. metadata +14 -6
  129. data/lib/bundler/gem_path_manipulation.rb +0 -8
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "bundler/fetcher/base"
2
3
  require "rubygems/remote_fetcher"
3
4
 
@@ -13,16 +14,38 @@ module Bundler
13
14
  when /401/
14
15
  raise AuthenticationRequiredError, remote_uri
15
16
  when /403/
16
- if remote_uri.userinfo
17
- raise BadAuthenticationError, remote_uri
18
- else
19
- raise AuthenticationRequiredError, remote_uri
20
- end
17
+ raise BadAuthenticationError, remote_uri if remote_uri.userinfo
18
+ raise AuthenticationRequiredError, remote_uri
21
19
  else
22
20
  Bundler.ui.trace e
23
21
  raise HTTPError, "Could not fetch specs from #{display_uri}"
24
22
  end
25
23
  end
24
+
25
+ def fetch_spec(spec)
26
+ spec -= [nil, "ruby", ""]
27
+ spec_file_name = "#{spec.join "-"}.gemspec"
28
+
29
+ uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
30
+ if uri.scheme == "file"
31
+ Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path))
32
+ elsif cached_spec_path = gemspec_cached_path(spec_file_name)
33
+ Bundler.load_gemspec(cached_spec_path)
34
+ else
35
+ Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body)
36
+ end
37
+ rescue MarshalError
38
+ raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
39
+ "Your network or your gem server is probably having issues right now."
40
+ end
41
+
42
+ private
43
+
44
+ # cached gem specification path, if one exists
45
+ def gemspec_cached_path(spec_file_name)
46
+ paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) }
47
+ paths.find {|path| File.file? path }
48
+ end
26
49
  end
27
50
  end
28
51
  end
@@ -1,95 +1,103 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require "cgi"
3
4
  require "bundler/vendored_thor"
4
5
 
5
6
  module Bundler
7
+ module FriendlyErrors
8
+ module_function
9
+
10
+ def log_error(error)
11
+ case error
12
+ when YamlSyntaxError
13
+ Bundler.ui.error error.message
14
+ Bundler.ui.trace error.orig_exception
15
+ when Dsl::DSLError
16
+ Bundler.ui.error error.message
17
+ when GemRequireError
18
+ Bundler.ui.error error.message
19
+ Bundler.ui.trace error.orig_exception, nil, true
20
+ when BundlerError
21
+ Bundler.ui.error error.message, :wrap => true
22
+ Bundler.ui.trace error
23
+ when Thor::Error
24
+ Bundler.ui.error error.message
25
+ when LoadError
26
+ raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
27
+ Bundler.ui.error "\nCould not load OpenSSL."
28
+ Bundler.ui.warn <<-WARN, :wrap => true
29
+ You must recompile Ruby with OpenSSL support or change the sources in your \
30
+ Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
31
+ using RVM are available at http://rvm.io/packages/openssl.
32
+ WARN
33
+ Bundler.ui.trace error
34
+ when Interrupt
35
+ Bundler.ui.error "\nQuitting..."
36
+ Bundler.ui.trace error
37
+ when Gem::InvalidSpecificationException
38
+ Bundler.ui.error error.message, :wrap => true
39
+ when SystemExit
40
+ else request_issue_report_for(error)
41
+ end
42
+ end
43
+
44
+ def exit_status(error)
45
+ case error
46
+ when BundlerError then error.status_code
47
+ when Thor::Error then 15
48
+ when SystemExit then error.status
49
+ else 1
50
+ end
51
+ end
52
+
53
+ def request_issue_report_for(e)
54
+ Bundler.ui.info <<-EOS.gsub(/^ {8}/, "")
55
+ --- ERROR REPORT TEMPLATE -------------------------------------------------------
56
+ - What did you do?
57
+
58
+ I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}`
59
+
60
+ - What did you expect to happen?
61
+
62
+ I expected Bundler to...
63
+
64
+ - What happened instead?
65
+
66
+ Instead, what actually happened was...
67
+
68
+
69
+ Error details
70
+
71
+ #{e.class}: #{e.message}
72
+ #{e.backtrace.join("\n ")}
73
+
74
+ #{Bundler::Env.new.report(:print_gemfile => false, :print_gemspecs => false).gsub(/\n/, "\n ").strip}
75
+ --- TEMPLATE END ----------------------------------------------------------------
76
+
77
+ EOS
78
+
79
+ Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."
80
+
81
+ Bundler.ui.warn <<-EOS.gsub(/^ {8}/, "")
82
+
83
+ First, try this link to see if there are any existing issue reports for this error:
84
+ #{issues_url(e)}
85
+
86
+ If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
87
+ https://github.com/bundler/bundler/issues/new
88
+ EOS
89
+ end
90
+
91
+ def issues_url(exception)
92
+ "https://github.com/bundler/bundler/search?q=" \
93
+ "#{CGI.escape(exception.message.lines.first.chomp)}&type=Issues"
94
+ end
95
+ end
96
+
6
97
  def self.with_friendly_errors
7
98
  yield
8
- rescue Bundler::YamlSyntaxError => e
9
- Bundler.ui.error e.message
10
- Bundler.ui.trace e.orig_exception
11
- exit e.status_code
12
- rescue Bundler::Dsl::DSLError => e
13
- Bundler.ui.error e.message
14
- exit e.status_code
15
- rescue Bundler::GemRequireError => e
16
- Bundler.ui.error e.message
17
- Bundler.ui.trace e.orig_exception, nil, true
18
- exit e.status_code
19
- rescue Bundler::BundlerError => e
20
- Bundler.ui.error e.message, :wrap => true
21
- Bundler.ui.trace e
22
- exit e.status_code
23
- rescue Thor::AmbiguousTaskError => e
24
- Bundler.ui.error e.message
25
- exit 15
26
- rescue Thor::UndefinedTaskError => e
27
- Bundler.ui.error e.message
28
- exit 15
29
- rescue Thor::Error => e
30
- Bundler.ui.error e.message
31
- exit 1
32
- rescue LoadError => e
33
- raise e unless e.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
34
- Bundler.ui.error "\nCould not load OpenSSL."
35
- Bundler.ui.warn <<-WARN, :wrap => true
36
- You must recompile Ruby with OpenSSL support or change the sources in your \
37
- Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
38
- using RVM are available at http://rvm.io/packages/openssl.
39
- WARN
40
- Bundler.ui.trace e
41
- exit 1
42
- rescue Interrupt => e
43
- Bundler.ui.error "\nQuitting..."
44
- Bundler.ui.trace e
45
- exit 1
46
- rescue SystemExit => e
47
- exit e.status
48
99
  rescue Exception => e
49
- request_issue_report_for(e)
50
- exit 1
51
- end
52
-
53
- def self.request_issue_report_for(e)
54
- Bundler.ui.info <<-EOS.gsub(/^ {6}/, "")
55
- --- ERROR REPORT TEMPLATE -------------------------------------------------------
56
- - What did you do?
57
-
58
- I ran the command `#{$PROGRAM_NAME} #{ARGV.join(" ")}`
59
-
60
- - What did you expect to happen?
61
-
62
- I expected Bundler to...
63
-
64
- - What happened instead?
65
-
66
- Instead, what actually happened was...
67
-
68
-
69
- Error details
70
-
71
- #{e.class}: #{e.message}
72
- #{e.backtrace.join("\n ")}
73
-
74
- #{Bundler::Env.new.report(:print_gemfile => false, :print_gemspecs => false).gsub(/\n/, "\n ").strip}
75
- --- TEMPLATE END ----------------------------------------------------------------
76
-
77
- EOS
78
-
79
- Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."
80
-
81
- Bundler.ui.warn <<-EOS.gsub(/^ {6}/, "")
82
-
83
- First, try this link to see if there are any existing issue reports for this error:
84
- #{issues_url(e)}
85
-
86
- If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
87
- https://github.com/bundler/bundler/issues/new
88
- EOS
89
- end
90
-
91
- def self.issues_url(exception)
92
- "https://github.com/bundler/bundler/search?q=" \
93
- "#{CGI.escape(exception.message.lines.first.chomp)}&type=Issues"
100
+ FriendlyErrors.log_error(e)
101
+ exit FriendlyErrors.exit_status(e)
94
102
  end
95
103
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "bundler/vendored_thor" unless defined?(Thor)
2
3
  require "bundler"
3
4
 
@@ -91,18 +92,17 @@ module Bundler
91
92
  protected
92
93
 
93
94
  def rubygem_push(path)
94
- if Pathname.new("~/.gem/credentials").expand_path.exist?
95
- allowed_push_host = nil
96
- gem_command = "gem push '#{path}'"
97
- if @gemspec.respond_to?(:metadata)
98
- allowed_push_host = @gemspec.metadata["allowed_push_host"]
99
- gem_command << " --host #{allowed_push_host}" if allowed_push_host
100
- end
101
- sh(gem_command)
102
- Bundler.ui.confirm "Pushed #{name} #{version} to #{allowed_push_host ? allowed_push_host : "rubygems.org."}"
103
- else
95
+ unless Pathname.new("~/.gem/credentials").expand_path.file?
104
96
  raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
105
97
  end
98
+ allowed_push_host = nil
99
+ gem_command = "gem push '#{path}'"
100
+ if @gemspec.respond_to?(:metadata)
101
+ allowed_push_host = @gemspec.metadata["allowed_push_host"]
102
+ gem_command += " --host #{allowed_push_host}" if allowed_push_host
103
+ end
104
+ sh(gem_command)
105
+ Bundler.ui.confirm "Pushed #{name} #{version} to #{allowed_push_host ? allowed_push_host : "rubygems.org."}"
106
106
  end
107
107
 
108
108
  def built_gem_path
@@ -122,10 +122,9 @@ module Bundler
122
122
  end
123
123
 
124
124
  def already_tagged?
125
- if sh("git tag").split(/\n/).include?(version_tag)
126
- Bundler.ui.confirm "Tag #{version_tag} has already been created."
127
- true
128
- end
125
+ return false unless sh("git tag").split(/\n/).include?(version_tag)
126
+ Bundler.ui.confirm "Tag #{version_tag} has already been created."
127
+ true
129
128
  end
130
129
 
131
130
  def guard_clean
@@ -164,22 +163,22 @@ module Bundler
164
163
 
165
164
  def sh(cmd, &block)
166
165
  out, code = sh_with_code(cmd, &block)
167
- if code == 0
168
- out
169
- else
166
+ unless code.zero?
170
167
  raise(out.empty? ? "Running `#{cmd}` failed. Run this command directly for more detailed output." : out)
171
168
  end
169
+ out
172
170
  end
173
171
 
174
172
  def sh_with_code(cmd, &block)
175
- cmd << " 2>&1"
176
- outbuf = ""
173
+ cmd += " 2>&1"
174
+ outbuf = String.new
177
175
  Bundler.ui.debug(cmd)
178
176
  SharedHelpers.chdir(base) do
179
177
  outbuf = `#{cmd}`
180
- block.call(outbuf) if $? == 0 && block
178
+ status = $?.exitstatus
179
+ block.call(outbuf) if status.zero? && block
180
+ [outbuf, status]
181
181
  end
182
- [outbuf, $?]
183
182
  end
184
183
 
185
184
  def gem_push?
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Bundler
2
3
  module GemHelpers
3
- GENERIC_CACHE = {}
4
+ GENERIC_CACHE = {} # rubocop:disable MutableConstant
4
5
  GENERICS = [
5
6
  [Gem::Platform.new("java"), Gem::Platform.new("java")],
6
7
  [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],
@@ -9,7 +10,7 @@ module Bundler
9
10
  [Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
10
11
  [Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
11
12
  [Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")]
12
- ]
13
+ ].freeze
13
14
 
14
15
  def generic(p)
15
16
  return p if p == Gem::Platform::RUBY
@@ -21,5 +22,11 @@ module Bundler
21
22
  found || Gem::Platform::RUBY
22
23
  end
23
24
  end
25
+ module_function :generic
26
+
27
+ def generic_local_platform
28
+ generic(Gem::Platform.local)
29
+ end
30
+ module_function :generic_local_platform
24
31
  end
25
32
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "rubygems/remote_fetcher"
2
3
 
3
4
  module Bundler
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "rake/clean"
2
3
  CLOBBER.include "pkg"
3
4
 
data/lib/bundler/graph.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "set"
2
3
  module Bundler
3
4
  class Graph
@@ -31,25 +32,23 @@ module Bundler
31
32
  def _populate_relations
32
33
  parent_dependencies = _groups.values.to_set.flatten
33
34
  loop do
34
- if parent_dependencies.empty?
35
- break
36
- else
37
- tmp = Set.new
38
- parent_dependencies.each do |dependency|
39
- # if the dependency is a prerelease, allow to_spec to be non-nil
40
- dependency.prerelease = true
41
-
42
- child_dependencies = dependency.to_spec.runtime_dependencies.to_set
43
- @relations[dependency.name] += child_dependencies.map(&:name).to_set
44
- tmp += child_dependencies
45
-
46
- @node_options[dependency.name] = _make_label(dependency, :node)
47
- child_dependencies.each do |c_dependency|
48
- @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
49
- end
35
+ break if parent_dependencies.empty?
36
+
37
+ tmp = Set.new
38
+ parent_dependencies.each do |dependency|
39
+ # if the dependency is a prerelease, allow to_spec to be non-nil
40
+ dependency.prerelease = true
41
+
42
+ child_dependencies = dependency.to_spec.runtime_dependencies.to_set
43
+ @relations[dependency.name] += child_dependencies.map(&:name).to_set
44
+ tmp += child_dependencies
45
+
46
+ @node_options[dependency.name] = _make_label(dependency, :node)
47
+ child_dependencies.each do |c_dependency|
48
+ @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
50
49
  end
51
- parent_dependencies = tmp
52
50
  end
51
+ parent_dependencies = tmp
53
52
  end
54
53
  end
55
54
 
data/lib/bundler/index.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "set"
2
3
 
3
4
  module Bundler
@@ -139,12 +140,9 @@ module Bundler
139
140
  end
140
141
 
141
142
  def add_source(index)
142
- if index.is_a?(Index)
143
- @sources << index
144
- @sources.uniq! # need to use uniq! here instead of checking for the item before adding
145
- else
146
- raise ArgumentError, "Source must be an index, not #{index.class}"
147
- end
143
+ raise ArgumentError, "Source must be an index, not #{index.class}" unless index.is_a?(Index)
144
+ @sources << index
145
+ @sources.uniq! # need to use uniq! here instead of checking for the item before adding
148
146
  end
149
147
 
150
148
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Bundler
2
3
  class Injector
3
4
  def self.inject(new_deps)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Allows for declaring a Gemfile inline in a ruby script, optionally installing
2
3
  # any gems that aren't already installed on the user's system.
3
4
  #
@@ -27,8 +28,13 @@
27
28
  #
28
29
  # puts Pod::VERSION # => "0.34.4"
29
30
  #
30
- def gemfile(install = false, &gemfile)
31
+ def gemfile(install = false, options = {}, &gemfile)
31
32
  require "bundler"
33
+
34
+ opts = options.dup
35
+ ui = opts.delete(:ui) { Bundler::UI::Shell.new }
36
+ raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
37
+
32
38
  old_root = Bundler.method(:root)
33
39
  def Bundler.root
34
40
  Bundler::SharedHelpers.pwd.expand_path
@@ -43,7 +49,7 @@ def gemfile(install = false, &gemfile)
43
49
  definition.validate_ruby!
44
50
 
45
51
  if install
46
- Bundler.ui = Bundler::UI::Shell.new
52
+ Bundler.ui = ui
47
53
  Bundler::Installer.install(Bundler.root, definition, :system => true)
48
54
  Bundler::Installer.post_install_messages.each do |name, message|
49
55
  Bundler.ui.info "Post-install message from #{name}:\n#{message}"