class Bundler::RemoteSpecification

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.

Attributes

dependencies[W]
name[R]
platform[R]
remote[RW]
source[RW]
version[R]

Public Class Methods

new(name, version, platform, spec_fetcher) click to toggle source
# File bundler/remote_specification.rb, line 16
def initialize(name, version, platform, spec_fetcher)
  @name         = name
  @version      = Gem::Version.create version
  @platform     = platform
  @spec_fetcher = spec_fetcher
  @dependencies = nil
end

Public Instance Methods

<=>(other) click to toggle source

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.

Calls superclass method
# File bundler/remote_specification.rb, line 48
def <=>(other)
  if other.respond_to?(:sort_obj)
    sort_obj <=> other.sort_obj
  else
    super
  end
end
__swap__(spec) click to toggle source

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

# File bundler/remote_specification.rb, line 59
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
dependencies() click to toggle source
# File bundler/remote_specification.rb, line 83
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
fetch_platform() click to toggle source

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

# File bundler/remote_specification.rb, line 26
def fetch_platform
  @platform = _remote_specification.platform
end
full_name() click to toggle source
# File bundler/remote_specification.rb, line 37
def full_name
  if platform == Gem::Platform::RUBY || platform.nil?
    "#{@name}-#{@version}"
  else
    "#{@name}-#{@version}-#{platform}"
  end
end
git_version() click to toggle source
# File bundler/remote_specification.rb, line 96
def git_version
  return unless loaded_from && source.is_a?(Bundler::Source::Git)
  " #{source.revision[0..6]}"
end
required_rubygems_version() click to toggle source

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.

# File bundler/remote_specification.rb, line 33
def required_rubygems_version
  @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default
end
respond_to?(method, include_all = false) click to toggle source
Calls superclass method
# File bundler/remote_specification.rb, line 117
def respond_to?(method, include_all = false)
  super || _remote_specification.respond_to?(method, include_all)
end
sort_obj() click to toggle source

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.

@see #<=> @see Gem::Specification#sort_obj

@return [Array] an object you can use to compare and sort this

specification against other specifications
# File bundler/remote_specification.rb, line 75
def sort_obj
  [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1]
end
to_s() click to toggle source
# File bundler/remote_specification.rb, line 79
def to_s
  "#<#{self.class} name=#{name} version=#{version} platform=#{platform}>"
end

Private Instance Methods

_remote_specification() click to toggle source
# File bundler/remote_specification.rb, line 107
def _remote_specification
  @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
  @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
    " missing from the server! Try installing with `--full-index` as a workaround.")
end
method_missing(method, *args, &blk) click to toggle source
# File bundler/remote_specification.rb, line 113
def method_missing(method, *args, &blk)
  _remote_specification.send(method, *args, &blk)
end
to_ary() click to toggle source
# File bundler/remote_specification.rb, line 103
def to_ary
  nil
end