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, MoreFuture, MoreModern, Transitional
Constant Summary
collapse
- EXT_LOCK =
Monitor.new
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
-
#ext_lock ⇒ 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_gem_paths ⇒ 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
-
#validate(spec) ⇒ Object
-
#version ⇒ Object
-
#with_build_args(args) ⇒ Object
Class Method Details
.provides?(req_str) ⇒ Boolean
17
18
19
|
# File 'lib/bundler/rubygems_integration.rb', line 17
def self.provides?(req_str)
Gem::Requirement.new(req_str).satisfied_by?(version)
end
|
.version ⇒ Object
13
14
15
|
# File 'lib/bundler/rubygems_integration.rb', line 13
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+
403
404
405
406
407
408
|
# File 'lib/bundler/rubygems_integration.rb', line 403
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
410
411
412
413
414
415
416
417
418
|
# File 'lib/bundler/rubygems_integration.rb', line 410
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.
384
385
386
387
388
389
390
|
# File 'lib/bundler/rubygems_integration.rb', line 384
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
420
421
422
423
424
425
426
427
428
|
# File 'lib/bundler/rubygems_integration.rb', line 420
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.
393
394
395
396
397
398
399
|
# File 'lib/bundler/rubygems_integration.rb', line 393
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
141
142
143
|
# File 'lib/bundler/rubygems_integration.rb', line 141
def bin_path(gem, bin, ver)
Gem.bin_path(gem, bin, ver)
end
|
#build(spec, skip_validation = false) ⇒ Object
226
227
228
229
|
# File 'lib/bundler/rubygems_integration.rb', line 226
def build(spec, skip_validation = false)
require 'rubygems/builder'
Gem::Builder.new(spec).build
end
|
#build_args ⇒ Object
29
30
31
|
# File 'lib/bundler/rubygems_integration.rb', line 29
def build_args
Gem::Command.build_args
end
|
#build_args=(args) ⇒ Object
33
34
35
|
# File 'lib/bundler/rubygems_integration.rb', line 33
def build_args=(args)
Gem::Command.build_args = args
end
|
#build_gem(gem_dir, spec) ⇒ Object
231
232
233
|
# File 'lib/bundler/rubygems_integration.rb', line 231
def build_gem(gem_dir, spec)
build(spec)
end
|
#clear_paths ⇒ Object
137
138
139
|
# File 'lib/bundler/rubygems_integration.rb', line 137
def clear_paths
Gem.clear_paths
end
|
#config_map ⇒ Object
129
130
131
|
# File 'lib/bundler/rubygems_integration.rb', line 129
def config_map
Gem::ConfigMap
end
|
#configuration ⇒ Object
64
65
66
67
68
69
70
|
# File 'lib/bundler/rubygems_integration.rb', line 64
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
235
236
237
238
239
|
# File 'lib/bundler/rubygems_integration.rb', line 235
def download_gem(spec, uri, path)
uri = Bundler.settings.mirror_for(uri)
fetcher = Gem::RemoteFetcher.new(configuration[:http_proxy])
fetcher.download(spec, uri, path)
end
|
#ext_lock ⇒ Object
167
168
169
|
# File 'lib/bundler/rubygems_integration.rb', line 167
def ext_lock
EXT_LOCK
end
|
#fetch_all_remote_specs ⇒ Object
183
184
185
186
187
188
189
190
|
# File 'lib/bundler/rubygems_integration.rb', line 183
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
177
178
179
180
181
|
# File 'lib/bundler/rubygems_integration.rb', line 177
def fetch_prerelease_specs
fetch_specs(false, true)
rescue Gem::RemoteFetcher::FetchError
[] end
|
#fetch_specs(all, pre, &blk) ⇒ Object
171
172
173
174
175
|
# File 'lib/bundler/rubygems_integration.rb', line 171
def fetch_specs(all, pre, &blk)
specs = Gem::SpecFetcher.new.list(all, pre)
specs.each { yield } if block_given?
specs
end
|
#gem_bindir ⇒ Object
101
102
103
|
# File 'lib/bundler/rubygems_integration.rb', line 101
def gem_bindir
Gem.bindir
end
|
#gem_cache ⇒ Object
113
114
115
|
# File 'lib/bundler/rubygems_integration.rb', line 113
def gem_cache
gem_path.map{|p| File.expand_path("cache", p) }
end
|
#gem_dir ⇒ Object
97
98
99
|
# File 'lib/bundler/rubygems_integration.rb', line 97
def gem_dir
Gem.dir
end
|
#gem_from_path(path, policy = nil) ⇒ Object
204
205
206
207
|
# File 'lib/bundler/rubygems_integration.rb', line 204
def gem_from_path(path, policy = nil)
require 'rubygems/format'
Gem::Format.from_file_by_path(path, policy)
end
|
#gem_path ⇒ Object
109
110
111
|
# File 'lib/bundler/rubygems_integration.rb', line 109
def gem_path
Gem.path
end
|
#inflate(obj) ⇒ Object
80
81
82
|
# File 'lib/bundler/rubygems_integration.rb', line 80
def inflate(obj)
Gem.inflate(obj)
end
|
#loaded_gem_paths ⇒ Object
150
151
152
153
154
155
156
157
158
159
160
161
|
# File 'lib/bundler/rubygems_integration.rb', line 150
def loaded_gem_paths
if Gem::Specification.method_defined? :full_require_paths
loaded_gem_paths = Gem.loaded_specs.map {|n, s| s.full_require_paths}
loaded_gem_paths.flatten
else
$LOAD_PATH.select do |p|
Bundler.rubygems.gem_path.any?{|gp| p =~ /^#{Regexp.escape(gp)}/ }
end
end
end
|
#loaded_specs(name) ⇒ Object
37
38
39
|
# File 'lib/bundler/rubygems_integration.rb', line 37
def loaded_specs(name)
Gem.loaded_specs[name]
end
|
#mark_loaded(spec) ⇒ Object
41
42
43
44
45
46
47
48
|
# File 'lib/bundler/rubygems_integration.rb', line 41
def mark_loaded(spec)
if spec.respond_to?(:activated=)
current = Gem.loaded_specs[spec.name]
current.activated = false if current
spec.activated = true
end
Gem.loaded_specs[spec.name] = spec
end
|
#marshal_spec_dir ⇒ Object
125
126
127
|
# File 'lib/bundler/rubygems_integration.rb', line 125
def marshal_spec_dir
Gem::MARSHAL_SPEC_DIR
end
|
#path(obj) ⇒ Object
56
57
58
|
# File 'lib/bundler/rubygems_integration.rb', line 56
def path(obj)
obj.to_s
end
|
60
61
62
|
# File 'lib/bundler/rubygems_integration.rb', line 60
def platforms
Gem.platforms
end
|
#preserve_paths ⇒ Object
145
146
147
148
|
# File 'lib/bundler/rubygems_integration.rb', line 145
def preserve_paths
yield
end
|
#provides?(req_str) ⇒ Boolean
25
26
27
|
# File 'lib/bundler/rubygems_integration.rb', line 25
def provides?(req_str)
self.class.provides?(req_str)
end
|
#read_binary(path) ⇒ Object
76
77
78
|
# File 'lib/bundler/rubygems_integration.rb', line 76
def read_binary(path)
Gem.read_binary(path)
end
|
#redefine_method(klass, method, &block) ⇒ Object
430
431
432
433
434
435
|
# File 'lib/bundler/rubygems_integration.rb', line 430
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
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
# File 'lib/bundler/rubygems_integration.rb', line 332
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) }
spec or raise Gem::Exception, "can't find executable #{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
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.
371
372
373
374
375
376
377
378
379
380
|
# File 'lib/bundler/rubygems_integration.rb', line 371
def replace_entrypoints(specs)
replace_gem(specs)
stub_rubygems(specs)
replace_bin_path(specs)
replace_refresh
Gem.clear_paths
end
|
#replace_gem(specs) ⇒ Object
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
# File 'lib/bundler/rubygems_integration.rb', line 266
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.
364
365
366
367
|
# File 'lib/bundler/rubygems_integration.rb', line 364
def replace_refresh
gem_class = (class << Gem ; self ; end)
redefine_method(gem_class, :refresh) { }
end
|
#repository_subdirectories ⇒ Object
133
134
135
|
# File 'lib/bundler/rubygems_integration.rb', line 133
def repository_subdirectories
%w[cache doc gems specifications]
end
|
#reverse_rubygems_kernel_mixin ⇒ Object
254
255
256
257
258
259
260
261
262
263
264
|
# File 'lib/bundler/rubygems_integration.rb', line 254
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
72
73
74
|
# File 'lib/bundler/rubygems_integration.rb', line 72
def ruby_engine
Gem.ruby_engine
end
|
#security_policies ⇒ Object
245
246
247
248
249
250
251
252
|
# File 'lib/bundler/rubygems_integration.rb', line 245
def security_policies
@security_policies ||= begin
require 'rubygems/security'
Gem::Security::Policies
rescue LoadError, NameError
{}
end
end
|
#security_policy_keys ⇒ Object
241
242
243
|
# File 'lib/bundler/rubygems_integration.rb', line 241
def security_policy_keys
%w{High Medium Low AlmostNo No}.map { |level| "#{level}Security" }
end
|
#sources ⇒ Object
93
94
95
|
# File 'lib/bundler/rubygems_integration.rb', line 93
def sources
Gem.sources
end
|
#sources=(val) ⇒ Object
84
85
86
87
88
89
90
91
|
# File 'lib/bundler/rubygems_integration.rb', line 84
def sources=(val)
configuration
Gem.sources = val
end
|
#spec_cache_dirs ⇒ Object
117
118
119
120
121
122
123
|
# File 'lib/bundler/rubygems_integration.rb', line 117
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
|
# File 'lib/bundler/rubygems_integration.rb', line 209
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
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
|
# File 'lib/bundler/rubygems_integration.rb', line 309
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
163
164
165
|
# File 'lib/bundler/rubygems_integration.rb', line 163
def ui=(obj)
Gem::DefaultUserInteraction.ui = obj
end
|
#user_home ⇒ Object
105
106
107
|
# File 'lib/bundler/rubygems_integration.rb', line 105
def user_home
Gem.user_home
end
|
#validate(spec) ⇒ Object
50
51
52
53
54
|
# File 'lib/bundler/rubygems_integration.rb', line 50
def validate(spec)
Bundler.ui.silence { spec.validate(false) }
rescue Errno::ENOENT
nil
end
|
#version ⇒ Object
21
22
23
|
# File 'lib/bundler/rubygems_integration.rb', line 21
def version
self.class.version
end
|
#with_build_args(args) ⇒ Object
192
193
194
195
196
197
198
199
200
201
202
|
# File 'lib/bundler/rubygems_integration.rb', line 192
def with_build_args(args)
ext_lock.synchronize do
old_args = self.build_args
begin
self.build_args = args
yield
ensure
self.build_args = old_args
end
end
end
|