123456789_123456789_123456789_123456789_123456789_

Class: Bundler::RemoteSpecification

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: lib/bundler/remote_specification.rb

Overview

Represents a lazily loaded gem specification, where the full specification is on the source server in rubygems’ “quick” index. The proxy object is to be seeded with what we’re given from the source’s abbreviated index - the full specification will only be fetched when necessary.

Constant Summary

GemHelpers - Included

GENERICS, GENERIC_CACHE

Class Method Summary

Instance Attribute Summary

GemHelpers - Included

FetchMetadata - Included

#matches_current_ruby?

A fallback is included because the original version of the specification API didn’t include that field, so some marshalled specs in the index have it set to nil.

#matches_current_rubygems?

MatchMetadata - Included

Instance Method Summary

MatchPlatform - Included

GemHelpers - Included

Constructor Details

.new(name, version, platform, spec_fetcher) ⇒ RemoteSpecification

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 17

def initialize(name, version, platform, spec_fetcher)
  @name         = name
  @version      = Gem::Version.create version
  @original_platform = platform || Gem::Platform::RUBY
  @platform     = Gem::Platform.new(platform)
  @spec_fetcher = spec_fetcher
  @dependencies = nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &blk) (private)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 112

def method_missing(method, *args, &blk)
  _remote_specification.send(method, *args, &blk)
end

Instance Attribute Details

#dependencies (rw)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 78

def dependencies
  @dependencies ||= begin
    deps = method_missing(:dependencies)

    # allow us to handle when the specs dependencies are an array of array of string
    # in order to delay the crash to `#__swap__` where it results in a friendlier error
    # see https://github.com/rubygems/bundler/issues/5797
    deps = deps.map {|d| d.is_a?(Gem::Dependency) ? d : Gem::Dependency.new(*d) }

    deps
  end
end

#dependencies=(value) (rw)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 14

attr_writer :dependencies

#name (readonly)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 13

attr_reader :name, :version, :platform

#platform (readonly)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 13

attr_reader :name, :version, :platform

#remote (rw)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 15

attr_accessor :source, :remote

#source (rw)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 15

attr_accessor :source, :remote

#version (readonly)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 13

attr_reader :name, :version, :platform

Instance Method Details

#<=>(other)

Compare this specification against another object. Using sort_obj is compatible with ::Gem::Specification and other ::Bundler or RubyGems objects. Otherwise, use the default Object comparison.

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 43

def <=>(other)
  if other.respond_to?(:sort_obj)
    sort_obj <=> other.sort_obj
  else
    super
  end
end

#__swap__(spec)

Because Rubyforge cannot be trusted to provide valid specifications once the remote gem is downloaded, the backend specification will be swapped out.

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 54

def __swap__(spec)
  raise APIResponseInvalidDependenciesError unless spec.dependencies.all? {|d| d.is_a?(Gem::Dependency) }

  SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
  @_remote_specification = spec
end

#_remote_specification (private)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 106

def _remote_specification
  @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @original_platform])
  @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
    " missing from the server!")
end

#fetch_platform

Needed before installs, since the arch matters then and quick specs don’t bother to include the arch in the platform string

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 28

def fetch_platform
  @platform = _remote_specification.platform
end

#full_name

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 32

def full_name
  @full_name ||= if @platform == Gem::Platform::RUBY
    "#{@name}-#{@version}"
  else
    "#{@name}-#{@version}-#{@platform}"
  end
end

#git_version

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 95

def git_version
  return unless loaded_from && source.is_a?(Bundler::Source::Git)
  " #{source.revision[0..6]}"
end

#respond_to?(method, include_all = false) ⇒ Boolean

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 116

def respond_to?(method, include_all = false)
  super || _remote_specification.respond_to?(method, include_all)
end

#runtime_dependencies

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 91

def runtime_dependencies
  dependencies.select(&:runtime?)
end

#sort_objArray

Create a delegate used for sorting. This strategy is copied from RubyGems 2.23 and ensures that Bundler’s specifications can be compared and sorted with RubyGems’ own specifications.

Returns:

  • (Array)

    an object you can use to compare and sort this specification against other specifications

See Also:

  • #<=>
  • Gem::Specification#sort_obj
[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 70

def sort_obj
  [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1]
end

#to_ary (private)

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 102

def to_ary
  nil
end

#to_s

[ GitHub ]

  
# File 'lib/bundler/remote_specification.rb', line 74

def to_s
  "#<#{self.class} name=#{name} version=#{version} platform=#{platform}>"
end