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 base_dir_priority(gem_path)

def base_dir_priority(gem_path)
  gem_path.index(base_dir) || gem_path.size
end

def contains_requirable_file?(file)

def contains_requirable_file?(file)
  if ignored?
    if platform == Gem::Platform::RUBY || Gem::Platform.local === platform
      warn "Ignoring #{full_name} because its extensions are not built. " \
           "Try: gem pristine #{name} --version #{version}"
    end
    return false
  end
  is_soext = file.end_with?(".so", ".o")
  if is_soext
    have_file? file.delete_suffix(File.extname(file)), Gem.dynamic_library_suffixes
  else
    have_file? file, Gem.suffixes
  end
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))
end

def default_gem?

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

def default_gem_priority

def default_gem_priority
  default_gem? ? 1 : -1
end

def extension_dir

def extension_dir
  @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name))
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:
  File.expand_path File.join(gems_dir, full_name)
end

def full_gem_path

def full_gem_path
  @full_gem_path ||= find_full_gem_path
end

def full_name

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

def full_name_with_location

def full_name_with_location
  if base_dir != Gem.dir
    "#{full_name} in #{base_dir}"
  else
    full_name
  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
      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 ||= find_full_gem_path
end

def gems_dir

def gems_dir
  raise NotImplementedError
end

def have_extensions?

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, file)
    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 ignored?

def ignored?
  return @ignored unless @ignored.nil?
  @ignored = missing_extensions?
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 raw_require_paths
    if raw_require_paths.size > 1
      "{#{raw_require_paths.join(",")}}"
    else
      raw_require_paths.first
    end
  else
    "lib" # default value for require_paths for bundler/inline
  end
  "#{full_gem_path}/#{dirs}"
end

def matches_for_glob(glob) # TODO: rename?

TODO: rename?
def matches_for_glob(glob) # TODO: rename?
  glob = File.join(lib_dirs_glob, glob)
  Dir[glob]
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

def this
  self
end

def to_fullpath(path)

def to_fullpath(path)
  if activated?
    @paths_map ||= {}
    Gem.suffixes.each do |suf|
      full_require_paths.each do |dir|
        fullpath = "#{dir}/#{path}#{suf}"
        next unless File.file?(fullpath)
        @paths_map[path] ||= fullpath
      end
    end
    @paths_map[path]
  end
end

def to_spec

def to_spec
  raise NotImplementedError
end

def version

def version
  raise NotImplementedError
end