class Gem::BasicSpecification

def self.default_specifications_dir

def self.default_specifications_dir
  Gem.default_specifications_dir
end

def activated?

def activated?
  raise NotImplementedError
end

def base_dir

def base_dir
  raise NotImplementedError
end

def contains_requirable_file?(file)

def contains_requirable_file?(file)
  if @ignored
    return false
  elsif missing_extensions?
    @ignored = true
    if Gem::Platform::RUBY == platform || Gem::Platform.local === platform
      warn "Ignoring #{full_name} because its extensions are not built. " +
        "Try: gem pristine #{name} --version #{version}"
    end
    return false
  end
  have_file? file, Gem.suffixes
end

def datadir

def datadir
  # TODO: drop the extra ", gem_name" which is uselessly redundant
  File.expand_path(File.join(gems_dir, full_name, "data", name)).tap(&Gem::UNTAINT)
end

def default_gem?

def default_gem?
  loaded_from &&
    File.dirname(loaded_from) == Gem.default_specifications_dir
end

def extension_dir

def extension_dir
  @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)).tap(&Gem::UNTAINT)
end

def extensions_dir

def extensions_dir
  Gem.default_ext_dir_for(base_dir) ||
    File.join(base_dir, 'extensions', Gem::Platform.local.to_s,
              Gem.extension_api_version)
end

def find_full_gem_path # :nodoc:

:nodoc:
def find_full_gem_path # :nodoc:
  # TODO: also, shouldn't it default to full_name if it hasn't been written?
  path = File.expand_path File.join(gems_dir, full_name)
  path.tap(&Gem::UNTAINT)
  path
end

def full_gem_path

def full_gem_path
  # TODO: This is a heavily used method by gems, so we'll need
  # to aleast just alias it to #gem_dir rather than remove it.
  @full_gem_path ||= find_full_gem_path
end

def full_name

def full_name
  if platform == Gem::Platform::RUBY or platform.nil?
    "#{name}-#{version}".dup.tap(&Gem::UNTAINT)
  else
    "#{name}-#{version}-#{platform}".dup.tap(&Gem::UNTAINT)
  end
end

def full_require_paths

def full_require_paths
  @full_require_paths ||=
  begin
    full_paths = raw_require_paths.map do |path|
      File.join full_gem_path, path.tap(&Gem::UNTAINT)
    end
    full_paths << extension_dir if have_extensions?
    full_paths
  end
end

def gem_build_complete_path # :nodoc:

:nodoc:
def gem_build_complete_path # :nodoc:
  File.join extension_dir, 'gem.build_complete'
end

def gem_dir

def gem_dir
  @gem_dir ||= File.expand_path File.join(gems_dir, full_name)
end

def gems_dir

def gems_dir
  raise NotImplementedError
end

def have_extensions?; !extensions.empty?; end

def have_extensions?; !extensions.empty?; end

def have_file?(file, suffixes)

def have_file?(file, suffixes)
  return true if raw_require_paths.any? do |path|
    base = File.join(gems_dir, full_name, path.tap(&Gem::UNTAINT), file).tap(&Gem::UNTAINT)
    suffixes.any? {|suf| File.file? base + suf }
  end
  if have_extensions?
    base = File.join extension_dir, file
    suffixes.any? {|suf| File.file? base + suf }
  else
    false
  end
end

def initialize

def initialize
  internal_init
end

def internal_init # :nodoc:

:nodoc:
def internal_init # :nodoc:
  @extension_dir = nil
  @full_gem_path = nil
  @gem_dir = nil
  @ignored = nil
end

def lib_dirs_glob

def lib_dirs_glob
  dirs = if self.raw_require_paths
           if self.raw_require_paths.size > 1
             "{#{self.raw_require_paths.join(',')}}"
           else
             self.raw_require_paths.first
           end
         else
           "lib" # default value for require_paths for bundler/inline
         end
  "#{self.full_gem_path}/#{dirs}".dup.tap(&Gem::UNTAINT)
end

def matches_for_glob(glob) # TODO: rename?

TODO: rename?
def matches_for_glob(glob) # TODO: rename?
  glob = File.join(self.lib_dirs_glob, glob)
  Dir[glob].map {|f| f.tap(&Gem::UNTAINT) } # FIX our tests are broken, run w/ SAFE=1
end

def name

def name
  raise NotImplementedError
end

def platform

def platform
  raise NotImplementedError
end

def plugins

def plugins
  matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}")
end

def raw_require_paths # :nodoc:

:nodoc:
def raw_require_paths # :nodoc:
  raise NotImplementedError
end

def require_paths

def require_paths
  return raw_require_paths unless have_extensions?
  [extension_dir].concat raw_require_paths
end

def source_paths

def source_paths
  paths = raw_require_paths.dup
  if have_extensions?
    ext_dirs = extensions.map do |extension|
      extension.split(File::SEPARATOR, 2).first
    end.uniq
    paths.concat ext_dirs
  end
  paths.uniq
end

def stubbed?

entire gemspec file.
about the gem from a stub line, without having to evaluate the
Whether this specification is stubbed - i.e. we have information
#
def stubbed?
  raise NotImplementedError
end

def this; self; end

def this; self; end

def to_fullpath(path)

def to_fullpath(path)
  if activated?
    @paths_map ||= {}
    @paths_map[path] ||=
    begin
      fullpath = nil
      suffixes = Gem.suffixes
      suffixes.find do |suf|
        full_require_paths.find do |dir|
          File.file?(fullpath = "#{dir}/#{path}#{suf}")
        end
      end ? fullpath : nil
    end
  else
    nil
  end
end

def to_spec

def to_spec
  raise NotImplementedError
end

def version

def version
  raise NotImplementedError
end