class Gem::StubSpecification

def self.default_gemspec_stub(filename, base_dir, gems_dir)

def self.default_gemspec_stub(filename, base_dir, gems_dir)
  new filename, base_dir, gems_dir, true
end

def self.gemspec_stub(filename, base_dir, gems_dir)

def self.gemspec_stub(filename, base_dir, gems_dir)
  new filename, base_dir, gems_dir, false
end

def <=>(other) # :nodoc:

:nodoc:
def <=>(other) # :nodoc:
  sort_obj <=> other.sort_obj
end

def ==(other) # :nodoc:

:nodoc:
def ==(other) # :nodoc:
  self.class === other &&
    name == other.name &&
    version == other.version &&
    platform == other.platform
end

def activated?

def activated?
  @activated ||= !loaded_spec.nil?
end

def build_extensions # :nodoc:

:nodoc:
def build_extensions # :nodoc:
  return if default_gem?
  return if extensions.empty?
  to_spec.build_extensions
end

def data

def data
  unless @data
    begin
      saved_lineno = $.
      Gem.open_file loaded_from, OPEN_MODE do |file|
        file.readline # discard encoding line
        stubline = file.readline
        if stubline.start_with?(PREFIX)
          extline = file.readline
          extensions =
            if extline.delete_prefix!(PREFIX)
              extline.chomp!
              extline.split "\0"
            else
              StubLine::NO_EXTENSIONS
            end
          stubline.chomp! # readline(chomp: true) allocates 3x as much as .readline.chomp!
          @data = StubLine.new stubline, extensions
        end
      rescue EOFError
      end
    ensure
      $. = saved_lineno
    end
  end
  @data ||= to_spec
end

def default_gem?

def default_gem?
  @default_gem
end

def extensions

def extensions
  data.extensions
end

def full_name

def full_name
  data.full_name
end

def hash # :nodoc:

:nodoc:
def hash # :nodoc:
  name.hash ^ version.hash ^ platform.hash
end

def initialize(filename, base_dir, gems_dir, default_gem)

def initialize(filename, base_dir, gems_dir, default_gem)
  super()
  self.loaded_from = filename
  @data            = nil
  @name            = nil
  @spec            = nil
  @base_dir        = base_dir
  @gems_dir        = gems_dir
  @default_gem     = default_gem
end

def loaded_spec

def loaded_spec
  spec = Gem.loaded_specs[name]
  return unless spec && spec.version == version && spec.default_gem? == default_gem?
  spec
end

def missing_extensions?

def missing_extensions?
  return false if default_gem?
  return false if extensions.empty?
  return false if File.exist? gem_build_complete_path
  to_spec.missing_extensions?
end

def name

def name
  data.name
end

def platform

def platform
  data.platform
end

def raw_require_paths # :nodoc:

:nodoc:
def raw_require_paths # :nodoc:
  data.require_paths
end

def sort_obj # :nodoc:

:nodoc:
def sort_obj # :nodoc:
  [name, version, Gem::Platform.sort_priority(platform)]
end

def spec

def spec
  @spec ||= loaded_spec if @data
  @spec ||= Gem::Specification.load(loaded_from)
end

def stubbed?

def stubbed?
  data.is_a? StubLine
end

def valid?

def valid?
  data
end

def version

def version
  data.version
end