bundler 2.2.24 → 2.3.7
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 +4 -4
- data/CHANGELOG.md +246 -1
- data/README.md +1 -1
- data/exe/bundle +7 -8
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/config.rb +10 -1
- data/lib/bundler/cli/doctor.rb +13 -4
- data/lib/bundler/cli/exec.rb +1 -6
- data/lib/bundler/cli/gem.rb +101 -11
- data/lib/bundler/cli/info.rb +26 -5
- data/lib/bundler/cli/install.rb +12 -45
- data/lib/bundler/cli/issue.rb +4 -3
- data/lib/bundler/cli/list.rb +7 -1
- data/lib/bundler/cli/open.rb +1 -2
- data/lib/bundler/cli/platform.rb +1 -1
- data/lib/bundler/cli/remove.rb +1 -2
- data/lib/bundler/cli/update.rb +9 -5
- data/lib/bundler/cli.rb +24 -20
- data/lib/bundler/compact_index_client/cache.rb +0 -9
- data/lib/bundler/compact_index_client/updater.rb +0 -5
- data/lib/bundler/compact_index_client.rb +2 -8
- data/lib/bundler/definition.rb +97 -161
- data/lib/bundler/dependency.rb +5 -7
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +32 -31
- data/lib/bundler/endpoint_specification.rb +21 -11
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +4 -1
- data/lib/bundler/errors.rb +19 -3
- data/lib/bundler/fetcher/compact_index.rb +9 -14
- data/lib/bundler/fetcher/index.rb +0 -26
- data/lib/bundler/fetcher.rb +13 -20
- data/lib/bundler/friendly_errors.rb +5 -30
- data/lib/bundler/gem_helper.rb +7 -18
- data/lib/bundler/injector.rb +10 -1
- data/lib/bundler/installer/gem_installer.rb +4 -22
- data/lib/bundler/installer/standalone.rb +13 -8
- data/lib/bundler/installer.rb +1 -5
- data/lib/bundler/lazy_specification.rb +19 -3
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +11 -12
- data/lib/bundler/man/bundle-add.1 +10 -2
- data/lib/bundler/man/bundle-add.1.ronn +7 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +1 -1
- data/lib/bundler/man/bundle-check.1 +1 -1
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +5 -5
- data/lib/bundler/man/bundle-config.1.ronn +5 -5
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +14 -1
- data/lib/bundler/man/bundle-gem.1.ronn +16 -0
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +1 -1
- data/lib/bundler/man/bundle-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +2 -2
- data/lib/bundler/man/bundle-install.1.ronn +2 -2
- data/lib/bundler/man/bundle-list.1 +1 -1
- data/lib/bundler/man/bundle-lock.1 +1 -1
- data/lib/bundler/man/bundle-open.1 +1 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.1 +1 -1
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +1 -1
- data/lib/bundler/man/bundle-show.1 +1 -1
- data/lib/bundler/man/bundle-update.1 +2 -2
- data/lib/bundler/man/bundle-update.1.ronn +2 -1
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +28 -2
- data/lib/bundler/man/gemfile.5.ronn +9 -1
- data/lib/bundler/plugin/api/source.rb +1 -0
- data/lib/bundler/plugin/installer.rb +3 -1
- data/lib/bundler/plugin.rb +23 -6
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/remote_specification.rb +7 -0
- data/lib/bundler/resolver/spec_group.rb +1 -1
- data/lib/bundler/resolver.rb +38 -47
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +19 -10
- data/lib/bundler/rubygems_gem_installer.rb +25 -5
- data/lib/bundler/rubygems_integration.rb +40 -70
- data/lib/bundler/runtime.rb +17 -8
- data/lib/bundler/self_manager.rb +168 -0
- data/lib/bundler/settings.rb +15 -2
- data/lib/bundler/setup.rb +2 -2
- data/lib/bundler/shared_helpers.rb +4 -19
- data/lib/bundler/source/git/git_proxy.rb +8 -6
- data/lib/bundler/source/git.rb +22 -4
- data/lib/bundler/source/metadata.rb +1 -1
- data/lib/bundler/source/rubygems.rb +70 -81
- data/lib/bundler/source/rubygems_aggregate.rb +4 -0
- data/lib/bundler/source.rb +4 -0
- data/lib/bundler/source_list.rb +22 -31
- data/lib/bundler/spec_set.rb +14 -36
- data/lib/bundler/templates/Executable.bundler +7 -7
- data/lib/bundler/templates/Gemfile +0 -2
- data/lib/bundler/templates/gems.rb +0 -3
- data/lib/bundler/templates/newgem/Gemfile.tt +5 -2
- data/lib/bundler/templates/newgem/Rakefile.tt +15 -2
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +13 -2
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +17 -15
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
- data/lib/bundler/ui/shell.rb +1 -1
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
- data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/lib/bundler/vendor/molinillo/LICENSE +9 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +6 -6
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -2
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -2
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +9 -4
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +19 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +22 -4
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +453 -0
- data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
- data/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +0 -1
- data/lib/bundler/vendored_tsort.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +19 -4
- data/lib/bundler.rb +23 -26
- metadata +25 -10
- data/lib/bundler/gemdeps.rb +0 -29
- data/lib/bundler/psyched_yaml.rb +0 -22
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
data/lib/bundler/source.rb
CHANGED
data/lib/bundler/source_list.rb
CHANGED
@@ -37,6 +37,10 @@ module Bundler
|
|
37
37
|
global_rubygems_source.multiple_remotes?
|
38
38
|
end
|
39
39
|
|
40
|
+
def implicit_global_source?
|
41
|
+
global_rubygems_source.no_remotes?
|
42
|
+
end
|
43
|
+
|
40
44
|
def add_path_source(options = {})
|
41
45
|
if options["gemspec"]
|
42
46
|
add_source_to_list Source::Gemspec.new(options), path_sources
|
@@ -94,7 +98,7 @@ module Bundler
|
|
94
98
|
end
|
95
99
|
|
96
100
|
def get(source)
|
97
|
-
source_list_for(source).find {|s|
|
101
|
+
source_list_for(source).find {|s| equivalent_source?(source, s) }
|
98
102
|
end
|
99
103
|
|
100
104
|
def lock_sources
|
@@ -102,14 +106,14 @@ module Bundler
|
|
102
106
|
end
|
103
107
|
|
104
108
|
def lock_other_sources
|
105
|
-
(path_sources + git_sources + plugin_sources).sort_by(&:
|
109
|
+
(path_sources + git_sources + plugin_sources).sort_by(&:identifier)
|
106
110
|
end
|
107
111
|
|
108
112
|
def lock_rubygems_sources
|
109
113
|
if merged_gem_lockfile_sections?
|
110
114
|
[combine_rubygems_sources]
|
111
115
|
else
|
112
|
-
rubygems_sources.sort_by(&:
|
116
|
+
rubygems_sources.sort_by(&:identifier)
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
@@ -117,7 +121,8 @@ module Bundler
|
|
117
121
|
def replace_sources!(replacement_sources)
|
118
122
|
return false if replacement_sources.empty?
|
119
123
|
|
120
|
-
@path_sources, @git_sources, @plugin_sources = map_sources(replacement_sources)
|
124
|
+
@rubygems_sources, @path_sources, @git_sources, @plugin_sources = map_sources(replacement_sources)
|
125
|
+
@global_rubygems_source = global_replacement_source(replacement_sources)
|
121
126
|
|
122
127
|
different_sources?(lock_sources, replacement_sources)
|
123
128
|
end
|
@@ -152,15 +157,23 @@ module Bundler
|
|
152
157
|
end
|
153
158
|
|
154
159
|
def map_sources(replacement_sources)
|
155
|
-
[path_sources, git_sources, plugin_sources].map do |sources|
|
160
|
+
[@rubygems_sources, @path_sources, @git_sources, @plugin_sources].map do |sources|
|
156
161
|
sources.map do |source|
|
157
162
|
replacement_sources.find {|s| s == source } || source
|
158
163
|
end
|
159
164
|
end
|
160
165
|
end
|
161
166
|
|
167
|
+
def global_replacement_source(replacement_sources)
|
168
|
+
replacement_source = replacement_sources.find {|s| s == global_rubygems_source }
|
169
|
+
return global_rubygems_source unless replacement_source
|
170
|
+
|
171
|
+
replacement_source.local!
|
172
|
+
replacement_source
|
173
|
+
end
|
174
|
+
|
162
175
|
def different_sources?(lock_sources, replacement_sources)
|
163
|
-
!
|
176
|
+
!equivalent_sources?(lock_sources, replacement_sources)
|
164
177
|
end
|
165
178
|
|
166
179
|
def rubygems_aggregate_class
|
@@ -197,34 +210,12 @@ module Bundler
|
|
197
210
|
end
|
198
211
|
end
|
199
212
|
|
200
|
-
def equal_sources?(lock_sources, replacement_sources)
|
201
|
-
lock_sources.sort_by(&:to_s) == replacement_sources.sort_by(&:to_s)
|
202
|
-
end
|
203
|
-
|
204
|
-
def equal_source?(source, other_source)
|
205
|
-
return source.include?(other_source) if source.is_a?(Source::Rubygems) && other_source.is_a?(Source::Rubygems) && !merged_gem_lockfile_sections?
|
206
|
-
|
207
|
-
source == other_source
|
208
|
-
end
|
209
|
-
|
210
|
-
def equivalent_source?(source, other_source)
|
211
|
-
return false unless Bundler.settings[:allow_deployment_source_credential_changes] && source.is_a?(Source::Rubygems)
|
212
|
-
|
213
|
-
equivalent_rubygems_sources?([source], [other_source])
|
214
|
-
end
|
215
|
-
|
216
213
|
def equivalent_sources?(lock_sources, replacement_sources)
|
217
|
-
|
218
|
-
|
219
|
-
lock_rubygems_sources, lock_other_sources = lock_sources.partition {|s| s.is_a?(Source::Rubygems) }
|
220
|
-
replacement_rubygems_sources, replacement_other_sources = replacement_sources.partition {|s| s.is_a?(Source::Rubygems) }
|
221
|
-
|
222
|
-
equivalent_rubygems_sources?(lock_rubygems_sources, replacement_rubygems_sources) && equal_sources?(lock_other_sources, replacement_other_sources)
|
214
|
+
lock_sources.sort_by(&:identifier) == replacement_sources.sort_by(&:identifier)
|
223
215
|
end
|
224
216
|
|
225
|
-
def
|
226
|
-
|
227
|
-
lock_sources.all? {|s| s.equivalent_remotes?(actual_remotes) }
|
217
|
+
def equivalent_source?(source, other_source)
|
218
|
+
source == other_source
|
228
219
|
end
|
229
220
|
end
|
230
221
|
end
|
data/lib/bundler/spec_set.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "vendored_tsort"
|
4
4
|
|
5
5
|
module Bundler
|
6
6
|
class SpecSet
|
@@ -11,7 +11,7 @@ module Bundler
|
|
11
11
|
@specs = specs
|
12
12
|
end
|
13
13
|
|
14
|
-
def for(dependencies, check = false, match_current_platform = false
|
14
|
+
def for(dependencies, check = false, match_current_platform = false)
|
15
15
|
handled = []
|
16
16
|
deps = dependencies.dup
|
17
17
|
specs = []
|
@@ -24,7 +24,7 @@ module Bundler
|
|
24
24
|
|
25
25
|
specs_for_dep = spec_for_dependency(dep, match_current_platform)
|
26
26
|
if specs_for_dep.any?
|
27
|
-
specs += specs_for_dep
|
27
|
+
match_current_platform ? specs += specs_for_dep : specs |= specs_for_dep
|
28
28
|
|
29
29
|
specs_for_dep.first.dependencies.each do |d|
|
30
30
|
next if d.type == :development
|
@@ -33,11 +33,6 @@ module Bundler
|
|
33
33
|
end
|
34
34
|
elsif check
|
35
35
|
return false
|
36
|
-
elsif raise_on_missing
|
37
|
-
others = lookup[dep.name] if match_current_platform
|
38
|
-
message = "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?"
|
39
|
-
message += " Found #{others.join(", ")} that did not match the current platform." if others && !others.empty?
|
40
|
-
raise GemNotFound, message
|
41
36
|
end
|
42
37
|
end
|
43
38
|
|
@@ -71,52 +66,35 @@ module Bundler
|
|
71
66
|
lookup.dup
|
72
67
|
end
|
73
68
|
|
74
|
-
def materialize(deps
|
75
|
-
materialized = self.for(deps, false, true
|
76
|
-
|
77
|
-
materialized.group_by(&:source).each do |source, specs|
|
78
|
-
next unless specs.any?{|s| s.is_a?(LazySpecification) }
|
79
|
-
|
80
|
-
source.local!
|
81
|
-
names = -> { specs.map(&:name).uniq }
|
82
|
-
source.double_check_for(names)
|
83
|
-
end
|
69
|
+
def materialize(deps)
|
70
|
+
materialized = self.for(deps, false, true)
|
84
71
|
|
85
72
|
materialized.map! do |s|
|
86
73
|
next s unless s.is_a?(LazySpecification)
|
87
|
-
|
88
|
-
|
89
|
-
unless missing_specs
|
90
|
-
raise GemNotFound, "Could not find #{s.full_name} in any of the sources"
|
91
|
-
end
|
92
|
-
missing_specs << s
|
93
|
-
end
|
94
|
-
spec
|
74
|
+
s.source.local!
|
75
|
+
s.__materialize__ || s
|
95
76
|
end
|
96
|
-
SpecSet.new(
|
77
|
+
SpecSet.new(materialized)
|
97
78
|
end
|
98
79
|
|
99
80
|
# Materialize for all the specs in the spec set, regardless of what platform they're for
|
100
81
|
# This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
|
101
82
|
# @return [Array<Gem::Specification>]
|
102
83
|
def materialized_for_all_platforms
|
103
|
-
@specs.group_by(&:source).each do |source, specs|
|
104
|
-
next unless specs.any?{|s| s.is_a?(LazySpecification) }
|
105
|
-
|
106
|
-
source.local!
|
107
|
-
source.remote!
|
108
|
-
names = -> { specs.map(&:name).uniq }
|
109
|
-
source.double_check_for(names)
|
110
|
-
end
|
111
|
-
|
112
84
|
@specs.map do |s|
|
113
85
|
next s unless s.is_a?(LazySpecification)
|
86
|
+
s.source.local!
|
87
|
+
s.source.remote!
|
114
88
|
spec = s.__materialize__
|
115
89
|
raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
|
116
90
|
spec
|
117
91
|
end
|
118
92
|
end
|
119
93
|
|
94
|
+
def missing_specs
|
95
|
+
@specs.select {|s| s.is_a?(LazySpecification) }
|
96
|
+
end
|
97
|
+
|
120
98
|
def merge(set)
|
121
99
|
arr = sorted.dup
|
122
100
|
set.each do |set_spec|
|
@@ -60,20 +60,20 @@ m = Module.new do
|
|
60
60
|
Regexp.last_match(1)
|
61
61
|
end
|
62
62
|
|
63
|
-
def
|
64
|
-
@
|
63
|
+
def bundler_requirement
|
64
|
+
@bundler_requirement ||=
|
65
65
|
env_var_version || cli_arg_version ||
|
66
|
-
lockfile_version
|
66
|
+
bundler_requirement_for(lockfile_version)
|
67
67
|
end
|
68
68
|
|
69
|
-
def
|
70
|
-
return "#{Gem::Requirement.default}.a" unless
|
69
|
+
def bundler_requirement_for(version)
|
70
|
+
return "#{Gem::Requirement.default}.a" unless version
|
71
71
|
|
72
|
-
bundler_gem_version = Gem::Version.new(
|
72
|
+
bundler_gem_version = Gem::Version.new(version)
|
73
73
|
|
74
74
|
requirement = bundler_gem_version.approximate_recommendation
|
75
75
|
|
76
|
-
return requirement unless Gem
|
76
|
+
return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
|
77
77
|
|
78
78
|
requirement += ".a" if bundler_gem_version.prerelease?
|
79
79
|
|
@@ -14,7 +14,10 @@ gem "rake-compiler"
|
|
14
14
|
|
15
15
|
gem "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>"
|
16
16
|
<%- end -%>
|
17
|
-
<%- if config[:
|
17
|
+
<%- if config[:linter] == "rubocop" -%>
|
18
18
|
|
19
|
-
gem "rubocop", "~> <%= config[:
|
19
|
+
gem "rubocop", "~> <%= config[:linter_version] %>"
|
20
|
+
<%- elsif config[:linter] == "standard" -%>
|
21
|
+
|
22
|
+
gem "standard", "~> <%= config[:linter_version] %>"
|
20
23
|
<%- end -%>
|
@@ -3,7 +3,16 @@
|
|
3
3
|
require "bundler/gem_tasks"
|
4
4
|
<% default_task_names = [config[:test_task]].compact -%>
|
5
5
|
<% case config[:test] -%>
|
6
|
-
<% when "minitest"
|
6
|
+
<% when "minitest" -%>
|
7
|
+
require "rake/testtask"
|
8
|
+
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << "test"
|
11
|
+
t.libs << "lib"
|
12
|
+
t.test_files = FileList["test/**/test_*.rb"]
|
13
|
+
end
|
14
|
+
|
15
|
+
<% when "test-unit" -%>
|
7
16
|
require "rake/testtask"
|
8
17
|
|
9
18
|
Rake::TestTask.new(:test) do |t|
|
@@ -18,12 +27,16 @@ require "rspec/core/rake_task"
|
|
18
27
|
RSpec::Core::RakeTask.new(:spec)
|
19
28
|
|
20
29
|
<% end -%>
|
21
|
-
<% if config[:
|
30
|
+
<% if config[:linter] == "rubocop" -%>
|
22
31
|
<% default_task_names << :rubocop -%>
|
23
32
|
require "rubocop/rake_task"
|
24
33
|
|
25
34
|
RuboCop::RakeTask.new
|
26
35
|
|
36
|
+
<% elsif config[:linter] == "standard" -%>
|
37
|
+
<% default_task_names << :standard -%>
|
38
|
+
require "standard/rake"
|
39
|
+
|
27
40
|
<% end -%>
|
28
41
|
<% if config[:ext] -%>
|
29
42
|
<% default_task_names.unshift(:clobber, :compile) -%>
|
@@ -1,16 +1,27 @@
|
|
1
1
|
name: Ruby
|
2
2
|
|
3
|
-
on:
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- <%= config[:git_default_branch] %>
|
7
|
+
|
8
|
+
pull_request:
|
4
9
|
|
5
10
|
jobs:
|
6
11
|
build:
|
7
12
|
runs-on: ubuntu-latest
|
13
|
+
name: Ruby ${{ matrix.ruby }}
|
14
|
+
strategy:
|
15
|
+
matrix:
|
16
|
+
ruby:
|
17
|
+
- '<%= RUBY_VERSION %>'
|
18
|
+
|
8
19
|
steps:
|
9
20
|
- uses: actions/checkout@v2
|
10
21
|
- name: Set up Ruby
|
11
22
|
uses: ruby/setup-ruby@v1
|
12
23
|
with:
|
13
|
-
ruby-version:
|
24
|
+
ruby-version: ${{ matrix.ruby }}
|
14
25
|
bundler-cache: true
|
15
26
|
- name: Run the default task
|
16
27
|
run: bundle exec rake
|
@@ -3,20 +3,20 @@
|
|
3
3
|
require_relative "lib/<%=config[:namespaced_path]%>/version"
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name
|
7
|
-
spec.version
|
8
|
-
spec.authors
|
9
|
-
spec.email
|
10
|
-
|
11
|
-
spec.summary
|
12
|
-
spec.description
|
13
|
-
spec.homepage
|
6
|
+
spec.name = <%= config[:name].inspect %>
|
7
|
+
spec.version = <%= config[:constant_name] %>::VERSION
|
8
|
+
spec.authors = [<%= config[:author].inspect %>]
|
9
|
+
spec.email = [<%= config[:email].inspect %>]
|
10
|
+
|
11
|
+
spec.summary = "TODO: Write a short summary, because RubyGems requires one."
|
12
|
+
spec.description = "TODO: Write a longer description or delete this line."
|
13
|
+
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
14
14
|
<%- if config[:mit] -%>
|
15
|
-
spec.license
|
15
|
+
spec.license = "MIT"
|
16
16
|
<%- end -%>
|
17
17
|
spec.required_ruby_version = ">= <%= config[:required_ruby_version] %>"
|
18
18
|
|
19
|
-
spec.metadata["allowed_push_host"] = "TODO: Set to 'https://
|
19
|
+
spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
20
20
|
|
21
21
|
spec.metadata["homepage_uri"] = spec.homepage
|
22
22
|
spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
@@ -25,18 +25,20 @@ Gem::Specification.new do |spec|
|
|
25
25
|
# Specify which files should be added to the gem when it is released.
|
26
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
27
27
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
28
|
-
`git ls-files -z`.split("\x0").reject
|
28
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
29
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
30
|
+
end
|
29
31
|
end
|
30
|
-
spec.bindir
|
31
|
-
spec.executables
|
32
|
+
spec.bindir = "exe"
|
33
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
32
34
|
spec.require_paths = ["lib"]
|
33
35
|
<%- if config[:ext] -%>
|
34
|
-
spec.extensions
|
36
|
+
spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"]
|
35
37
|
<%- end -%>
|
36
38
|
|
37
39
|
# Uncomment to register a new dependency of your gem
|
38
40
|
# spec.add_dependency "example-gem", "~> 1.0"
|
39
41
|
|
40
|
-
# For more information and examples about making a new gem,
|
42
|
+
# For more information and examples about making a new gem, check out our
|
41
43
|
# guide at: https://bundler.io/guides/creating_gem.html
|
42
44
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%- config[:constant_array].each_with_index do |c, i| -%>
|
2
|
+
<%= " " * i %>module <%= c %>
|
3
|
+
<%- end -%>
|
4
|
+
<%= " " * config[:constant_array].size %>VERSION: String
|
5
|
+
<%= " " * config[:constant_array].size %># See the writing guide of rbs: https://github.com/ruby/rbs#guides
|
6
|
+
<%- (config[:constant_array].size-1).downto(0) do |i| -%>
|
7
|
+
<%= " " * i %>end
|
8
|
+
<%- end -%>
|
data/lib/bundler/ui/shell.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
# Vendored files do not need to be documented
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Mike Perham
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,13 +1,3 @@
|
|
1
|
-
require 'thread'
|
2
|
-
require 'timeout'
|
3
|
-
require_relative 'monotonic_time'
|
4
|
-
|
5
|
-
##
|
6
|
-
# Raised when you attempt to retrieve a connection from a pool that has been
|
7
|
-
# shut down.
|
8
|
-
|
9
|
-
class Bundler::ConnectionPool::PoolShuttingDownError < RuntimeError; end
|
10
|
-
|
11
1
|
##
|
12
2
|
# The TimedStack manages a pool of homogeneous connections (or any resource
|
13
3
|
# you wish to manage). Connections are created lazily up to a given maximum
|
@@ -25,7 +15,7 @@ class Bundler::ConnectionPool::PoolShuttingDownError < RuntimeError; end
|
|
25
15
|
#
|
26
16
|
# conn = ts.pop
|
27
17
|
# ts.pop timeout: 5
|
28
|
-
# #=> raises
|
18
|
+
# #=> raises Bundler::ConnectionPool::TimeoutError after 5 seconds
|
29
19
|
|
30
20
|
class Bundler::ConnectionPool::TimedStack
|
31
21
|
attr_reader :max
|
@@ -39,8 +29,8 @@ class Bundler::ConnectionPool::TimedStack
|
|
39
29
|
@created = 0
|
40
30
|
@que = []
|
41
31
|
@max = size
|
42
|
-
@mutex = Mutex.new
|
43
|
-
@resource = ConditionVariable.new
|
32
|
+
@mutex = Thread::Mutex.new
|
33
|
+
@resource = Thread::ConditionVariable.new
|
44
34
|
@shutdown_block = nil
|
45
35
|
end
|
46
36
|
|
@@ -59,12 +49,12 @@ class Bundler::ConnectionPool::TimedStack
|
|
59
49
|
@resource.broadcast
|
60
50
|
end
|
61
51
|
end
|
62
|
-
|
52
|
+
alias << push
|
63
53
|
|
64
54
|
##
|
65
55
|
# Retrieves a connection from the stack. If a connection is available it is
|
66
56
|
# immediately returned. If no connection is available within the given
|
67
|
-
# timeout a
|
57
|
+
# timeout a Bundler::ConnectionPool::TimeoutError is raised.
|
68
58
|
#
|
69
59
|
# +:timeout+ is the only checked entry in +options+ and is preferred over
|
70
60
|
# the +timeout+ argument (which will be removed in a future release). Other
|
@@ -74,7 +64,7 @@ class Bundler::ConnectionPool::TimedStack
|
|
74
64
|
options, timeout = timeout, 0.5 if Hash === timeout
|
75
65
|
timeout = options.fetch :timeout, timeout
|
76
66
|
|
77
|
-
deadline =
|
67
|
+
deadline = current_time + timeout
|
78
68
|
@mutex.synchronize do
|
79
69
|
loop do
|
80
70
|
raise Bundler::ConnectionPool::PoolShuttingDownError if @shutdown_block
|
@@ -83,18 +73,20 @@ class Bundler::ConnectionPool::TimedStack
|
|
83
73
|
connection = try_create(options)
|
84
74
|
return connection if connection
|
85
75
|
|
86
|
-
to_wait = deadline -
|
87
|
-
raise
|
76
|
+
to_wait = deadline - current_time
|
77
|
+
raise Bundler::ConnectionPool::TimeoutError, "Waited #{timeout} sec" if to_wait <= 0
|
88
78
|
@resource.wait(@mutex, to_wait)
|
89
79
|
end
|
90
80
|
end
|
91
81
|
end
|
92
82
|
|
93
83
|
##
|
94
|
-
# Shuts down the TimedStack
|
95
|
-
#
|
84
|
+
# Shuts down the TimedStack by passing each connection to +block+ and then
|
85
|
+
# removing it from the pool. Attempting to checkout a connection after
|
86
|
+
# shutdown will raise +Bundler::ConnectionPool::PoolShuttingDownError+ unless
|
87
|
+
# +:reload+ is +true+.
|
96
88
|
|
97
|
-
def shutdown(&block)
|
89
|
+
def shutdown(reload: false, &block)
|
98
90
|
raise ArgumentError, "shutdown must receive a block" unless block_given?
|
99
91
|
|
100
92
|
@mutex.synchronize do
|
@@ -102,6 +94,7 @@ class Bundler::ConnectionPool::TimedStack
|
|
102
94
|
@resource.broadcast
|
103
95
|
|
104
96
|
shutdown_connections
|
97
|
+
@shutdown_block = nil if reload
|
105
98
|
end
|
106
99
|
end
|
107
100
|
|
@@ -121,6 +114,10 @@ class Bundler::ConnectionPool::TimedStack
|
|
121
114
|
|
122
115
|
private
|
123
116
|
|
117
|
+
def current_time
|
118
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
119
|
+
end
|
120
|
+
|
124
121
|
##
|
125
122
|
# This is an extension point for TimedStack and is called with a mutex.
|
126
123
|
#
|
@@ -149,6 +146,7 @@ class Bundler::ConnectionPool::TimedStack
|
|
149
146
|
conn = fetch_connection(options)
|
150
147
|
@shutdown_block.call(conn)
|
151
148
|
end
|
149
|
+
@created = 0
|
152
150
|
end
|
153
151
|
|
154
152
|
##
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Bundler::ConnectionPool
|
2
|
+
class Wrapper < ::BasicObject
|
3
|
+
METHODS = [:with, :pool_shutdown, :wrapped_pool]
|
4
|
+
|
5
|
+
def initialize(options = {}, &block)
|
6
|
+
@pool = options.fetch(:pool) { ::Bundler::ConnectionPool.new(options, &block) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def wrapped_pool
|
10
|
+
@pool
|
11
|
+
end
|
12
|
+
|
13
|
+
def with(&block)
|
14
|
+
@pool.with(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def pool_shutdown(&block)
|
18
|
+
@pool.shutdown(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def pool_size
|
22
|
+
@pool.size
|
23
|
+
end
|
24
|
+
|
25
|
+
def pool_available
|
26
|
+
@pool.available
|
27
|
+
end
|
28
|
+
|
29
|
+
def respond_to?(id, *args)
|
30
|
+
METHODS.include?(id) || with { |c| c.respond_to?(id, *args) }
|
31
|
+
end
|
32
|
+
|
33
|
+
# rubocop:disable Style/MethodMissingSuper
|
34
|
+
# rubocop:disable Style/MissingRespondToMissing
|
35
|
+
if ::RUBY_VERSION >= "3.0.0"
|
36
|
+
def method_missing(name, *args, **kwargs, &block)
|
37
|
+
with do |connection|
|
38
|
+
connection.send(name, *args, **kwargs, &block)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
elsif ::RUBY_VERSION >= "2.7.0"
|
42
|
+
ruby2_keywords def method_missing(name, *args, &block)
|
43
|
+
with do |connection|
|
44
|
+
connection.send(name, *args, &block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
else
|
48
|
+
def method_missing(name, *args, &block)
|
49
|
+
with do |connection|
|
50
|
+
connection.send(name, *args, &block)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
# rubocop:enable Style/MethodMissingSuper
|
55
|
+
# rubocop:enable Style/MissingRespondToMissing
|
56
|
+
end
|
57
|
+
end
|