bundler 2.1.4 → 2.2.0.rc.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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +806 -741
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +15 -4
  7. data/lib/bundler/build_metadata.rb +2 -2
  8. data/lib/bundler/cli.rb +32 -11
  9. data/lib/bundler/cli/console.rb +1 -1
  10. data/lib/bundler/cli/gem.rb +83 -10
  11. data/lib/bundler/cli/info.rb +13 -3
  12. data/lib/bundler/cli/init.rb +1 -1
  13. data/lib/bundler/cli/install.rb +5 -14
  14. data/lib/bundler/cli/issue.rb +2 -2
  15. data/lib/bundler/cli/list.rb +11 -9
  16. data/lib/bundler/cli/outdated.rb +88 -65
  17. data/lib/bundler/cli/plugin.rb +10 -0
  18. data/lib/bundler/cli/pristine.rb +5 -0
  19. data/lib/bundler/definition.rb +32 -32
  20. data/lib/bundler/dependency.rb +0 -9
  21. data/lib/bundler/dsl.rb +1 -5
  22. data/lib/bundler/environment_preserver.rb +26 -2
  23. data/lib/bundler/errors.rb +1 -0
  24. data/lib/bundler/feature_flag.rb +0 -2
  25. data/lib/bundler/fetcher.rb +1 -0
  26. data/lib/bundler/friendly_errors.rb +4 -10
  27. data/lib/bundler/gem_helper.rb +17 -10
  28. data/lib/bundler/gem_version_promoter.rb +1 -1
  29. data/lib/bundler/injector.rb +14 -3
  30. data/lib/bundler/inline.rb +1 -1
  31. data/lib/bundler/installer.rb +29 -28
  32. data/lib/bundler/installer/gem_installer.rb +2 -2
  33. data/lib/bundler/installer/parallel_installer.rb +9 -9
  34. data/lib/bundler/lazy_specification.rb +16 -3
  35. data/lib/bundler/plugin.rb +26 -0
  36. data/lib/bundler/plugin/index.rb +9 -0
  37. data/lib/bundler/psyched_yaml.rb +0 -15
  38. data/lib/bundler/remote_specification.rb +4 -1
  39. data/lib/bundler/resolver.rb +31 -8
  40. data/lib/bundler/resolver/spec_group.rb +26 -5
  41. data/lib/bundler/rubygems_ext.rb +7 -8
  42. data/lib/bundler/rubygems_gem_installer.rb +1 -7
  43. data/lib/bundler/rubygems_integration.rb +3 -48
  44. data/lib/bundler/runtime.rb +2 -12
  45. data/lib/bundler/settings.rb +0 -3
  46. data/lib/bundler/shared_helpers.rb +1 -1
  47. data/lib/bundler/source/git.rb +4 -4
  48. data/lib/bundler/source/git/git_proxy.rb +53 -58
  49. data/lib/bundler/source/path.rb +5 -1
  50. data/lib/bundler/source/path/installer.rb +7 -9
  51. data/lib/bundler/source/rubygems.rb +11 -14
  52. data/lib/bundler/stub_specification.rb +16 -4
  53. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  54. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  55. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  56. data/lib/bundler/templates/newgem/bin/console.tt +2 -0
  57. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  58. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  59. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  60. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  61. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -0
  62. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  63. data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -4
  64. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  65. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  66. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
  67. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  68. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  69. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  70. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  71. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +75 -189
  72. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  73. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  74. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  75. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  76. data/lib/bundler/version.rb +1 -1
  77. data/man/bundle-add.1 +1 -1
  78. data/man/bundle-add.1.txt +15 -15
  79. data/man/bundle-binstubs.1 +1 -1
  80. data/man/bundle-binstubs.1.txt +10 -10
  81. data/man/bundle-cache.1 +1 -1
  82. data/man/bundle-cache.1.txt +15 -15
  83. data/man/bundle-check.1 +1 -1
  84. data/man/bundle-check.1.txt +8 -8
  85. data/man/bundle-clean.1 +1 -1
  86. data/man/bundle-clean.1.txt +6 -6
  87. data/man/bundle-config.1 +3 -9
  88. data/man/bundle-config.1.txt +271 -272
  89. data/man/bundle-config.ronn +5 -9
  90. data/man/bundle-doctor.1 +1 -1
  91. data/man/bundle-doctor.1.txt +9 -9
  92. data/man/bundle-exec.1 +1 -1
  93. data/man/bundle-exec.1.txt +84 -81
  94. data/man/bundle-gem.1 +25 -3
  95. data/man/bundle-gem.1.txt +65 -39
  96. data/man/bundle-gem.ronn +30 -7
  97. data/man/bundle-info.1 +1 -1
  98. data/man/bundle-info.1.txt +2 -2
  99. data/man/bundle-init.1 +1 -1
  100. data/man/bundle-init.1.txt +9 -9
  101. data/man/bundle-inject.1 +1 -1
  102. data/man/bundle-inject.1.txt +4 -4
  103. data/man/bundle-install.1 +1 -1
  104. data/man/bundle-install.1.txt +169 -169
  105. data/man/bundle-list.1 +7 -7
  106. data/man/bundle-list.1.txt +12 -11
  107. data/man/bundle-list.ronn +6 -6
  108. data/man/bundle-lock.1 +1 -1
  109. data/man/bundle-lock.1.txt +28 -28
  110. data/man/bundle-open.1 +1 -1
  111. data/man/bundle-open.1.txt +3 -3
  112. data/man/bundle-outdated.1 +1 -1
  113. data/man/bundle-outdated.1.txt +34 -34
  114. data/man/bundle-platform.1 +1 -1
  115. data/man/bundle-platform.1.txt +16 -16
  116. data/man/bundle-pristine.1 +1 -1
  117. data/man/bundle-pristine.1.txt +8 -8
  118. data/man/bundle-remove.1 +1 -1
  119. data/man/bundle-remove.1.txt +9 -9
  120. data/man/bundle-show.1 +1 -1
  121. data/man/bundle-show.1.txt +8 -8
  122. data/man/bundle-update.1 +1 -1
  123. data/man/bundle-update.1.txt +149 -148
  124. data/man/bundle-viz.1 +1 -1
  125. data/man/bundle-viz.1.txt +11 -11
  126. data/man/bundle.1 +1 -1
  127. data/man/bundle.1.txt +31 -31
  128. data/man/gemfile.5 +1 -1
  129. data/man/gemfile.5.txt +218 -216
  130. metadata +14 -8
@@ -1,12 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in <%= config[:name] %>.gemspec
4
6
  gemspec
5
7
 
6
- gem "rake", "~> 12.0"
8
+ gem "rake", "~> 13.0"
7
9
  <%- if config[:ext] -%>
10
+
8
11
  gem "rake-compiler"
9
12
  <%- end -%>
10
13
  <%- if config[:test] -%>
14
+
11
15
  gem "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>"
12
16
  <%- end -%>
17
+ <%- if config[:rubocop] -%>
18
+
19
+ gem "rubocop", "~> 0.80"
20
+ <%- end -%>
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
- <% if config[:test] == "minitest" -%>
4
+ <% default_task_names = [config[:test_task]].compact -%>
5
+ <% case config[:test] -%>
6
+ <% when "minitest", "test-unit" -%>
3
7
  require "rake/testtask"
4
8
 
5
9
  Rake::TestTask.new(:test) do |t|
@@ -8,22 +12,32 @@ Rake::TestTask.new(:test) do |t|
8
12
  t.test_files = FileList["test/**/*_test.rb"]
9
13
  end
10
14
 
11
- <% elsif config[:test] == "rspec" -%>
15
+ <% when "rspec" -%>
12
16
  require "rspec/core/rake_task"
13
17
 
14
18
  RSpec::Core::RakeTask.new(:spec)
15
19
 
20
+ <% end -%>
21
+ <% if config[:rubocop] -%>
22
+ <% default_task_names << :rubocop -%>
23
+ require "rubocop/rake_task"
24
+
25
+ RuboCop::RakeTask.new
26
+
16
27
  <% end -%>
17
28
  <% if config[:ext] -%>
29
+ <% default_task_names.unshift(:clobber, :compile) -%>
18
30
  require "rake/extensiontask"
19
31
 
20
- task :build => :compile
32
+ task build: :compile
21
33
 
22
34
  Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext|
23
35
  ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
24
36
  end
25
37
 
26
- task :default => [:clobber, :compile, :<%= config[:test_task] %>]
38
+ <% end -%>
39
+ <% if default_task_names.size == 1 -%>
40
+ task default: <%= default_task_names.first.inspect %>
27
41
  <% else -%>
28
- task :default => :<%= config[:test_task] %>
42
+ task default: %i[<%= default_task_names.join(" ") %>]
29
43
  <% end -%>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #!/usr/bin/env ruby
2
4
 
3
5
  require "bundler/setup"
@@ -0,0 +1,13 @@
1
+ version: 2.1
2
+ jobs:
3
+ build:
4
+ docker:
5
+ - image: ruby:<%= RUBY_VERSION %>
6
+ steps:
7
+ - checkout
8
+ - run:
9
+ name: Run the default task
10
+ command: |
11
+ gem install bundler -v <%= Bundler::VERSION %>
12
+ bundle install
13
+ bundle exec rake
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "mkmf"
2
4
 
3
5
  create_makefile(<%= config[:makefile_path].inspect %>)
@@ -0,0 +1,18 @@
1
+ name: Ruby
2
+
3
+ on: [push,pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v2
10
+ - name: Set up Ruby
11
+ uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: <%= RUBY_VERSION %>
14
+ - name: Run the default task
15
+ run: |
16
+ gem install bundler -v <%= Bundler::VERSION %>
17
+ bundle install
18
+ bundle exec rake
@@ -0,0 +1,9 @@
1
+ image: ruby:<%= RUBY_VERSION %>
2
+
3
+ before_script:
4
+ - gem install bundler -v <%= Bundler::VERSION %>
5
+ - bundle install
6
+
7
+ example_job:
8
+ script:
9
+ - bundle exec rake
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "<%= config[:namespaced_path] %>/version"
2
4
  <%- if config[:ext] -%>
3
5
  require "<%= config[:namespaced_path] %>/<%= config[:underscored_name] %>"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  <%- config[:constant_array].each_with_index do |c, i| -%>
2
4
  <%= " " * i %>module <%= c %>
3
5
  <%- end -%>
@@ -1,4 +1,6 @@
1
- require_relative 'lib/<%=config[:namespaced_path]%>/version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/<%=config[:namespaced_path]%>/version"
2
4
 
3
5
  Gem::Specification.new do |spec|
4
6
  spec.name = <%= config[:name].inspect %>
@@ -6,8 +8,8 @@ Gem::Specification.new do |spec|
6
8
  spec.authors = [<%= config[:author].inspect %>]
7
9
  spec.email = [<%= config[:email].inspect %>]
8
10
 
9
- spec.summary = %q{TODO: Write a short summary, because RubyGems requires one.}
10
- spec.description = %q{TODO: Write a longer description or delete this line.}
11
+ spec.summary = "TODO: Write a short summary, because RubyGems requires one."
12
+ spec.description = "TODO: Write a longer description or delete this line."
11
13
  spec.homepage = "TODO: Put your gem's website or public repo URL here."
12
14
  <%- if config[:mit] -%>
13
15
  spec.license = "MIT"
@@ -22,7 +24,7 @@ Gem::Specification.new do |spec|
22
24
 
23
25
  # Specify which files should be added to the gem when it is released.
24
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
27
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
28
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
29
  end
28
30
  spec.bindir = "exe"
@@ -0,0 +1,10 @@
1
+ Style/StringLiterals:
2
+ Enabled: true
3
+ EnforcedStyle: double_quotes
4
+
5
+ Style/StringLiteralsInInterpolation:
6
+ Enabled: true
7
+ EnforcedStyle: double_quotes
8
+
9
+ Layout/LineLength:
10
+ Max: 120
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe <%= config[:constant_name] %> do
2
4
  it "has a version number" do
3
5
  expect(<%= config[:constant_name] %>::VERSION).not_to be nil
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/setup"
2
4
  require "<%= config[:namespaced_path] %>"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class <%= config[:constant_name] %>Test < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
2
4
  require "<%= config[:namespaced_path] %>"
3
5
 
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class <%= config[:constant_name] %>Test < Test::Unit::TestCase
6
+ test "VERSION" do
7
+ assert do
8
+ ::<%= config[:constant_name] %>.const_defined?(:VERSION)
9
+ end
10
+ end
11
+
12
+ test "something useful" do
13
+ assert_equal("expected", "actual")
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4
+ require "<%= config[:namespaced_path] %>"
5
+
6
+ require "test-unit"
@@ -12,15 +12,11 @@ autoload :OpenSSL, 'openssl'
12
12
  # servers you wish to talk to. For each host:port you communicate with a
13
13
  # single persistent connection is created.
14
14
  #
15
- # Multiple Bundler::Persistent::Net::HTTP::Persistent objects will share the same set of
16
- # connections.
15
+ # Connections will be shared across threads through a connection pool to
16
+ # increase reuse of connections.
17
17
  #
18
- # For each thread you start a new connection will be created. A
19
- # Bundler::Persistent::Net::HTTP::Persistent connection will not be shared across threads.
20
- #
21
- # You can shut down the HTTP connections when done by calling #shutdown. You
22
- # should name your Bundler::Persistent::Net::HTTP::Persistent object if you intend to call this
23
- # method.
18
+ # You can shut down any remaining HTTP connections when done by calling
19
+ # #shutdown.
24
20
  #
25
21
  # Example:
26
22
  #
@@ -28,7 +24,7 @@ autoload :OpenSSL, 'openssl'
28
24
  #
29
25
  # uri = Bundler::URI 'http://example.com/awesome/web/service'
30
26
  #
31
- # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
27
+ # http = Bundler::Persistent::Net::HTTP::Persistent.new
32
28
  #
33
29
  # # perform a GET
34
30
  # response = http.request uri
@@ -50,14 +46,14 @@ autoload :OpenSSL, 'openssl'
50
46
  # to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
51
47
  # params which are sent in the body for other requests.
52
48
  #
53
- # == SSL
49
+ # == TLS/SSL
54
50
  #
55
- # SSL connections are automatically created depending upon the scheme of the
56
- # Bundler::URI. SSL connections are automatically verified against the default
51
+ # TLS connections are automatically created depending upon the scheme of the
52
+ # Bundler::URI. TLS connections are automatically verified against the default
57
53
  # certificate store for your computer. You can override this by changing
58
54
  # verify_mode or by specifying an alternate cert_store.
59
55
  #
60
- # Here are the SSL settings, see the individual methods for documentation:
56
+ # Here are the TLS settings, see the individual methods for documentation:
61
57
  #
62
58
  # #certificate :: This client's certificate
63
59
  # #ca_file :: The certificate-authorities
@@ -67,7 +63,7 @@ autoload :OpenSSL, 'openssl'
67
63
  # #private_key :: The client's SSL private key
68
64
  # #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
69
65
  # connection
70
- # #ssl_timeout :: SSL session lifetime
66
+ # #ssl_timeout :: Session lifetime
71
67
  # #ssl_version :: Which specific SSL version to use
72
68
  # #verify_callback :: For server certificate verification
73
69
  # #verify_depth :: Depth of certificate verification
@@ -96,14 +92,15 @@ autoload :OpenSSL, 'openssl'
96
92
  #
97
93
  # === Segregation
98
94
  #
99
- # By providing an application name to ::new you can separate your connections
100
- # from the connections of other applications.
95
+ # Each Bundler::Persistent::Net::HTTP::Persistent instance has its own pool of connections. There
96
+ # is no sharing with other instances (as was true in earlier versions).
101
97
  #
102
98
  # === Idle Timeout
103
99
  #
104
- # If a connection hasn't been used for this number of seconds it will automatically be
105
- # reset upon the next use to avoid attempting to send to a closed connection.
106
- # The default value is 5 seconds. nil means no timeout. Set through #idle_timeout.
100
+ # If a connection hasn't been used for this number of seconds it will
101
+ # automatically be reset upon the next use to avoid attempting to send to a
102
+ # closed connection. The default value is 5 seconds. nil means no timeout.
103
+ # Set through #idle_timeout.
107
104
  #
108
105
  # Reducing this value may help avoid the "too many connection resets" error
109
106
  # when sending non-idempotent requests while increasing this value will cause
@@ -118,8 +115,9 @@ autoload :OpenSSL, 'openssl'
118
115
  #
119
116
  # The number of requests that should be made before opening a new connection.
120
117
  # Typically many keep-alive capable servers tune this to 100 or less, so the
121
- # 101st request will fail with ECONNRESET. If unset (default), this value has no
122
- # effect, if set, connections will be reset on the request after max_requests.
118
+ # 101st request will fail with ECONNRESET. If unset (default), this value has
119
+ # no effect, if set, connections will be reset on the request after
120
+ # max_requests.
123
121
  #
124
122
  # === Open Timeout
125
123
  #
@@ -131,45 +129,6 @@ autoload :OpenSSL, 'openssl'
131
129
  # Socket options may be set on newly-created connections. See #socket_options
132
130
  # for details.
133
131
  #
134
- # === Non-Idempotent Requests
135
- #
136
- # By default non-idempotent requests will not be retried per RFC 2616. By
137
- # setting retry_change_requests to true requests will automatically be retried
138
- # once.
139
- #
140
- # Only do this when you know that retrying a POST or other non-idempotent
141
- # request is safe for your application and will not create duplicate
142
- # resources.
143
- #
144
- # The recommended way to handle non-idempotent requests is the following:
145
- #
146
- # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
147
- #
148
- # uri = Bundler::URI 'http://example.com/awesome/web/service'
149
- # post_uri = uri + 'create'
150
- #
151
- # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
152
- #
153
- # post = Net::HTTP::Post.new post_uri.path
154
- # # ... fill in POST request
155
- #
156
- # begin
157
- # response = http.request post_uri, post
158
- # rescue Bundler::Persistent::Net::HTTP::Persistent::Error
159
- #
160
- # # POST failed, make a new request to verify the server did not process
161
- # # the request
162
- # exists_uri = uri + '...'
163
- # response = http.get exists_uri
164
- #
165
- # # Retry if it failed
166
- # retry if response.code == '404'
167
- # end
168
- #
169
- # The method of determining if the resource was created or not is unique to
170
- # the particular service you are using. Of course, you will want to add
171
- # protection from infinite looping.
172
- #
173
132
  # === Connection Termination
174
133
  #
175
134
  # If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
@@ -195,33 +154,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
195
154
  HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
196
155
 
197
156
  ##
198
- # The default connection pool size is 1/4 the allowed open files.
157
+ # The default connection pool size is 1/4 the allowed open files
158
+ # (<code>ulimit -n</code>) or 256 if your OS does not support file handle
159
+ # limits (typically windows).
199
160
 
200
- if Gem.win_platform? then
201
- DEFAULT_POOL_SIZE = 256
202
- else
161
+ if Process.const_defined? :RLIMIT_NOFILE
203
162
  DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
163
+ else
164
+ DEFAULT_POOL_SIZE = 256
204
165
  end
205
166
 
206
167
  ##
207
168
  # The version of Bundler::Persistent::Net::HTTP::Persistent you are using
208
169
 
209
- VERSION = '3.1.0'
210
-
211
- ##
212
- # Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with
213
- # the exception list for ruby 1.x.
214
-
215
- RETRIED_EXCEPTIONS = [ # :nodoc:
216
- (Net::ReadTimeout if Net.const_defined? :ReadTimeout),
217
- IOError,
218
- EOFError,
219
- Errno::ECONNRESET,
220
- Errno::ECONNABORTED,
221
- Errno::EPIPE,
222
- (OpenSSL::SSL::SSLError if HAVE_OPENSSL),
223
- Timeout::Error,
224
- ].compact
170
+ VERSION = '4.0.0'
225
171
 
226
172
  ##
227
173
  # Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
@@ -348,6 +294,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
348
294
 
349
295
  attr_accessor :max_requests
350
296
 
297
+ ##
298
+ # Number of retries to perform if a request fails.
299
+ #
300
+ # See also #max_retries=, Net::HTTP#max_retries=.
301
+
302
+ attr_reader :max_retries
303
+
351
304
  ##
352
305
  # The value sent in the Keep-Alive header. Defaults to 30. Not needed for
353
306
  # HTTP/1.1 servers.
@@ -360,8 +313,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
360
313
  attr_accessor :keep_alive
361
314
 
362
315
  ##
363
- # A name for this connection. Allows you to keep your connections apart
364
- # from everybody else's.
316
+ # The name for this collection of persistent connections.
365
317
 
366
318
  attr_reader :name
367
319
 
@@ -490,23 +442,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
490
442
 
491
443
  attr_reader :verify_mode
492
444
 
493
- ##
494
- # Enable retries of non-idempotent requests that change data (e.g. POST
495
- # requests) when the server has disconnected.
496
- #
497
- # This will in the worst case lead to multiple requests with the same data,
498
- # but it may be useful for some applications. Take care when enabling
499
- # this option to ensure it is safe to POST or perform other non-idempotent
500
- # requests to the server.
501
-
502
- attr_accessor :retry_change_requests
503
-
504
445
  ##
505
446
  # Creates a new Bundler::Persistent::Net::HTTP::Persistent.
506
447
  #
507
- # Set +name+ to keep your connections apart from everybody else's. Not
508
- # required currently, but highly recommended. Your library name should be
509
- # good enough. This parameter will be required in a future version.
448
+ # Set a +name+ for fun. Your library name should be good enough, but this
449
+ # otherwise has no purpose.
510
450
  #
511
451
  # +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
512
452
  # the environment. See proxy_from_env for details.
@@ -519,8 +459,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
519
459
  # proxy.password = 'hunter2'
520
460
  #
521
461
  # Set +pool_size+ to limit the maximum number of connections allowed.
522
- # Defaults to 1/4 the number of allowed file handles. You can have no more
523
- # than this many threads with active HTTP transactions.
462
+ # Defaults to 1/4 the number of allowed file handles or 256 if your OS does
463
+ # not support a limit on allowed file handles. You can have no more than
464
+ # this many threads with active HTTP transactions.
524
465
 
525
466
  def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
526
467
  @name = name
@@ -537,6 +478,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
537
478
  @write_timeout = nil
538
479
  @idle_timeout = 5
539
480
  @max_requests = nil
481
+ @max_retries = 1
540
482
  @socket_options = []
541
483
  @ssl_generation = 0 # incremented when SSL session variables change
542
484
 
@@ -568,8 +510,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
568
510
  @reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
569
511
  end
570
512
 
571
- @retry_change_requests = false
572
-
573
513
  self.proxy = proxy if proxy
574
514
  end
575
515
 
@@ -630,7 +570,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
630
570
 
631
571
  net_http_args = [uri.hostname, uri.port]
632
572
 
633
- if @proxy_uri and not proxy_bypass? uri.hostname, uri.port then
573
+ # I'm unsure if uri.host or uri.hostname should be checked against
574
+ # the proxy bypass list.
575
+ if @proxy_uri and not proxy_bypass? uri.host, uri.port then
634
576
  net_http_args.concat @proxy_args
635
577
  else
636
578
  net_http_args.concat [nil, nil, nil, nil]
@@ -650,9 +592,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
650
592
  reset connection
651
593
  end
652
594
 
653
- http.read_timeout = @read_timeout if @read_timeout
654
- http.write_timeout = @write_timeout if @write_timeout && http.respond_to?(:write_timeout=)
655
- http.keep_alive_timeout = @idle_timeout if @idle_timeout
595
+ http.keep_alive_timeout = @idle_timeout if @idle_timeout
596
+ http.max_retries = @max_retries if http.respond_to?(:max_retries=)
597
+ http.read_timeout = @read_timeout if @read_timeout
598
+ http.write_timeout = @write_timeout if
599
+ @write_timeout && http.respond_to?(:write_timeout=)
656
600
 
657
601
  return yield connection
658
602
  rescue Errno::ECONNREFUSED
@@ -670,27 +614,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
670
614
  end
671
615
 
672
616
  ##
673
- # Returns an error message containing the number of requests performed on
674
- # this connection
675
-
676
- def error_message connection
677
- connection.requests -= 1 # fixup
678
-
679
- age = Time.now - connection.last_use
680
-
681
- "after #{connection.requests} requests on #{connection.http.object_id}, " \
682
- "last used #{age} seconds ago"
683
- end
684
-
685
- ##
686
- # Bundler::URI::escape wrapper
617
+ # CGI::escape wrapper
687
618
 
688
619
  def escape str
689
620
  CGI.escape str if str
690
621
  end
691
622
 
692
623
  ##
693
- # Bundler::URI::unescape wrapper
624
+ # CGI::unescape wrapper
694
625
 
695
626
  def unescape str
696
627
  CGI.unescape str if str
@@ -733,6 +664,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
733
664
  def finish connection
734
665
  connection.finish
735
666
 
667
+ connection.http.instance_variable_set :@last_communicated, nil
736
668
  connection.http.instance_variable_set :@ssl_session, nil unless
737
669
  @reuse_ssl_sessions
738
670
  end
@@ -741,31 +673,31 @@ class Bundler::Persistent::Net::HTTP::Persistent
741
673
  # Returns the HTTP protocol version for +uri+
742
674
 
743
675
  def http_version uri
744
- @http_versions["#{uri.host}:#{uri.port}"]
676
+ @http_versions["#{uri.hostname}:#{uri.port}"]
745
677
  end
746
678
 
747
679
  ##
748
- # Is +req+ idempotent according to RFC 2616?
680
+ # Adds "http://" to the String +uri+ if it is missing.
749
681
 
750
- def idempotent? req
751
- case req.method
752
- when 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE' then
753
- true
754
- end
682
+ def normalize_uri uri
683
+ (uri =~ /^https?:/) ? uri : "http://#{uri}"
755
684
  end
756
685
 
757
686
  ##
758
- # Is the request +req+ idempotent or is retry_change_requests allowed.
687
+ # Set the maximum number of retries for a request.
688
+ #
689
+ # Defaults to one retry.
690
+ #
691
+ # Set this to 0 to disable retries.
759
692
 
760
- def can_retry? req
761
- @retry_change_requests && !idempotent?(req)
762
- end
693
+ def max_retries= retries
694
+ retries = retries.to_int
763
695
 
764
- ##
765
- # Adds "http://" to the String +uri+ if it is missing.
696
+ raise ArgumentError, "max_retries must be positive" if retries < 0
766
697
 
767
- def normalize_uri uri
768
- (uri =~ /^https?:/) ? uri : "http://#{uri}"
698
+ @max_retries = retries
699
+
700
+ reconnect
769
701
  end
770
702
 
771
703
  ##
@@ -806,7 +738,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
806
738
 
807
739
  if @proxy_uri then
808
740
  @proxy_args = [
809
- @proxy_uri.host,
741
+ @proxy_uri.hostname,
810
742
  @proxy_uri.port,
811
743
  unescape(@proxy_uri.user),
812
744
  unescape(@proxy_uri.password),
@@ -881,14 +813,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
881
813
  end
882
814
 
883
815
  ##
884
- # Forces reconnection of HTTP connections.
816
+ # Forces reconnection of all HTTP connections, including TLS/SSL
817
+ # connections.
885
818
 
886
819
  def reconnect
887
820
  @generation += 1
888
821
  end
889
822
 
890
823
  ##
891
- # Forces reconnection of SSL connections.
824
+ # Forces reconnection of only TLS/SSL connections.
892
825
 
893
826
  def reconnect_ssl
894
827
  @ssl_generation += 1
@@ -921,14 +854,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
921
854
  # the response will not have been read).
922
855
  #
923
856
  # +req+ must be a Net::HTTPGenericRequest subclass (see Net::HTTP for a list).
924
- #
925
- # If there is an error and the request is idempotent according to RFC 2616
926
- # it will be retried automatically.
927
857
 
928
858
  def request uri, req = nil, &block
929
- retried = false
930
- bad_response = false
931
-
932
859
  uri = Bundler::URI uri
933
860
  req = request_setup req || uri
934
861
  response = nil
@@ -942,37 +869,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
942
869
  response = http.request req, &block
943
870
 
944
871
  if req.connection_close? or
945
- (response.http_version <= '1.0' and
872
+ (response.http_version <= '1.0' and
946
873
  not response.connection_keep_alive?) or
947
- response.connection_close? then
874
+ response.connection_close? then
948
875
  finish connection
949
876
  end
950
- rescue Net::HTTPBadResponse => e
951
- message = error_message connection
952
-
953
- finish connection
954
-
955
- raise Error, "too many bad responses #{message}" if
956
- bad_response or not can_retry? req
957
-
958
- bad_response = true
959
- retry
960
- rescue *RETRIED_EXCEPTIONS => e
961
- request_failed e, req, connection if
962
- retried or not can_retry? req
963
-
964
- reset connection
965
-
966
- retried = true
967
- retry
968
- rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2
969
- request_failed e, req, connection if retried or not can_retry? req
970
-
971
- reset connection
972
-
973
- retried = true
974
- retry
975
- rescue Exception => e
877
+ rescue Exception # make sure to close the connection when it was interrupted
976
878
  finish connection
977
879
 
978
880
  raise
@@ -981,26 +883,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
981
883
  end
982
884
  end
983
885
 
984
- @http_versions["#{uri.host}:#{uri.port}"] ||= response.http_version
886
+ @http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
985
887
 
986
888
  response
987
889
  end
988
890
 
989
- ##
990
- # Raises an Error for +exception+ which resulted from attempting the request
991
- # +req+ on the +connection+.
992
- #
993
- # Finishes the +connection+.
994
-
995
- def request_failed exception, req, connection # :nodoc:
996
- due_to = "(due to #{exception.message} - #{exception.class})"
997
- message = "too many connection resets #{due_to} #{error_message connection}"
998
-
999
- finish connection
1000
-
1001
- raise Error, message, exception.backtrace
1002
- end
1003
-
1004
891
  ##
1005
892
  # Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
1006
893
  # request.
@@ -1008,7 +895,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
1008
895
  # Returns the request.
1009
896
 
1010
897
  def request_setup req_or_uri # :nodoc:
1011
- req = if Bundler::URI === req_or_uri then
898
+ req = if req_or_uri.respond_to? 'request_uri' then
1012
899
  Net::HTTP::Get.new req_or_uri.request_uri
1013
900
  else
1014
901
  req_or_uri
@@ -1172,7 +1059,6 @@ application:
1172
1059
 
1173
1060
  reconnect_ssl
1174
1061
  end
1175
-
1176
1062
  end
1177
1063
 
1178
1064
  require_relative 'persistent/connection'