123456789_123456789_123456789_123456789_123456789_

Class: Bundler::EndpointSpecification

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Gem::Specification
Defined in: lib/bundler/endpoint_specification.rb

Overview

used for Creating Specifications from the Gemcutter Endpoint

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

FetchMetadata - Included

::Gem::Specification - Inherited

MatchMetadata - Included

Constructor Details

.new(name, version, suffix, spec_fetcher, dependencies, metadata = nil) ⇒ EndpointSpecification

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 12

def initialize(name, version, suffix, spec_fetcher, dependencies,  = nil)
  super()
  @name         = name
  @version      = Gem::Version.create version
  @spec_fetcher = spec_fetcher
  @dependencies = nil
  @unbuilt_dependencies = dependencies
  @content_address = nil
  @required_platform = nil

  @loaded_from          = nil
  @remote_specification = nil
  @locked_platform = nil

  ()

  if Gem::ContentAddress.content_addressed_row?(suffix, @required_platform, @required_ruby_version)
    @content_address = suffix
    @platform = @required_platform
    @required_rubygems_version ||= Gem::Requirement.default
  else
    @platform = Gem::Platform.new(suffix)
  end
end

Instance Attribute Details

#checksum (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

#content_address (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

#created_at (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

#dependencies (rw) Also known as: #runtime_dependencies

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 45

def dependencies
  @dependencies ||= @unbuilt_dependencies.map! {|dep, reqs| build_dependency(dep, reqs) }
end

#dependencies=(value) (rw)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 9

attr_writer :dependencies

#insecurely_materialized?Boolean (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 37

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

#locked_platform (rw)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 10

attr_accessor :remote, :locked_platform

#name (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

#platform (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

#remote (rw)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 10

attr_accessor :remote, :locked_platform

#runtime_dependencies (readonly)

Alias for #dependencies.

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 48

alias_method :runtime_dependencies, :dependencies

#version (readonly)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 8

attr_reader :name, :version, :platform, :checksum, :created_at, :content_address

Instance Method Details

#__swap__(spec)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 147

def __swap__(spec)
  SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
  @remote_specification = spec
end

#_local_specification

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 140

def _local_specification
  return unless @loaded_from && File.exist?(local_specification_path)
  eval(File.read(local_specification_path), nil, local_specification_path).tap do |spec|
    spec.loaded_from = @loaded_from
  end
end

#_remote_specification (private)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 158

def _remote_specification
  suffix = @content_address || @platform
  @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, suffix])
end

#bindir

needed for bundle clean

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 97

def bindir
  if @remote_specification
    @remote_specification.bindir
  elsif _local_specification
    _local_specification.bindir
  else
    super
  end
end

#build_dependency(name, requirements) (private)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 228

def build_dependency(name, requirements)
  Dependency.new(name, requirements)
end

#executables

needed for binstubs

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 86

def executables
  if @remote_specification
    @remote_specification.executables
  elsif _local_specification
    _local_specification.executables
  else
    super
  end
end

#extensions

needed for "with native extensions" during install

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 119

def extensions
  if @remote_specification
    @remote_specification.extensions
  elsif _local_specification
    _local_specification.extensions
  else
    super
  end
end

#fetch_platform

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 41

def fetch_platform
  @platform
end

#inspect

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 152

def inspect
  "#<#{self.class} @name=\"#{name}\" (#{full_name.delete_prefix("#{name}-")})>"
end

#load_paths

needed for inline

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 76

def load_paths
  # remote specs aren't installed, and can't have load_paths
  if _local_specification
    _local_specification.load_paths
  else
    super
  end
end

#local_specification_path (private)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 163

def local_specification_path
  File.join(Gem::SpecificationRecord.specification_dir_for(self, base_dir),
            "#{full_name}.gemspec")
end

#metadata

needed for bundle fund

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 130

def 
  if @remote_specification
    @remote_specification.
  elsif _local_specification
    _local_specification.
  else
    super
  end
end

#parse_created_at(value) (private)

A timestamp without a time zone offset is read as UTC, because reading it as local time would shift the cooldown window by the environment's offset. Unparsable values and years outside four digits become nil so the cooldown fails open.

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 217

def parse_created_at(value)
  return unless value.is_a?(String) && value.match?(FOUR_DIGIT_YEAR)

  require "time"
  begin
    Time.iso8601(value.match?(TIME_ZONE_SUFFIX) ? value : "#{value}Z")
  rescue ArgumentError
    nil
  end
end

#parse_metadata(data) (private)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 168

def (data)
  @created_at = nil

  unless data
    @required_ruby_version = nil
    @required_rubygems_version = nil
    return
  end

  data.each do |k, v|
    next unless v
    case k.to_s
    when "checksum"
      # Some registries send empty checksum values, treat them as if the
      # checksum was not included at all
      checksum = v.last
      next unless checksum

      begin
        @checksum = Checksum.from_api(checksum, @spec_fetcher.uri)
      rescue ArgumentError => e
        raise ArgumentError, "Invalid checksum for #{full_name}: #{e.message}"
      end
    when "rubygems"
      @required_rubygems_version = Gem::Requirement.new(v)
    when "ruby"
      @required_ruby_version = Gem::Requirement.new(v)
    when "created_at"
      @created_at = parse_created_at(v.is_a?(Array) ? v.last : v)&.freeze
    when "platform"
      @required_platform = required_platform_from(Array(v).last)
    end
  end
rescue StandardError => e
  raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
end

#post_install_message

needed for post_install_messages during install

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 108

def post_install_message
  if @remote_specification
    @remote_specification.post_install_message
  elsif _local_specification
    _local_specification.post_install_message
  else
    super
  end
end

#raw_require_paths

#require_paths is overridden above, but full_require_paths (and so #load_paths) is computed from raw_require_paths, which would otherwise report the default lib for every gem

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 65

def raw_require_paths
  if @remote_specification
    @remote_specification.raw_require_paths
  elsif _local_specification
    _local_specification.raw_require_paths
  else
    super
  end
end

#require_paths

needed for standalone, load required_paths from local gemspec after the gem is installed

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 52

def require_paths
  if @remote_specification
    @remote_specification.require_paths
  elsif _local_specification
    _local_specification.require_paths
  else
    super
  end
end

#required_platform_from(value) (private)

[ GitHub ]

  
# File 'lib/bundler/endpoint_specification.rb', line 232

def required_platform_from(value)
  value = value.to_s
  return if value.empty?

  Gem::Platform.new(value)
end