Class: Bundler::RemoteSpecification

Inherits:
Object
  • Object
show all
Includes:
MatchPlatform, MatchRemoteMetadata, Comparable
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.

Direct Known Subclasses

StubSpecification

Constant Summary

Constants included from GemHelpers

GemHelpers::GENERICS, GemHelpers::GENERIC_CACHE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MatchPlatform

#match_platform, platforms_match?

Methods included from GemHelpers

generic, generic_local_platform, generic_local_platform_is_ruby?, local_platform, platform_specificity_match, same_deps, same_specificity, select_all_platform_match, select_best_local_platform_match, select_best_platform_match, sort_and_filter_best_platform_match, sort_best_platform_match

Methods included from MatchMetadata

#matches_current_metadata?, #matches_current_ruby?, #matches_current_rubygems?

Methods included from FetchMetadata

#matches_current_ruby?, #matches_current_rubygems?

Constructor Details

#initialize(name, version, platform, spec_fetcher) ⇒ RemoteSpecification

Returns a new instance of RemoteSpecification.



17
18
19
20
21
22
23
24
25
# 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
  @locked_platform = nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



117
118
119
# File 'lib/bundler/remote_specification.rb', line 117

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

Instance Attribute Details

#dependenciesObject



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/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

#locked_platformObject

Returns the value of attribute locked_platform.



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

def locked_platform
  @locked_platform
end

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

#platformObject (readonly)

Returns the value of attribute platform.



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

def platform
  @platform
end

#remoteObject

Returns the value of attribute remote.



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

def remote
  @remote
end

#sourceObject

Returns the value of attribute source.



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

def source
  @source
end

#versionObject (readonly)

Returns the value of attribute version.



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

def version
  @version
end

Instance Method Details

#<=>(other) ⇒ Object

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.



48
49
50
51
52
53
54
# File 'lib/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) ⇒ Object

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



59
60
61
62
63
64
# File 'lib/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

#fetch_platformObject

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



33
34
35
# File 'lib/bundler/remote_specification.rb', line 33

def fetch_platform
  @platform = _remote_specification.platform
end

#full_nameObject



37
38
39
40
41
42
43
# File 'lib/bundler/remote_specification.rb', line 37

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

#git_versionObject



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

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

#insecurely_materialized?Boolean

Returns:

  • (Boolean)


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

def insecurely_materialized?
  @locked_platform.to_s != @platform.to_s
end

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

Returns:

  • (Boolean)


121
122
123
# File 'lib/bundler/remote_specification.rb', line 121

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

#runtime_dependenciesObject



96
97
98
# File 'lib/bundler/remote_specification.rb', line 96

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


75
76
77
# File 'lib/bundler/remote_specification.rb', line 75

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

#to_sObject



79
80
81
# File 'lib/bundler/remote_specification.rb', line 79

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