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
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_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
12
13
14
|
# File 'lib/bundler/rubygems_integration.rb', line 12
def self.provides?(req_str)
Gem::Requirement.new(req_str).satisfied_by?(version)
end
|
.version ⇒ Object
8
9
10
|
# File 'lib/bundler/rubygems_integration.rb', line 8
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+
372
373
374
375
376
377
|
# File 'lib/bundler/rubygems_integration.rb', line 372
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
379
380
381
382
383
384
385
386
387
|
# File 'lib/bundler/rubygems_integration.rb', line 379
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.
353
354
355
356
357
358
359
|
# File 'lib/bundler/rubygems_integration.rb', line 353
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
389
390
391
392
393
394
395
396
397
|
# File 'lib/bundler/rubygems_integration.rb', line 389
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.
362
363
364
365
366
367
368
|
# File 'lib/bundler/rubygems_integration.rb', line 362
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
125
126
127
|
# File 'lib/bundler/rubygems_integration.rb', line 125
def bin_path(gem, bin, ver)
Gem.bin_path(gem, bin, ver)
end
|
#build(spec, skip_validation = false) ⇒ Object
195
196
197
198
|
# File 'lib/bundler/rubygems_integration.rb', line 195
def build(spec, skip_validation = false)
require 'rubygems/builder'
Gem::Builder.new(spec).build
end
|
#build_args ⇒ Object
24
25
26
|
# File 'lib/bundler/rubygems_integration.rb', line 24
def build_args
Gem::Command.build_args
end
|
#build_args=(args) ⇒ Object
28
29
30
|
# File 'lib/bundler/rubygems_integration.rb', line 28
def build_args=(args)
Gem::Command.build_args = args
end
|
#build_gem(gem_dir, spec) ⇒ Object
200
201
202
|
# File 'lib/bundler/rubygems_integration.rb', line 200
def build_gem(gem_dir, spec)
build(spec)
end
|
#clear_paths ⇒ Object
121
122
123
|
# File 'lib/bundler/rubygems_integration.rb', line 121
def clear_paths
Gem.clear_paths
end
|
#config_map ⇒ Object
113
114
115
|
# File 'lib/bundler/rubygems_integration.rb', line 113
def config_map
Gem::ConfigMap
end
|
#configuration ⇒ Object
48
49
50
51
52
53
54
|
# File 'lib/bundler/rubygems_integration.rb', line 48
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
204
205
206
207
208
|
# File 'lib/bundler/rubygems_integration.rb', line 204
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
|
#ext_lock ⇒ Object
138
139
140
|
# File 'lib/bundler/rubygems_integration.rb', line 138
def ext_lock
@ext_lock ||= Monitor.new
end
|
#fetch_all_remote_specs ⇒ Object
154
155
156
157
158
159
160
161
|
# File 'lib/bundler/rubygems_integration.rb', line 154
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
148
149
150
151
152
|
# File 'lib/bundler/rubygems_integration.rb', line 148
def fetch_prerelease_specs
fetch_specs(false, true)
rescue Gem::RemoteFetcher::FetchError
[] end
|
#fetch_specs(all, pre, &blk) ⇒ Object
142
143
144
145
146
|
# File 'lib/bundler/rubygems_integration.rb', line 142
def fetch_specs(all, pre, &blk)
specs = Gem::SpecFetcher.new.list(all, pre)
specs.each { yield } if block_given?
specs
end
|
#gem_bindir ⇒ Object
85
86
87
|
# File 'lib/bundler/rubygems_integration.rb', line 85
def gem_bindir
Gem.bindir
end
|
#gem_cache ⇒ Object
97
98
99
|
# File 'lib/bundler/rubygems_integration.rb', line 97
def gem_cache
gem_path.map{|p| File.expand_path("cache", p) }
end
|
#gem_dir ⇒ Object
81
82
83
|
# File 'lib/bundler/rubygems_integration.rb', line 81
def gem_dir
Gem.dir
end
|
#gem_from_path(path, policy = nil) ⇒ Object
173
174
175
176
|
# File 'lib/bundler/rubygems_integration.rb', line 173
def gem_from_path(path, policy = nil)
require 'rubygems/format'
Gem::Format.from_file_by_path(path, policy)
end
|
#gem_path ⇒ Object
93
94
95
|
# File 'lib/bundler/rubygems_integration.rb', line 93
def gem_path
Gem.path
end
|
#inflate(obj) ⇒ Object
64
65
66
|
# File 'lib/bundler/rubygems_integration.rb', line 64
def inflate(obj)
Gem.inflate(obj)
end
|
#loaded_specs(name) ⇒ Object
32
33
34
|
# File 'lib/bundler/rubygems_integration.rb', line 32
def loaded_specs(name)
Gem.loaded_specs[name]
end
|
#mark_loaded(spec) ⇒ Object
36
37
38
|
# File 'lib/bundler/rubygems_integration.rb', line 36
def mark_loaded(spec)
Gem.loaded_specs[spec.name] = spec
end
|
#marshal_spec_dir ⇒ Object
109
110
111
|
# File 'lib/bundler/rubygems_integration.rb', line 109
def marshal_spec_dir
Gem::MARSHAL_SPEC_DIR
end
|
#path(obj) ⇒ Object
40
41
42
|
# File 'lib/bundler/rubygems_integration.rb', line 40
def path(obj)
obj.to_s
end
|
44
45
46
|
# File 'lib/bundler/rubygems_integration.rb', line 44
def platforms
Gem.platforms
end
|
#preserve_paths ⇒ Object
129
130
131
132
|
# File 'lib/bundler/rubygems_integration.rb', line 129
def preserve_paths
yield
end
|
#provides?(req_str) ⇒ Boolean
20
21
22
|
# File 'lib/bundler/rubygems_integration.rb', line 20
def provides?(req_str)
self.class.provides?(req_str)
end
|
#read_binary(path) ⇒ Object
60
61
62
|
# File 'lib/bundler/rubygems_integration.rb', line 60
def read_binary(path)
Gem.read_binary(path)
end
|
#redefine_method(klass, method, &block) ⇒ Object
399
400
401
402
403
404
|
# File 'lib/bundler/rubygems_integration.rb', line 399
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
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
# File 'lib/bundler/rubygems_integration.rb', line 301
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.
340
341
342
343
344
345
346
347
348
349
|
# File 'lib/bundler/rubygems_integration.rb', line 340
def replace_entrypoints(specs)
replace_gem(specs)
stub_rubygems(specs)
replace_bin_path(specs)
replace_refresh
Gem.clear_paths
end
|
#replace_gem(specs) ⇒ Object
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
272
273
274
275
276
|
# File 'lib/bundler/rubygems_integration.rb', line 235
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.
333
334
335
336
|
# File 'lib/bundler/rubygems_integration.rb', line 333
def replace_refresh
gem_class = (class << Gem ; self ; end)
redefine_method(gem_class, :refresh) { }
end
|
#repository_subdirectories ⇒ Object
117
118
119
|
# File 'lib/bundler/rubygems_integration.rb', line 117
def repository_subdirectories
%w[cache doc gems specifications]
end
|
#reverse_rubygems_kernel_mixin ⇒ Object
223
224
225
226
227
228
229
230
231
232
233
|
# File 'lib/bundler/rubygems_integration.rb', line 223
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
56
57
58
|
# File 'lib/bundler/rubygems_integration.rb', line 56
def ruby_engine
Gem.ruby_engine
end
|
#security_policies ⇒ Object
214
215
216
217
218
219
220
221
|
# File 'lib/bundler/rubygems_integration.rb', line 214
def security_policies
@security_policies ||= begin
require 'rubygems/security'
Gem::Security::Policies
rescue LoadError, NameError
{}
end
end
|
#security_policy_keys ⇒ Object
210
211
212
|
# File 'lib/bundler/rubygems_integration.rb', line 210
def security_policy_keys
%w{High Medium Low AlmostNo No}.map { |level| "#{level}Security" }
end
|
#sources ⇒ Object
77
78
79
|
# File 'lib/bundler/rubygems_integration.rb', line 77
def sources
Gem.sources
end
|
#sources=(val) ⇒ Object
68
69
70
71
72
73
74
75
|
# File 'lib/bundler/rubygems_integration.rb', line 68
def sources=(val)
configuration
Gem.sources = val
end
|
#spec_cache_dirs ⇒ Object
101
102
103
104
105
106
107
|
# File 'lib/bundler/rubygems_integration.rb', line 101
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
# File 'lib/bundler/rubygems_integration.rb', line 178
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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
# File 'lib/bundler/rubygems_integration.rb', line 278
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
134
135
136
|
# File 'lib/bundler/rubygems_integration.rb', line 134
def ui=(obj)
Gem::DefaultUserInteraction.ui = obj
end
|
#user_home ⇒ Object
89
90
91
|
# File 'lib/bundler/rubygems_integration.rb', line 89
def user_home
Gem.user_home
end
|
#version ⇒ Object
16
17
18
|
# File 'lib/bundler/rubygems_integration.rb', line 16
def version
self.class.version
end
|
#with_build_args(args) ⇒ Object
163
164
165
166
167
168
169
170
171
|
# File 'lib/bundler/rubygems_integration.rb', line 163
def with_build_args(args)
old_args = self.build_args
begin
self.build_args = args
yield
ensure
self.build_args = old_args
end
end
|