bundler 2.1.0 → 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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +832 -738
  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/exec.rb +3 -12
  11. data/lib/bundler/cli/gem.rb +83 -10
  12. data/lib/bundler/cli/info.rb +13 -3
  13. data/lib/bundler/cli/init.rb +1 -1
  14. data/lib/bundler/cli/install.rb +8 -16
  15. data/lib/bundler/cli/issue.rb +2 -2
  16. data/lib/bundler/cli/list.rb +11 -9
  17. data/lib/bundler/cli/outdated.rb +88 -65
  18. data/lib/bundler/cli/plugin.rb +10 -0
  19. data/lib/bundler/cli/pristine.rb +5 -0
  20. data/lib/bundler/definition.rb +32 -32
  21. data/lib/bundler/dependency.rb +0 -9
  22. data/lib/bundler/dsl.rb +1 -5
  23. data/lib/bundler/environment_preserver.rb +26 -2
  24. data/lib/bundler/errors.rb +1 -0
  25. data/lib/bundler/feature_flag.rb +0 -2
  26. data/lib/bundler/fetcher.rb +1 -0
  27. data/lib/bundler/friendly_errors.rb +4 -10
  28. data/lib/bundler/gem_helper.rb +18 -12
  29. data/lib/bundler/gem_version_promoter.rb +1 -1
  30. data/lib/bundler/injector.rb +14 -3
  31. data/lib/bundler/inline.rb +2 -2
  32. data/lib/bundler/installer.rb +29 -28
  33. data/lib/bundler/installer/gem_installer.rb +2 -2
  34. data/lib/bundler/installer/parallel_installer.rb +9 -9
  35. data/lib/bundler/lazy_specification.rb +16 -3
  36. data/lib/bundler/plugin.rb +26 -0
  37. data/lib/bundler/plugin/index.rb +9 -0
  38. data/lib/bundler/psyched_yaml.rb +0 -15
  39. data/lib/bundler/remote_specification.rb +4 -1
  40. data/lib/bundler/resolver.rb +31 -8
  41. data/lib/bundler/resolver/spec_group.rb +26 -5
  42. data/lib/bundler/rubygems_ext.rb +7 -8
  43. data/lib/bundler/rubygems_gem_installer.rb +1 -7
  44. data/lib/bundler/rubygems_integration.rb +13 -48
  45. data/lib/bundler/runtime.rb +2 -12
  46. data/lib/bundler/settings.rb +0 -3
  47. data/lib/bundler/setup.rb +5 -0
  48. data/lib/bundler/shared_helpers.rb +1 -1
  49. data/lib/bundler/source/git.rb +4 -4
  50. data/lib/bundler/source/git/git_proxy.rb +53 -58
  51. data/lib/bundler/source/path.rb +5 -1
  52. data/lib/bundler/source/path/installer.rb +7 -9
  53. data/lib/bundler/source/rubygems.rb +11 -14
  54. data/lib/bundler/stub_specification.rb +16 -4
  55. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  56. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  57. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  58. data/lib/bundler/templates/newgem/bin/console.tt +2 -0
  59. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  60. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  61. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  62. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  63. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -0
  64. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  65. data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -4
  66. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  67. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  68. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
  69. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  70. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  71. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  72. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  73. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +72 -208
  74. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  75. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  76. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  77. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  78. data/lib/bundler/version.rb +1 -1
  79. data/man/bundle-add.1 +1 -1
  80. data/man/bundle-add.1.txt +15 -15
  81. data/man/bundle-binstubs.1 +1 -1
  82. data/man/bundle-binstubs.1.txt +10 -10
  83. data/man/bundle-cache.1 +1 -1
  84. data/man/bundle-cache.1.txt +15 -15
  85. data/man/bundle-check.1 +1 -1
  86. data/man/bundle-check.1.txt +8 -8
  87. data/man/bundle-clean.1 +1 -1
  88. data/man/bundle-clean.1.txt +6 -6
  89. data/man/bundle-config.1 +3 -9
  90. data/man/bundle-config.1.txt +271 -272
  91. data/man/bundle-config.ronn +5 -9
  92. data/man/bundle-doctor.1 +1 -1
  93. data/man/bundle-doctor.1.txt +9 -9
  94. data/man/bundle-exec.1 +1 -1
  95. data/man/bundle-exec.1.txt +84 -81
  96. data/man/bundle-gem.1 +25 -3
  97. data/man/bundle-gem.1.txt +65 -39
  98. data/man/bundle-gem.ronn +30 -7
  99. data/man/bundle-info.1 +1 -1
  100. data/man/bundle-info.1.txt +2 -2
  101. data/man/bundle-init.1 +1 -1
  102. data/man/bundle-init.1.txt +9 -9
  103. data/man/bundle-inject.1 +1 -1
  104. data/man/bundle-inject.1.txt +4 -4
  105. data/man/bundle-install.1 +1 -1
  106. data/man/bundle-install.1.txt +169 -169
  107. data/man/bundle-list.1 +7 -7
  108. data/man/bundle-list.1.txt +12 -11
  109. data/man/bundle-list.ronn +6 -6
  110. data/man/bundle-lock.1 +1 -1
  111. data/man/bundle-lock.1.txt +28 -28
  112. data/man/bundle-open.1 +1 -1
  113. data/man/bundle-open.1.txt +3 -3
  114. data/man/bundle-outdated.1 +1 -1
  115. data/man/bundle-outdated.1.txt +34 -34
  116. data/man/bundle-platform.1 +1 -1
  117. data/man/bundle-platform.1.txt +16 -16
  118. data/man/bundle-pristine.1 +1 -1
  119. data/man/bundle-pristine.1.txt +8 -8
  120. data/man/bundle-remove.1 +1 -1
  121. data/man/bundle-remove.1.txt +9 -9
  122. data/man/bundle-show.1 +1 -1
  123. data/man/bundle-show.1.txt +8 -8
  124. data/man/bundle-update.1 +1 -1
  125. data/man/bundle-update.1.txt +149 -148
  126. data/man/bundle-viz.1 +1 -1
  127. data/man/bundle-viz.1.txt +11 -11
  128. data/man/bundle.1 +1 -1
  129. data/man/bundle.1.txt +31 -31
  130. data/man/gemfile.5 +1 -1
  131. data/man/gemfile.5.txt +218 -216
  132. 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"
@@ -3,11 +3,6 @@ require_relative '../../../../uri/lib/uri'
3
3
  require 'cgi' # for escaping
4
4
  require_relative '../../../../connection_pool/lib/connection_pool'
5
5
 
6
- begin
7
- require 'net/http/pipeline'
8
- rescue LoadError
9
- end
10
-
11
6
  autoload :OpenSSL, 'openssl'
12
7
 
13
8
  ##
@@ -17,15 +12,11 @@ autoload :OpenSSL, 'openssl'
17
12
  # servers you wish to talk to. For each host:port you communicate with a
18
13
  # single persistent connection is created.
19
14
  #
20
- # Multiple Bundler::Persistent::Net::HTTP::Persistent objects will share the same set of
21
- # connections.
22
- #
23
- # For each thread you start a new connection will be created. A
24
- # Bundler::Persistent::Net::HTTP::Persistent connection will not be shared across threads.
15
+ # Connections will be shared across threads through a connection pool to
16
+ # increase reuse of connections.
25
17
  #
26
- # You can shut down the HTTP connections when done by calling #shutdown. You
27
- # should name your Bundler::Persistent::Net::HTTP::Persistent object if you intend to call this
28
- # method.
18
+ # You can shut down any remaining HTTP connections when done by calling
19
+ # #shutdown.
29
20
  #
30
21
  # Example:
31
22
  #
@@ -33,7 +24,7 @@ autoload :OpenSSL, 'openssl'
33
24
  #
34
25
  # uri = Bundler::URI 'http://example.com/awesome/web/service'
35
26
  #
36
- # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
27
+ # http = Bundler::Persistent::Net::HTTP::Persistent.new
37
28
  #
38
29
  # # perform a GET
39
30
  # response = http.request uri
@@ -55,14 +46,14 @@ autoload :OpenSSL, 'openssl'
55
46
  # to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
56
47
  # params which are sent in the body for other requests.
57
48
  #
58
- # == SSL
49
+ # == TLS/SSL
59
50
  #
60
- # SSL connections are automatically created depending upon the scheme of the
61
- # 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
62
53
  # certificate store for your computer. You can override this by changing
63
54
  # verify_mode or by specifying an alternate cert_store.
64
55
  #
65
- # Here are the SSL settings, see the individual methods for documentation:
56
+ # Here are the TLS settings, see the individual methods for documentation:
66
57
  #
67
58
  # #certificate :: This client's certificate
68
59
  # #ca_file :: The certificate-authorities
@@ -72,7 +63,7 @@ autoload :OpenSSL, 'openssl'
72
63
  # #private_key :: The client's SSL private key
73
64
  # #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
74
65
  # connection
75
- # #ssl_timeout :: SSL session lifetime
66
+ # #ssl_timeout :: Session lifetime
76
67
  # #ssl_version :: Which specific SSL version to use
77
68
  # #verify_callback :: For server certificate verification
78
69
  # #verify_depth :: Depth of certificate verification
@@ -101,14 +92,15 @@ autoload :OpenSSL, 'openssl'
101
92
  #
102
93
  # === Segregation
103
94
  #
104
- # By providing an application name to ::new you can separate your connections
105
- # 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).
106
97
  #
107
98
  # === Idle Timeout
108
99
  #
109
- # If a connection hasn't been used for this number of seconds it will automatically be
110
- # reset upon the next use to avoid attempting to send to a closed connection.
111
- # 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.
112
104
  #
113
105
  # Reducing this value may help avoid the "too many connection resets" error
114
106
  # when sending non-idempotent requests while increasing this value will cause
@@ -123,8 +115,9 @@ autoload :OpenSSL, 'openssl'
123
115
  #
124
116
  # The number of requests that should be made before opening a new connection.
125
117
  # Typically many keep-alive capable servers tune this to 100 or less, so the
126
- # 101st request will fail with ECONNRESET. If unset (default), this value has no
127
- # 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.
128
121
  #
129
122
  # === Open Timeout
130
123
  #
@@ -136,45 +129,6 @@ autoload :OpenSSL, 'openssl'
136
129
  # Socket options may be set on newly-created connections. See #socket_options
137
130
  # for details.
138
131
  #
139
- # === Non-Idempotent Requests
140
- #
141
- # By default non-idempotent requests will not be retried per RFC 2616. By
142
- # setting retry_change_requests to true requests will automatically be retried
143
- # once.
144
- #
145
- # Only do this when you know that retrying a POST or other non-idempotent
146
- # request is safe for your application and will not create duplicate
147
- # resources.
148
- #
149
- # The recommended way to handle non-idempotent requests is the following:
150
- #
151
- # require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
152
- #
153
- # uri = Bundler::URI 'http://example.com/awesome/web/service'
154
- # post_uri = uri + 'create'
155
- #
156
- # http = Bundler::Persistent::Net::HTTP::Persistent.new name: 'my_app_name'
157
- #
158
- # post = Net::HTTP::Post.new post_uri.path
159
- # # ... fill in POST request
160
- #
161
- # begin
162
- # response = http.request post_uri, post
163
- # rescue Bundler::Persistent::Net::HTTP::Persistent::Error
164
- #
165
- # # POST failed, make a new request to verify the server did not process
166
- # # the request
167
- # exists_uri = uri + '...'
168
- # response = http.get exists_uri
169
- #
170
- # # Retry if it failed
171
- # retry if response.code == '404'
172
- # end
173
- #
174
- # The method of determining if the resource was created or not is unique to
175
- # the particular service you are using. Of course, you will want to add
176
- # protection from infinite looping.
177
- #
178
132
  # === Connection Termination
179
133
  #
180
134
  # If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
@@ -200,33 +154,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
200
154
  HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
201
155
 
202
156
  ##
203
- # 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).
204
160
 
205
- if Gem.win_platform? then
206
- DEFAULT_POOL_SIZE = 256
207
- else
161
+ if Process.const_defined? :RLIMIT_NOFILE
208
162
  DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
163
+ else
164
+ DEFAULT_POOL_SIZE = 256
209
165
  end
210
166
 
211
167
  ##
212
168
  # The version of Bundler::Persistent::Net::HTTP::Persistent you are using
213
169
 
214
- VERSION = '3.1.0'
215
-
216
- ##
217
- # Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with
218
- # the exception list for ruby 1.x.
219
-
220
- RETRIED_EXCEPTIONS = [ # :nodoc:
221
- (Net::ReadTimeout if Net.const_defined? :ReadTimeout),
222
- IOError,
223
- EOFError,
224
- Errno::ECONNRESET,
225
- Errno::ECONNABORTED,
226
- Errno::EPIPE,
227
- (OpenSSL::SSL::SSLError if HAVE_OPENSSL),
228
- Timeout::Error,
229
- ].compact
170
+ VERSION = '4.0.0'
230
171
 
231
172
  ##
232
173
  # Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
@@ -353,6 +294,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
353
294
 
354
295
  attr_accessor :max_requests
355
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
+
356
304
  ##
357
305
  # The value sent in the Keep-Alive header. Defaults to 30. Not needed for
358
306
  # HTTP/1.1 servers.
@@ -365,8 +313,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
365
313
  attr_accessor :keep_alive
366
314
 
367
315
  ##
368
- # A name for this connection. Allows you to keep your connections apart
369
- # from everybody else's.
316
+ # The name for this collection of persistent connections.
370
317
 
371
318
  attr_reader :name
372
319
 
@@ -495,23 +442,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
495
442
 
496
443
  attr_reader :verify_mode
497
444
 
498
- ##
499
- # Enable retries of non-idempotent requests that change data (e.g. POST
500
- # requests) when the server has disconnected.
501
- #
502
- # This will in the worst case lead to multiple requests with the same data,
503
- # but it may be useful for some applications. Take care when enabling
504
- # this option to ensure it is safe to POST or perform other non-idempotent
505
- # requests to the server.
506
-
507
- attr_accessor :retry_change_requests
508
-
509
445
  ##
510
446
  # Creates a new Bundler::Persistent::Net::HTTP::Persistent.
511
447
  #
512
- # Set +name+ to keep your connections apart from everybody else's. Not
513
- # required currently, but highly recommended. Your library name should be
514
- # 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.
515
450
  #
516
451
  # +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
517
452
  # the environment. See proxy_from_env for details.
@@ -524,8 +459,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
524
459
  # proxy.password = 'hunter2'
525
460
  #
526
461
  # Set +pool_size+ to limit the maximum number of connections allowed.
527
- # Defaults to 1/4 the number of allowed file handles. You can have no more
528
- # 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.
529
465
 
530
466
  def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
531
467
  @name = name
@@ -542,6 +478,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
542
478
  @write_timeout = nil
543
479
  @idle_timeout = 5
544
480
  @max_requests = nil
481
+ @max_retries = 1
545
482
  @socket_options = []
546
483
  @ssl_generation = 0 # incremented when SSL session variables change
547
484
 
@@ -573,8 +510,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
573
510
  @reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
574
511
  end
575
512
 
576
- @retry_change_requests = false
577
-
578
513
  self.proxy = proxy if proxy
579
514
  end
580
515
 
@@ -635,7 +570,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
635
570
 
636
571
  net_http_args = [uri.hostname, uri.port]
637
572
 
638
- 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
639
576
  net_http_args.concat @proxy_args
640
577
  else
641
578
  net_http_args.concat [nil, nil, nil, nil]
@@ -655,9 +592,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
655
592
  reset connection
656
593
  end
657
594
 
658
- http.read_timeout = @read_timeout if @read_timeout
659
- http.write_timeout = @write_timeout if @write_timeout && http.respond_to?(:write_timeout=)
660
- 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=)
661
600
 
662
601
  return yield connection
663
602
  rescue Errno::ECONNREFUSED
@@ -675,27 +614,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
675
614
  end
676
615
 
677
616
  ##
678
- # Returns an error message containing the number of requests performed on
679
- # this connection
680
-
681
- def error_message connection
682
- connection.requests -= 1 # fixup
683
-
684
- age = Time.now - connection.last_use
685
-
686
- "after #{connection.requests} requests on #{connection.http.object_id}, " \
687
- "last used #{age} seconds ago"
688
- end
689
-
690
- ##
691
- # Bundler::URI::escape wrapper
617
+ # CGI::escape wrapper
692
618
 
693
619
  def escape str
694
620
  CGI.escape str if str
695
621
  end
696
622
 
697
623
  ##
698
- # Bundler::URI::unescape wrapper
624
+ # CGI::unescape wrapper
699
625
 
700
626
  def unescape str
701
627
  CGI.unescape str if str
@@ -738,6 +664,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
738
664
  def finish connection
739
665
  connection.finish
740
666
 
667
+ connection.http.instance_variable_set :@last_communicated, nil
741
668
  connection.http.instance_variable_set :@ssl_session, nil unless
742
669
  @reuse_ssl_sessions
743
670
  end
@@ -746,24 +673,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
746
673
  # Returns the HTTP protocol version for +uri+
747
674
 
748
675
  def http_version uri
749
- @http_versions["#{uri.host}:#{uri.port}"]
750
- end
751
-
752
- ##
753
- # Is +req+ idempotent according to RFC 2616?
754
-
755
- def idempotent? req
756
- case req.method
757
- when 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE' then
758
- true
759
- end
760
- end
761
-
762
- ##
763
- # Is the request +req+ idempotent or is retry_change_requests allowed.
764
-
765
- def can_retry? req
766
- @retry_change_requests && !idempotent?(req)
676
+ @http_versions["#{uri.hostname}:#{uri.port}"]
767
677
  end
768
678
 
769
679
  ##
@@ -774,20 +684,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
774
684
  end
775
685
 
776
686
  ##
777
- # Pipelines +requests+ to the HTTP server at +uri+ yielding responses if a
778
- # block is given. Returns all responses received.
687
+ # Set the maximum number of retries for a request.
779
688
  #
780
- # See
781
- # Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
782
- # for further details.
689
+ # Defaults to one retry.
783
690
  #
784
- # Only if <tt>net-http-pipeline</tt> was required before
785
- # <tt>net-http-persistent</tt> #pipeline will be present.
691
+ # Set this to 0 to disable retries.
786
692
 
787
- def pipeline uri, requests, &block # :yields: responses
788
- connection_for uri do |connection|
789
- connection.http.pipeline requests, &block
790
- end
693
+ def max_retries= retries
694
+ retries = retries.to_int
695
+
696
+ raise ArgumentError, "max_retries must be positive" if retries < 0
697
+
698
+ @max_retries = retries
699
+
700
+ reconnect
791
701
  end
792
702
 
793
703
  ##
@@ -828,7 +738,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
828
738
 
829
739
  if @proxy_uri then
830
740
  @proxy_args = [
831
- @proxy_uri.host,
741
+ @proxy_uri.hostname,
832
742
  @proxy_uri.port,
833
743
  unescape(@proxy_uri.user),
834
744
  unescape(@proxy_uri.password),
@@ -903,14 +813,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
903
813
  end
904
814
 
905
815
  ##
906
- # Forces reconnection of HTTP connections.
816
+ # Forces reconnection of all HTTP connections, including TLS/SSL
817
+ # connections.
907
818
 
908
819
  def reconnect
909
820
  @generation += 1
910
821
  end
911
822
 
912
823
  ##
913
- # Forces reconnection of SSL connections.
824
+ # Forces reconnection of only TLS/SSL connections.
914
825
 
915
826
  def reconnect_ssl
916
827
  @ssl_generation += 1
@@ -943,14 +854,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
943
854
  # the response will not have been read).
944
855
  #
945
856
  # +req+ must be a Net::HTTPGenericRequest subclass (see Net::HTTP for a list).
946
- #
947
- # If there is an error and the request is idempotent according to RFC 2616
948
- # it will be retried automatically.
949
857
 
950
858
  def request uri, req = nil, &block
951
- retried = false
952
- bad_response = false
953
-
954
859
  uri = Bundler::URI uri
955
860
  req = request_setup req || uri
956
861
  response = nil
@@ -964,37 +869,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
964
869
  response = http.request req, &block
965
870
 
966
871
  if req.connection_close? or
967
- (response.http_version <= '1.0' and
872
+ (response.http_version <= '1.0' and
968
873
  not response.connection_keep_alive?) or
969
- response.connection_close? then
874
+ response.connection_close? then
970
875
  finish connection
971
876
  end
972
- rescue Net::HTTPBadResponse => e
973
- message = error_message connection
974
-
975
- finish connection
976
-
977
- raise Error, "too many bad responses #{message}" if
978
- bad_response or not can_retry? req
979
-
980
- bad_response = true
981
- retry
982
- rescue *RETRIED_EXCEPTIONS => e
983
- request_failed e, req, connection if
984
- retried or not can_retry? req
985
-
986
- reset connection
987
-
988
- retried = true
989
- retry
990
- rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2
991
- request_failed e, req, connection if retried or not can_retry? req
992
-
993
- reset connection
994
-
995
- retried = true
996
- retry
997
- rescue Exception => e
877
+ rescue Exception # make sure to close the connection when it was interrupted
998
878
  finish connection
999
879
 
1000
880
  raise
@@ -1003,26 +883,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
1003
883
  end
1004
884
  end
1005
885
 
1006
- @http_versions["#{uri.host}:#{uri.port}"] ||= response.http_version
886
+ @http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
1007
887
 
1008
888
  response
1009
889
  end
1010
890
 
1011
- ##
1012
- # Raises an Error for +exception+ which resulted from attempting the request
1013
- # +req+ on the +connection+.
1014
- #
1015
- # Finishes the +connection+.
1016
-
1017
- def request_failed exception, req, connection # :nodoc:
1018
- due_to = "(due to #{exception.message} - #{exception.class})"
1019
- message = "too many connection resets #{due_to} #{error_message connection}"
1020
-
1021
- finish connection
1022
-
1023
- raise Error, message, exception.backtrace
1024
- end
1025
-
1026
891
  ##
1027
892
  # Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
1028
893
  # request.
@@ -1030,7 +895,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
1030
895
  # Returns the request.
1031
896
 
1032
897
  def request_setup req_or_uri # :nodoc:
1033
- req = if Bundler::URI === req_or_uri then
898
+ req = if req_or_uri.respond_to? 'request_uri' then
1034
899
  Net::HTTP::Get.new req_or_uri.request_uri
1035
900
  else
1036
901
  req_or_uri
@@ -1194,7 +1059,6 @@ application:
1194
1059
 
1195
1060
  reconnect_ssl
1196
1061
  end
1197
-
1198
1062
  end
1199
1063
 
1200
1064
  require_relative 'persistent/connection'