Class: Bundler::RemoteSpecification
- Inherits:
-
Object
- Object
- Bundler::RemoteSpecification
- Includes:
- MatchPlatform, 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
Constant Summary
Constants included from GemHelpers
GemHelpers::GENERICS, GemHelpers::GENERIC_CACHE
Instance Attribute Summary collapse
- #dependencies ⇒ Object
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#platform ⇒ Object
readonly
Returns the value of attribute platform.
-
#remote ⇒ Object
Returns the value of attribute remote.
-
#source ⇒ Object
Returns the value of attribute source.
-
#version ⇒ Object
readonly
Returns the value of attribute version.
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
Compare this specification against another object.
-
#__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.
-
#fetch_platform ⇒ Object
Needed before installs, since the arch matters then and quick specs don't bother to include the arch in the platform string.
- #full_name ⇒ Object
- #git_version ⇒ Object
-
#initialize(name, version, platform, spec_fetcher) ⇒ RemoteSpecification
constructor
A new instance of RemoteSpecification.
-
#required_rubygems_version ⇒ Object
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
. - #respond_to?(method, include_all = false) ⇒ Boolean
-
#sort_obj ⇒ Array
Create a delegate used for sorting.
- #to_s ⇒ Object
Methods included from MatchPlatform
#match_platform, platforms_match?
Methods included from GemHelpers
generic, generic_local_platform, local_platform, platform_specificity_match, same_deps, same_specificity, select_best_platform_match, sort_best_platform_match
Constructor Details
#initialize(name, version, platform, spec_fetcher) ⇒ RemoteSpecification
Returns a new instance of RemoteSpecification.
16 17 18 19 20 21 22 23 |
# File 'lib/bundler/remote_specification.rb', line 16 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) ⇒ Object (private)
114 115 116 |
# File 'lib/bundler/remote_specification.rb', line 114 def method_missing(method, *args, &blk) _remote_specification.send(method, *args, &blk) end |
Instance Attribute Details
#dependencies ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/bundler/remote_specification.rb', line 84 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 |
#name ⇒ Object (readonly)
Returns the value of attribute name.
12 13 14 |
# File 'lib/bundler/remote_specification.rb', line 12 def name @name end |
#platform ⇒ Object (readonly)
Returns the value of attribute platform.
12 13 14 |
# File 'lib/bundler/remote_specification.rb', line 12 def platform @platform end |
#remote ⇒ Object
Returns the value of attribute remote.
14 15 16 |
# File 'lib/bundler/remote_specification.rb', line 14 def remote @remote end |
#source ⇒ Object
Returns the value of attribute source.
14 15 16 |
# File 'lib/bundler/remote_specification.rb', line 14 def source @source end |
#version ⇒ Object (readonly)
Returns the value of attribute version.
12 13 14 |
# File 'lib/bundler/remote_specification.rb', line 12 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.
49 50 51 52 53 54 55 |
# File 'lib/bundler/remote_specification.rb', line 49 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.
60 61 62 63 64 65 |
# File 'lib/bundler/remote_specification.rb', line 60 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_platform ⇒ Object
Needed before installs, since the arch matters then and quick specs don't bother to include the arch in the platform string
27 28 29 |
# File 'lib/bundler/remote_specification.rb', line 27 def fetch_platform @platform = _remote_specification.platform end |
#full_name ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/bundler/remote_specification.rb', line 38 def full_name if @original_platform == Gem::Platform::RUBY "#{@name}-#{@version}" else "#{@name}-#{@version}-#{@original_platform}" end end |
#git_version ⇒ Object
97 98 99 100 |
# File 'lib/bundler/remote_specification.rb', line 97 def git_version return unless loaded_from && source.is_a?(Bundler::Source::Git) " #{source.revision[0..6]}" end |
#required_rubygems_version ⇒ Object
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
.
34 35 36 |
# File 'lib/bundler/remote_specification.rb', line 34 def required_rubygems_version @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default end |
#respond_to?(method, include_all = false) ⇒ Boolean
118 119 120 |
# File 'lib/bundler/remote_specification.rb', line 118 def respond_to?(method, include_all = false) super || _remote_specification.respond_to?(method, include_all) end |
#sort_obj ⇒ Array
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.
76 77 78 |
# File 'lib/bundler/remote_specification.rb', line 76 def sort_obj [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1] end |
#to_s ⇒ Object
80 81 82 |
# File 'lib/bundler/remote_specification.rb', line 80 def to_s "#<#{self.class} name=#{name} version=#{version} platform=#{platform}>" end |