Class: Bundler::RubygemsIntegration
- Inherits:
-
Object
- Object
- Bundler::RubygemsIntegration
- 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
- #binstubs_call_gem? ⇒ Boolean
- #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(remote) ⇒ Object
TODO: This is for older versions of RubyGems…
- #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
-
#initialize ⇒ RubygemsIntegration
constructor
A new instance of RubygemsIntegration.
- #install_with_build_args(args) ⇒ Object
- #load_path_insert_index ⇒ Object
- #load_plugin_files(files) ⇒ Object
- #load_plugins ⇒ Object
- #loaded_gem_paths ⇒ Object
- #loaded_specs(name) ⇒ Object
- #mark_loaded(spec) ⇒ Object
- #marshal_spec_dir ⇒ Object
- #method_visibility(klass, method) ⇒ Object
- #path(obj) ⇒ Object
- #path_separator ⇒ Object
- #platforms ⇒ Object
- #post_reset_hooks ⇒ Object
- #preserve_paths ⇒ Object
- #provides?(req_str) ⇒ Boolean
- #read_binary(path) ⇒ Object
- #redefine_method(klass, method, unbound_method = nil, &block) ⇒ Object
-
#replace_bin_path(specs, specs_by_name) ⇒ 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, specs_by_name) ⇒ 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
- #reset ⇒ Object
- #reverse_rubygems_kernel_mixin ⇒ Object
- #ruby_engine ⇒ Object
- #security_policies ⇒ Object
- #security_policy_keys ⇒ Object
- #set_installed_by_version(spec, installed_by_version = Gem::VERSION) ⇒ Object
- #sources ⇒ Object
- #sources=(val) ⇒ Object
- #spec_cache_dirs ⇒ Object
- #spec_default_gem?(spec) ⇒ Boolean
- #spec_extension_dir(spec) ⇒ Object
- #spec_from_gem(path, policy = nil) ⇒ Object
- #spec_matches_for_glob(spec, glob) ⇒ Object
- #spec_missing_extensions?(spec, default = true) ⇒ Boolean
- #stub_set_spec(stub, spec) ⇒ Object
- #stub_source_index(specs) ⇒ Object
- #stubs_provide_full_functionality? ⇒ Boolean
- #suffix_pattern ⇒ Object
- #ui=(obj) ⇒ Object
- #undo_replacements ⇒ Object
- #user_home ⇒ Object
- #validate(spec) ⇒ Object
- #version ⇒ Object
- #with_build_args(args) ⇒ Object
Constructor Details
#initialize ⇒ RubygemsIntegration
Returns a new instance of RubygemsIntegration.
23 24 25 |
# File 'lib/bundler/rubygems_integration.rb', line 23 def initialize @replaced_methods = {} end |
Class Method Details
.provides?(req_str) ⇒ Boolean
19 20 21 |
# File 'lib/bundler/rubygems_integration.rb', line 19 def self.provides?(req_str) Gem::Requirement.new(req_str).satisfied_by?(version) end |
Instance Method Details
#backport_base_dir ⇒ Object
This backports base_dir which replaces installation path RubyGems 1.8+
546 547 548 549 550 551 |
# File 'lib/bundler/rubygems_integration.rb', line 546 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
553 554 555 556 557 558 559 560 561 |
# File 'lib/bundler/rubygems_integration.rb', line 553 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.
527 528 529 530 531 532 533 |
# File 'lib/bundler/rubygems_integration.rb', line 527 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
563 564 565 566 567 568 569 570 571 |
# File 'lib/bundler/rubygems_integration.rb', line 563 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.
536 537 538 539 540 541 542 |
# File 'lib/bundler/rubygems_integration.rb', line 536 def backport_yaml_initialize redefine_method(Gem::Version, :yaml_initialize) do |_, map| @version = map["version"] @segments = nil @hash = nil end end |
#bin_path(gem, bin, ver) ⇒ Object
211 212 213 |
# File 'lib/bundler/rubygems_integration.rb', line 211 def bin_path(gem, bin, ver) Gem.bin_path(gem, bin, ver) end |
#binstubs_call_gem? ⇒ Boolean
362 363 364 |
# File 'lib/bundler/rubygems_integration.rb', line 362 def binstubs_call_gem? true end |
#build(spec, skip_validation = false) ⇒ Object
322 323 324 325 |
# File 'lib/bundler/rubygems_integration.rb', line 322 def build(spec, skip_validation = false) require "rubygems/builder" Gem::Builder.new(spec).build end |
#build_args ⇒ Object
35 36 37 |
# File 'lib/bundler/rubygems_integration.rb', line 35 def build_args Gem::Command.build_args end |
#build_args=(args) ⇒ Object
39 40 41 |
# File 'lib/bundler/rubygems_integration.rb', line 39 def build_args=(args) Gem::Command.build_args = args end |
#build_gem(gem_dir, spec) ⇒ Object
327 328 329 |
# File 'lib/bundler/rubygems_integration.rb', line 327 def build_gem(gem_dir, spec) build(spec) end |
#clear_paths ⇒ Object
207 208 209 |
# File 'lib/bundler/rubygems_integration.rb', line 207 def clear_paths Gem.clear_paths end |
#config_map ⇒ Object
199 200 201 |
# File 'lib/bundler/rubygems_integration.rb', line 199 def config_map Gem::ConfigMap end |
#configuration ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/bundler/rubygems_integration.rb', line 114 def configuration require "bundler/psyched_yaml" Gem.configuration rescue Gem::SystemExitException, LoadError => e Bundler.ui.error "#{e.class}: #{e.}" Bundler.ui.trace e raise rescue YamlLibrarySyntaxError => e raise YamlSyntaxError.new(e, "Your RubyGems configuration, which is " \ "usually located in ~/.gemrc, contains invalid YAML syntax.") end |
#download_gem(spec, uri, path) ⇒ Object
331 332 333 334 335 336 337 |
# File 'lib/bundler/rubygems_integration.rb', line 331 def download_gem(spec, uri, path) uri = Bundler.settings.mirror_for(uri) fetcher = Gem::RemoteFetcher.new(configuration[:http_proxy]) Bundler::Retry.new("download gem from #{uri}").attempts do fetcher.download(spec, uri, path) end end |
#ext_lock ⇒ Object
249 250 251 |
# File 'lib/bundler/rubygems_integration.rb', line 249 def ext_lock EXT_LOCK end |
#fetch_all_remote_specs(remote) ⇒ Object
TODO: This is for older versions of RubyGems… should we support the X-Gemfile-Source header on these old versions? Maybe the newer implementation will work on older RubyGems? It seems difficult to keep this implementation and still send the header.
270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'lib/bundler/rubygems_integration.rb', line 270 def fetch_all_remote_specs(remote) old_sources = Bundler.rubygems.sources Bundler.rubygems.sources = [remote.uri.to_s] # Fetch all specs, minus prerelease specs spec_list = fetch_specs(true, false) # Then fetch the prerelease specs fetch_prerelease_specs.each {|k, v| spec_list[k].concat(v) } spec_list.values.first ensure Bundler.rubygems.sources = old_sources end |
#fetch_prerelease_specs ⇒ Object
260 261 262 263 264 |
# File 'lib/bundler/rubygems_integration.rb', line 260 def fetch_prerelease_specs fetch_specs(false, true) rescue Gem::RemoteFetcher::FetchError {} # if we can't download them, there aren't any end |
#fetch_specs(all, pre, &blk) ⇒ Object
253 254 255 256 257 258 |
# File 'lib/bundler/rubygems_integration.rb', line 253 def fetch_specs(all, pre, &blk) require "rubygems/spec_fetcher" specs = Gem::SpecFetcher.new.list(all, pre) specs.each { yield } if block_given? specs end |
#gem_bindir ⇒ Object
159 160 161 |
# File 'lib/bundler/rubygems_integration.rb', line 159 def gem_bindir Gem.bindir end |
#gem_cache ⇒ Object
183 184 185 |
# File 'lib/bundler/rubygems_integration.rb', line 183 def gem_cache gem_path.map {|p| File.("cache", p) } end |
#gem_dir ⇒ Object
155 156 157 |
# File 'lib/bundler/rubygems_integration.rb', line 155 def gem_dir Gem.dir end |
#gem_from_path(path, policy = nil) ⇒ Object
299 300 301 302 |
# File 'lib/bundler/rubygems_integration.rb', line 299 def gem_from_path(path, policy = nil) require "rubygems/format" Gem::Format.from_file_by_path(path, policy) end |
#gem_path ⇒ Object
167 168 169 |
# File 'lib/bundler/rubygems_integration.rb', line 167 def gem_path Gem.path end |
#inflate(obj) ⇒ Object
134 135 136 137 138 139 140 |
# File 'lib/bundler/rubygems_integration.rb', line 134 def inflate(obj) if defined?(Gem::Util) Gem::Util.inflate(obj) else Gem.inflate(obj) end end |
#install_with_build_args(args) ⇒ Object
295 296 297 |
# File 'lib/bundler/rubygems_integration.rb', line 295 def install_with_build_args(args) with_build_args(args) { yield } end |
#load_path_insert_index ⇒ Object
43 44 45 |
# File 'lib/bundler/rubygems_integration.rb', line 43 def load_path_insert_index Gem.load_path_insert_index end |
#load_plugin_files(files) ⇒ Object
241 242 243 |
# File 'lib/bundler/rubygems_integration.rb', line 241 def load_plugin_files(files) Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files) end |
#load_plugins ⇒ Object
237 238 239 |
# File 'lib/bundler/rubygems_integration.rb', line 237 def load_plugins Gem.load_plugins if Gem.respond_to?(:load_plugins) end |
#loaded_gem_paths ⇒ Object
224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/bundler/rubygems_integration.rb', line 224 def loaded_gem_paths # RubyGems 2.2+ can put binary extension into dedicated folders, # therefore use RubyGems facilities to obtain their load paths. if Gem::Specification.method_defined? :full_require_paths loaded_gem_paths = Gem.loaded_specs.map {|_, 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
47 48 49 |
# File 'lib/bundler/rubygems_integration.rb', line 47 def loaded_specs(name) Gem.loaded_specs[name] end |
#mark_loaded(spec) ⇒ Object
51 52 53 54 55 56 57 58 |
# File 'lib/bundler/rubygems_integration.rb', line 51 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
195 196 197 |
# File 'lib/bundler/rubygems_integration.rb', line 195 def marshal_spec_dir Gem::MARSHAL_SPEC_DIR end |
#method_visibility(klass, method) ⇒ Object
606 607 608 609 610 611 612 613 614 |
# File 'lib/bundler/rubygems_integration.rb', line 606 def method_visibility(klass, method) if klass.private_method_defined?(method) :private elsif klass.protected_method_defined?(method) :protected else :public end end |
#path(obj) ⇒ Object
105 106 107 |
# File 'lib/bundler/rubygems_integration.rb', line 105 def path(obj) obj.to_s end |
#path_separator ⇒ Object
215 216 217 |
# File 'lib/bundler/rubygems_integration.rb', line 215 def path_separator File::PATH_SEPARATOR end |
#platforms ⇒ Object
109 110 111 112 |
# File 'lib/bundler/rubygems_integration.rb', line 109 def platforms return [Gem::Platform::RUBY] if Bundler.settings[:force_ruby_platform] Gem.platforms end |
#post_reset_hooks ⇒ Object
175 176 177 |
# File 'lib/bundler/rubygems_integration.rb', line 175 def post_reset_hooks Gem.post_reset_hooks end |
#preserve_paths ⇒ Object
219 220 221 222 |
# File 'lib/bundler/rubygems_integration.rb', line 219 def preserve_paths # this is a no-op outside of RubyGems 1.8 yield end |
#provides?(req_str) ⇒ Boolean
31 32 33 |
# File 'lib/bundler/rubygems_integration.rb', line 31 def provides?(req_str) self.class.provides?(req_str) end |
#read_binary(path) ⇒ Object
130 131 132 |
# File 'lib/bundler/rubygems_integration.rb', line 130 def read_binary(path) Gem.read_binary(path) end |
#redefine_method(klass, method, unbound_method = nil, &block) ⇒ Object
585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 |
# File 'lib/bundler/rubygems_integration.rb', line 585 def redefine_method(klass, method, unbound_method = nil, &block) visibility = method_visibility(klass, method) begin if (instance_method = klass.instance_method(method)) && method != :initialize # doing this to ensure we also get private methods klass.send(:remove_method, method) end rescue NameError # method isn't defined nil end @replaced_methods[[method, klass]] = instance_method if unbound_method klass.send(:define_method, method, unbound_method) klass.send(visibility, method) elsif block klass.send(:define_method, method, &block) klass.send(visibility, method) end end |
#replace_bin_path(specs, specs_by_name) ⇒ 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
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 |
# File 'lib/bundler/rubygems_integration.rb', line 439 def replace_bin_path(specs, specs_by_name) gem_class = (class << Gem; self; end) redefine_method(gem_class, :find_spec_for_exe) do |gem_name, *args| exec_name = args.first spec_with_name = specs_by_name[gem_name] spec = if exec_name if spec_with_name && spec_with_name.executables.include?(exec_name) spec_with_name else specs.find {|s| s.executables.include?(exec_name) } end else spec_with_name end unless spec = "can't find executable #{exec_name} for gem #{gem_name}" if !exec_name || spec_with_name.nil? += ". #{gem_name} is not currently included in the bundle, " \ "perhaps you meant to add it to your #{Bundler.default_gemfile.basename}?" end raise Gem::Exception, end raise Gem::Exception, "no default executable for #{spec.full_name}" unless exec_name ||= spec.default_executable unless spec.name == gem_name Bundler::SharedHelpers.major_deprecation 2, "Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \ "You should run `bundle binstub #{gem_name}` " \ "to work around a system/bundle conflict." end spec end redefine_method(gem_class, :activate_bin_path) do |name, *args| exec_name = args.first return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle" # Copy of Rubygems activate_bin_path impl requirement = args.last spec = find_spec_for_exe name, exec_name, [requirement] 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 redefine_method(gem_class, :bin_path) do |name, *args| exec_name = args.first return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle" spec = find_spec_for_exe(name, *args) exec_name ||= spec.default_executable 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.
511 512 513 514 515 516 517 518 519 520 521 522 523 |
# File 'lib/bundler/rubygems_integration.rb', line 511 def replace_entrypoints(specs) specs_by_name = specs.reduce({}) do |h, s| h[s.name] = s h end replace_gem(specs, specs_by_name) stub_rubygems(specs) replace_bin_path(specs, specs_by_name) replace_refresh Gem.clear_paths end |
#replace_gem(specs, specs_by_name) ⇒ Object
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'lib/bundler/rubygems_integration.rb', line 370 def replace_gem(specs, specs_by_name) reverse_rubygems_kernel_mixin executables = nil kernel = (class << ::Kernel; self; end) [kernel, ::Kernel].each do |kernel_class| redefine_method(kernel_class, :gem) do |dep, *reqs| executables ||= specs.map(&:executables).flatten if ::Bundler.rubygems.binstubs_call_gem? if executables && executables.include?(File.basename(caller.first.split(":").first)) break 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 if spec = specs_by_name[dep.name] return true if dep.matches_spec?(spec) end = if spec.nil? "#{dep.name} is not part of the bundle." \ " Add it to your #{Bundler.default_gemfile.basename}." else "can't activate #{dep}, already activated #{spec.full_name}. " \ "Make sure all dependencies are added to Gemfile." end e = Gem::LoadError.new() e.name = dep.name if e.respond_to?(:requirement=) e.requirement = dep.requirement elsif e.respond_to?(:version_requirement=) e.version_requirement = dep.requirement end raise e end # backwards compatibility shim, see https://github.com/bundler/bundler/issues/5102 kernel_class.send(:public, :gem) if Bundler.feature_flag.setup_makes_kernel_gem_public? end end |
#replace_refresh ⇒ Object
Because Bundler has a static view of what specs are available, we don’t #refresh, so stub it out.
504 505 506 507 |
# File 'lib/bundler/rubygems_integration.rb', line 504 def replace_refresh gem_class = (class << Gem; self; end) redefine_method(gem_class, :refresh) {} end |
#repository_subdirectories ⇒ Object
203 204 205 |
# File 'lib/bundler/rubygems_integration.rb', line 203 def repository_subdirectories %w[cache doc gems specifications] end |
#reset ⇒ Object
171 172 173 |
# File 'lib/bundler/rubygems_integration.rb', line 171 def reset Gem::Specification.reset end |
#reverse_rubygems_kernel_mixin ⇒ Object
352 353 354 355 356 357 358 359 360 |
# File 'lib/bundler/rubygems_integration.rb', line 352 def reverse_rubygems_kernel_mixin # Disable rubygems' gem activation system kernel = (class << ::Kernel; self; end) [kernel, ::Kernel].each do |k| if k.private_method_defined?(:gem_original_require) redefine_method(k, :require, k.instance_method(:gem_original_require)) end end end |
#ruby_engine ⇒ Object
126 127 128 |
# File 'lib/bundler/rubygems_integration.rb', line 126 def ruby_engine Gem.ruby_engine end |
#security_policies ⇒ Object
343 344 345 346 347 348 349 350 |
# File 'lib/bundler/rubygems_integration.rb', line 343 def security_policies @security_policies ||= begin require "rubygems/security" Gem::Security::Policies rescue LoadError, NameError {} end end |
#security_policy_keys ⇒ Object
339 340 341 |
# File 'lib/bundler/rubygems_integration.rb', line 339 def security_policy_keys %w[High Medium Low AlmostNo No].map {|level| "#{level}Security" } end |
#set_installed_by_version(spec, installed_by_version = Gem::VERSION) ⇒ Object
70 71 72 73 |
# File 'lib/bundler/rubygems_integration.rb', line 70 def set_installed_by_version(spec, installed_by_version = Gem::VERSION) return unless spec.respond_to?(:installed_by_version=) spec.installed_by_version = Gem::Version.create(installed_by_version) end |
#sources ⇒ Object
151 152 153 |
# File 'lib/bundler/rubygems_integration.rb', line 151 def sources Gem.sources end |
#sources=(val) ⇒ Object
142 143 144 145 146 147 148 149 |
# File 'lib/bundler/rubygems_integration.rb', line 142 def sources=(val) # Gem.configuration creates a new Gem::ConfigFile, which by default will read ~/.gemrc # If that file exists, its settings (including sources) will overwrite the values we # are about to set here. In order to avoid that, we force memoizing the config file now. configuration Gem.sources = val end |
#spec_cache_dirs ⇒ Object
187 188 189 190 191 192 193 |
# File 'lib/bundler/rubygems_integration.rb', line 187 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) # Not in RubyGems 2.0.3 or earlier dirs.uniq.select {|dir| File.directory? dir } end end |
#spec_default_gem?(spec) ⇒ Boolean
84 85 86 |
# File 'lib/bundler/rubygems_integration.rb', line 84 def spec_default_gem?(spec) spec.respond_to?(:default_gem?) && spec.default_gem? end |
#spec_extension_dir(spec) ⇒ Object
96 97 98 99 |
# File 'lib/bundler/rubygems_integration.rb', line 96 def spec_extension_dir(spec) return unless spec.respond_to?(:extension_dir) spec.extension_dir end |
#spec_from_gem(path, policy = nil) ⇒ Object
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 |
# File 'lib/bundler/rubygems_integration.rb', line 304 def spec_from_gem(path, policy = nil) require "rubygems/security" require "bundler/psyched_yaml" 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. =~ /unknown trust policy|unsigned gem/i || e. =~ /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.}" else raise e end end |
#spec_matches_for_glob(spec, glob) ⇒ Object
88 89 90 91 92 93 94 |
# File 'lib/bundler/rubygems_integration.rb', line 88 def spec_matches_for_glob(spec, glob) return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob) spec.load_paths.map do |lp| Dir["#{lp}/#{glob}#{suffix_pattern}"] end.flatten(1) end |
#spec_missing_extensions?(spec, default = true) ⇒ Boolean
75 76 77 78 79 80 81 82 |
# File 'lib/bundler/rubygems_integration.rb', line 75 def spec_missing_extensions?(spec, default = true) return spec.missing_extensions? if spec.respond_to?(:missing_extensions?) return false if spec_default_gem?(spec) return false if spec.extensions.empty? default end |
#stub_set_spec(stub, spec) ⇒ Object
101 102 103 |
# File 'lib/bundler/rubygems_integration.rb', line 101 def stub_set_spec(stub, spec) stub.instance_variable_set(:@spec, spec) end |
#stub_source_index(specs) ⇒ Object
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
# File 'lib/bundler/rubygems_integration.rb', line 416 def stub_source_index(specs) Gem::SourceIndex.send(:alias_method, :old_initialize, :initialize) redefine_method(Gem::SourceIndex, :initialize) do |*args| @gems = {} # You're looking at this thinking: Oh! This is how I make those # rubygems deprecations go away! # # You'd be correct BUT using of this method in production code # must be approved by the rubygems team itself! # # This is your warning. If you use this and don't have approval # we can't protect you. # Deprecate.skip_during do self.spec_dirs = *args add_specs(*specs) end end end |
#stubs_provide_full_functionality? ⇒ Boolean
366 367 368 |
# File 'lib/bundler/rubygems_integration.rb', line 366 def stubs_provide_full_functionality? false end |
#suffix_pattern ⇒ Object
179 180 181 |
# File 'lib/bundler/rubygems_integration.rb', line 179 def suffix_pattern Gem.suffix_pattern end |
#ui=(obj) ⇒ Object
245 246 247 |
# File 'lib/bundler/rubygems_integration.rb', line 245 def ui=(obj) Gem::DefaultUserInteraction.ui = obj end |
#undo_replacements ⇒ Object
573 574 575 576 577 578 579 580 581 582 583 |
# File 'lib/bundler/rubygems_integration.rb', line 573 def undo_replacements @replaced_methods.each do |(sym, klass), method| redefine_method(klass, sym, method) end if Binding.public_method_defined?(:source_location) post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ } else post_reset_hooks.reject! {|proc| proc.binding.eval("__FILE__") == __FILE__ } end @replaced_methods.clear end |
#user_home ⇒ Object
163 164 165 |
# File 'lib/bundler/rubygems_integration.rb', line 163 def user_home Gem.user_home end |
#validate(spec) ⇒ Object
60 61 62 63 64 65 66 67 68 |
# File 'lib/bundler/rubygems_integration.rb', line 60 def validate(spec) Bundler.ui.silence { spec.validate(false) } rescue Gem::InvalidSpecificationException => e = "The gemspec at #{spec.loaded_from} is not valid. Please fix this gemspec.\n" \ "The validation error was '#{e.}'\n" raise Gem::InvalidSpecificationException.new() rescue Errno::ENOENT nil end |
#version ⇒ Object
27 28 29 |
# File 'lib/bundler/rubygems_integration.rb', line 27 def version self.class.version end |
#with_build_args(args) ⇒ Object
283 284 285 286 287 288 289 290 291 292 293 |
# File 'lib/bundler/rubygems_integration.rb', line 283 def with_build_args(args) ext_lock.synchronize do old_args = build_args begin self.build_args = args yield ensure self.build_args = old_args end end end |