Class: Bundler::RubygemsIntegration
- Inherits:
-
Object
- Object
- Bundler::RubygemsIntegration
show all
- Defined in:
- lib/bundler/rubygems_integration.rb
Defined Under Namespace
Classes: AlmostModern, Ancient, Future, Legacy, Modern, MoreModern, Transitional
Class Method Summary
collapse
Instance Method Summary
collapse
-
#backport_base_dir ⇒ Object
This backports base_dir which replaces installation path Rubygems 1.8+.
-
#backport_cache_file ⇒ Object
-
#backport_segment_generation ⇒ Object
This backports the correct segment generation code from Rubygems 1.4+ by monkeypatching it into the method in Rubygems 1.3.6 and 1.3.7.
-
#backport_spec_file ⇒ Object
-
#backport_yaml_initialize ⇒ Object
This backport fixes the marshaling of @segments.
-
#bin_path(gem, bin, ver) ⇒ Object
-
#build(spec, skip_validation = false) ⇒ Object
-
#build_args ⇒ Object
-
#build_args=(args) ⇒ Object
-
#build_gem(gem_dir, spec) ⇒ Object
-
#clear_paths ⇒ Object
-
#config_map ⇒ Object
-
#configuration ⇒ Object
-
#download_gem(spec, uri, path) ⇒ Object
-
#fetch_all_remote_specs ⇒ Object
-
#fetch_prerelease_specs ⇒ Object
-
#fetch_specs(all, pre, &blk) ⇒ Object
-
#gem_bindir ⇒ Object
-
#gem_cache ⇒ Object
-
#gem_dir ⇒ Object
-
#gem_from_path(path, policy = nil) ⇒ Object
-
#gem_path ⇒ Object
-
#inflate(obj) ⇒ Object
-
#loaded_specs(name) ⇒ Object
-
#mark_loaded(spec) ⇒ Object
-
#marshal_spec_dir ⇒ Object
-
#path(obj) ⇒ Object
-
#platforms ⇒ Object
-
#preserve_paths ⇒ Object
-
#provides?(req_str) ⇒ Boolean
-
#read_binary(path) ⇒ Object
-
#redefine_method(klass, method, &block) ⇒ Object
-
#replace_bin_path(specs) ⇒ Object
Used to make bin stubs that are not created by bundler work under bundler.
-
#replace_entrypoints(specs) ⇒ Object
Replace or hook into Rubygems to provide a bundlerized view of the world.
-
#replace_gem(specs) ⇒ Object
-
#replace_refresh ⇒ Object
Because Bundler has a static view of what specs are available, we don’t #refresh, so stub it out.
-
#repository_subdirectories ⇒ Object
-
#reverse_rubygems_kernel_mixin ⇒ Object
-
#ruby_engine ⇒ Object
-
#security_policies ⇒ Object
-
#security_policy_keys ⇒ Object
-
#sources ⇒ Object
-
#sources=(val) ⇒ Object
-
#spec_cache_dirs ⇒ Object
-
#spec_from_gem(path, policy = nil) ⇒ Object
-
#stub_source_index(specs) ⇒ Object
-
#ui=(obj) ⇒ Object
-
#user_home ⇒ Object
-
#version ⇒ Object
-
#with_build_args(args) ⇒ Object
Class Method Details
.provides?(req_str) ⇒ Boolean
11
12
13
|
# File 'lib/bundler/rubygems_integration.rb', line 11
def self.provides?(req_str)
Gem::Requirement.new(req_str).satisfied_by?(version)
end
|
.version ⇒ Object
7
8
9
|
# File 'lib/bundler/rubygems_integration.rb', line 7
def self.version
@version ||= Gem::Version.new(Gem::VERSION)
end
|
Instance Method Details
#backport_base_dir ⇒ Object
This backports base_dir which replaces installation path Rubygems 1.8+
367
368
369
370
371
372
|
# File 'lib/bundler/rubygems_integration.rb', line 367
def backport_base_dir
redefine_method(Gem::Specification, :base_dir) do
return Gem.dir unless loaded_from
File.dirname File.dirname loaded_from
end
end
|
#backport_cache_file ⇒ Object
374
375
376
377
378
379
380
381
382
|
# File 'lib/bundler/rubygems_integration.rb', line 374
def backport_cache_file
redefine_method(Gem::Specification, :cache_dir) do
@cache_dir ||= File.join base_dir, "cache"
end
redefine_method(Gem::Specification, :cache_file) do
@cache_file ||= File.join cache_dir, "#{full_name}.gem"
end
end
|
#backport_segment_generation ⇒ Object
This backports the correct segment generation code from Rubygems 1.4+ by monkeypatching it into the method in Rubygems 1.3.6 and 1.3.7.
348
349
350
351
352
353
354
|
# File 'lib/bundler/rubygems_integration.rb', line 348
def backport_segment_generation
redefine_method(Gem::Version, :segments) do
@segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
/^\d+$/ =~ s ? s.to_i : s
end
end
end
|
#backport_spec_file ⇒ Object
384
385
386
387
388
389
390
391
392
|
# File 'lib/bundler/rubygems_integration.rb', line 384
def backport_spec_file
redefine_method(Gem::Specification, :spec_dir) do
@spec_dir ||= File.join base_dir, "specifications"
end
redefine_method(Gem::Specification, :spec_file) do
@spec_file ||= File.join spec_dir, "#{full_name}.gemspec"
end
end
|
#backport_yaml_initialize ⇒ Object
This backport fixes the marshaling of @segments.
357
358
359
360
361
362
363
|
# File 'lib/bundler/rubygems_integration.rb', line 357
def backport_yaml_initialize
redefine_method(Gem::Version, :yaml_initialize) do |tag, map|
@version = map['version']
@segments = nil
@hash = nil
end
end
|
#bin_path(gem, bin, ver) ⇒ Object
124
125
126
|
# File 'lib/bundler/rubygems_integration.rb', line 124
def bin_path(gem, bin, ver)
Gem.bin_path(gem, bin, ver)
end
|
#build(spec, skip_validation = false) ⇒ Object
190
191
192
193
|
# File 'lib/bundler/rubygems_integration.rb', line 190
def build(spec, skip_validation = false)
require 'rubygems/builder'
Gem::Builder.new(spec).build
end
|
#build_args ⇒ Object
23
24
25
|
# File 'lib/bundler/rubygems_integration.rb', line 23
def build_args
Gem::Command.build_args
end
|
#build_args=(args) ⇒ Object
27
28
29
|
# File 'lib/bundler/rubygems_integration.rb', line 27
def build_args=(args)
Gem::Command.build_args = args
end
|
#build_gem(gem_dir, spec) ⇒ Object
195
196
197
|
# File 'lib/bundler/rubygems_integration.rb', line 195
def build_gem(gem_dir, spec)
SharedHelpers.chdir(gem_dir) { build(spec) }
end
|
#clear_paths ⇒ Object
120
121
122
|
# File 'lib/bundler/rubygems_integration.rb', line 120
def clear_paths
Gem.clear_paths
end
|
#config_map ⇒ Object
112
113
114
|
# File 'lib/bundler/rubygems_integration.rb', line 112
def config_map
Gem::ConfigMap
end
|
#configuration ⇒ Object
47
48
49
50
51
52
53
|
# File 'lib/bundler/rubygems_integration.rb', line 47
def configuration
Gem.configuration
rescue Gem::SystemExitException => e
Bundler.ui.error "#{e.class}: #{e.message}"
Bundler.ui.trace e
raise Gem::SystemExitException
end
|
#download_gem(spec, uri, path) ⇒ Object
199
200
201
202
203
|
# File 'lib/bundler/rubygems_integration.rb', line 199
def download_gem(spec, uri, path)
uri = Bundler::Source.mirror_for(uri)
fetcher = Gem::RemoteFetcher.new(configuration[:http_proxy])
fetcher.download(spec, uri, path)
end
|
#fetch_all_remote_specs ⇒ Object
149
150
151
152
153
154
155
156
|
# File 'lib/bundler/rubygems_integration.rb', line 149
def fetch_all_remote_specs
spec_list = fetch_specs(true, false)
fetch_prerelease_specs.each {|k, v| spec_list[k] += v }
return spec_list
end
|
#fetch_prerelease_specs ⇒ Object
143
144
145
146
147
|
# File 'lib/bundler/rubygems_integration.rb', line 143
def fetch_prerelease_specs
fetch_specs(false, true)
rescue Gem::RemoteFetcher::FetchError
[]
end
|
#fetch_specs(all, pre, &blk) ⇒ Object
137
138
139
140
141
|
# File 'lib/bundler/rubygems_integration.rb', line 137
def fetch_specs(all, pre, &blk)
specs = Gem::SpecFetcher.new.list(all, pre)
specs.each { yield } if block_given?
specs
end
|
#gem_bindir ⇒ Object
84
85
86
|
# File 'lib/bundler/rubygems_integration.rb', line 84
def gem_bindir
Gem.bindir
end
|
#gem_cache ⇒ Object
96
97
98
|
# File 'lib/bundler/rubygems_integration.rb', line 96
def gem_cache
gem_path.map{|p| File.expand_path("cache", p) }
end
|
#gem_dir ⇒ Object
80
81
82
|
# File 'lib/bundler/rubygems_integration.rb', line 80
def gem_dir
Gem.dir
end
|
#gem_from_path(path, policy = nil) ⇒ Object
168
169
170
171
|
# File 'lib/bundler/rubygems_integration.rb', line 168
def gem_from_path(path, policy = nil)
require 'rubygems/format'
Gem::Format.from_file_by_path(path, policy)
end
|
#gem_path ⇒ Object
92
93
94
|
# File 'lib/bundler/rubygems_integration.rb', line 92
def gem_path
Gem.path
end
|
#inflate(obj) ⇒ Object
63
64
65
|
# File 'lib/bundler/rubygems_integration.rb', line 63
def inflate(obj)
Gem.inflate(obj)
end
|
#loaded_specs(name) ⇒ Object
31
32
33
|
# File 'lib/bundler/rubygems_integration.rb', line 31
def loaded_specs(name)
Gem.loaded_specs[name]
end
|
#mark_loaded(spec) ⇒ Object
35
36
37
|
# File 'lib/bundler/rubygems_integration.rb', line 35
def mark_loaded(spec)
Gem.loaded_specs[spec.name] = spec
end
|
#marshal_spec_dir ⇒ Object
108
109
110
|
# File 'lib/bundler/rubygems_integration.rb', line 108
def marshal_spec_dir
Gem::MARSHAL_SPEC_DIR
end
|
#path(obj) ⇒ Object
39
40
41
|
# File 'lib/bundler/rubygems_integration.rb', line 39
def path(obj)
obj.to_s
end
|
43
44
45
|
# File 'lib/bundler/rubygems_integration.rb', line 43
def platforms
Gem.platforms
end
|
#preserve_paths ⇒ Object
128
129
130
131
|
# File 'lib/bundler/rubygems_integration.rb', line 128
def preserve_paths
yield
end
|
#provides?(req_str) ⇒ Boolean
19
20
21
|
# File 'lib/bundler/rubygems_integration.rb', line 19
def provides?(req_str)
self.class.provides?(req_str)
end
|
#read_binary(path) ⇒ Object
59
60
61
|
# File 'lib/bundler/rubygems_integration.rb', line 59
def read_binary(path)
Gem.read_binary(path)
end
|
#redefine_method(klass, method, &block) ⇒ Object
394
395
396
397
398
399
|
# File 'lib/bundler/rubygems_integration.rb', line 394
def redefine_method(klass, method, &block)
if klass.instance_methods(false).include?(method)
klass.send(:remove_method, method)
end
klass.send(:define_method, method, &block)
end
|
#replace_bin_path(specs) ⇒ Object
Used to make bin stubs that are not created by bundler work under bundler. The new Gem.bin_path only considers gems in specs
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
# File 'lib/bundler/rubygems_integration.rb', line 296
def replace_bin_path(specs)
gem_class = (class << Gem ; self ; end)
redefine_method(gem_class, :bin_path) do |name, *args|
exec_name = args.first
if exec_name == 'bundle'
return ENV['BUNDLE_BIN_PATH']
end
spec = nil
if exec_name
spec = specs.find { |s| s.executables.include?(exec_name) }
unless spec.name == name
warn "Bundler is using a binstub that was created for a different gem.\n" \
"This is deprecated, in future versions you may need to `bundle binstub #{name}` " \
"to work around a system/bundle conflict."
end
spec or raise Gem::Exception, "can't find executable #{exec_name}"
else
spec = specs.find { |s| s.name == name }
exec_name = spec.default_executable or raise Gem::Exception, "no default executable for #{spec.full_name}"
end
gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name)
gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name)
File.exist?(gem_bin) ? gem_bin : gem_from_path_bin
end
end
|
#replace_entrypoints(specs) ⇒ Object
Replace or hook into Rubygems to provide a bundlerized view of the world.
335
336
337
338
339
340
341
342
343
344
|
# File 'lib/bundler/rubygems_integration.rb', line 335
def replace_entrypoints(specs)
replace_gem(specs)
stub_rubygems(specs)
replace_bin_path(specs)
replace_refresh
Gem.clear_paths
end
|
#replace_gem(specs) ⇒ Object
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
|
# File 'lib/bundler/rubygems_integration.rb', line 230
def replace_gem(specs)
reverse_rubygems_kernel_mixin
executables = specs.map { |s| s.executables }.flatten
::Kernel.send(:define_method, :gem) do |dep, *reqs|
if executables.include? File.basename(caller.first.split(':').first)
return
end
reqs.pop if reqs.last.is_a?(Hash)
unless dep.respond_to?(:name) && dep.respond_to?(:requirement)
dep = Gem::Dependency.new(dep, reqs)
end
spec = specs.find { |s| s.name == dep.name }
if spec.nil?
e = Gem::LoadError.new "#{dep.name} is not part of the bundle. Add it to Gemfile."
e.name = dep.name
if e.respond_to?(:requirement=)
e.requirement = dep.requirement
else
e.version_requirement = dep.requirement
end
raise e
elsif dep !~ spec
e = Gem::LoadError.new "can't activate #{dep}, already activated #{spec.full_name}. " \
"Make sure all dependencies are added to Gemfile."
e.name = dep.name
if e.respond_to?(:requirement=)
e.requirement = dep.requirement
else
e.version_requirement = dep.requirement
end
raise e
end
true
end
end
|
#replace_refresh ⇒ Object
Because Bundler has a static view of what specs are available, we don’t #refresh, so stub it out.
328
329
330
331
|
# File 'lib/bundler/rubygems_integration.rb', line 328
def replace_refresh
gem_class = (class << Gem ; self ; end)
redefine_method(gem_class, :refresh) { }
end
|
#repository_subdirectories ⇒ Object
116
117
118
|
# File 'lib/bundler/rubygems_integration.rb', line 116
def repository_subdirectories
%w[cache doc gems specifications]
end
|
#reverse_rubygems_kernel_mixin ⇒ Object
218
219
220
221
222
223
224
225
226
227
228
|
# File 'lib/bundler/rubygems_integration.rb', line 218
def reverse_rubygems_kernel_mixin
::Kernel.class_eval do
if private_method_defined?(:gem_original_require)
alias rubygems_require require
alias require gem_original_require
end
undef gem
end
end
|
#ruby_engine ⇒ Object
55
56
57
|
# File 'lib/bundler/rubygems_integration.rb', line 55
def ruby_engine
Gem.ruby_engine
end
|
#security_policies ⇒ Object
209
210
211
212
213
214
215
216
|
# File 'lib/bundler/rubygems_integration.rb', line 209
def security_policies
@security_policies ||= begin
require 'rubygems/security'
Gem::Security::Policies
rescue LoadError, NameError
{}
end
end
|
#security_policy_keys ⇒ Object
205
206
207
|
# File 'lib/bundler/rubygems_integration.rb', line 205
def security_policy_keys
%w{High Medium Low AlmostNo No}.map { |level| "#{level}Security" }
end
|
#sources ⇒ Object
76
77
78
|
# File 'lib/bundler/rubygems_integration.rb', line 76
def sources
Gem.sources
end
|
#sources=(val) ⇒ Object
67
68
69
70
71
72
73
74
|
# File 'lib/bundler/rubygems_integration.rb', line 67
def sources=(val)
configuration
Gem.sources = val
end
|
#spec_cache_dirs ⇒ Object
100
101
102
103
104
105
106
|
# File 'lib/bundler/rubygems_integration.rb', line 100
def spec_cache_dirs
@spec_cache_dirs ||= begin
dirs = gem_path.map {|dir| File.join(dir, 'specifications')}
dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir)
dirs.uniq.select {|dir| File.directory? dir}
end
end
|
#spec_from_gem(path, policy = nil) ⇒ Object
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
# File 'lib/bundler/rubygems_integration.rb', line 173
def spec_from_gem(path, policy = nil)
require 'rubygems/security'
gem_from_path(path, security_policies[policy]).spec
rescue Gem::Package::FormatError
raise GemspecError, "Could not read gem at #{path}. It may be corrupted."
rescue Exception, Gem::Exception, Gem::Security::Exception => e
if e.is_a?(Gem::Security::Exception) ||
e.message =~ /unknown trust policy|unsigned gem/i ||
e.message =~ /couldn't verify (meta)?data signature/i
raise SecurityError,
"The gem #{File.basename(path, '.gem')} can't be installed because " \
"the security policy didn't allow it, with the message: #{e.message}"
else
raise e
end
end
|
#stub_source_index(specs) ⇒ Object
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
# File 'lib/bundler/rubygems_integration.rb', line 273
def stub_source_index(specs)
Gem::SourceIndex.send(:alias_method, :old_initialize, :initialize)
redefine_method(Gem::SourceIndex, :initialize) do |*args|
@gems = {}
Deprecate.skip_during do
self.spec_dirs = *args
add_specs(*specs)
end
end
end
|
#ui=(obj) ⇒ Object
133
134
135
|
# File 'lib/bundler/rubygems_integration.rb', line 133
def ui=(obj)
Gem::DefaultUserInteraction.ui = obj
end
|
#user_home ⇒ Object
88
89
90
|
# File 'lib/bundler/rubygems_integration.rb', line 88
def user_home
Gem.user_home
end
|
#version ⇒ Object
15
16
17
|
# File 'lib/bundler/rubygems_integration.rb', line 15
def version
self.class.version
end
|
#with_build_args(args) ⇒ Object
158
159
160
161
162
163
164
165
166
|
# File 'lib/bundler/rubygems_integration.rb', line 158
def with_build_args(args)
old_args = self.build_args
begin
self.build_args = args
yield
ensure
self.build_args = old_args
end
end
|