# class Gem::BasicSpecification

`BasicSpecification` is an abstract class which implements some common code used by both Specification and StubSpecification.

### Attributes

loaded_from [RW]

The path this gemspec was loaded from. This attribute is not persisted.

### Public Class Methods

default_specifications_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 37
    def self.default_specifications_dir
      Gem.default_specifications_dir
    end

new ()
Source

    # File lib/rubygems/basic_specification.rb, line 33
    def initialize
      internal_init
    end

### Public Instance Methods

activated? ()
Source

    # File lib/rubygems/basic_specification.rb, line 57
    def activated?
      raise NotImplementedError
    end

True when the gem has been activated

base_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 66
    def base_dir
      raise NotImplementedError
    end

Returns the full path to the base gem directory.

eg: /usr/local/lib/ruby/gems/1.8

base_dir_priority (gem_path)
Source

    # File lib/rubygems/basic_specification.rb, line 116
    def base_dir_priority(gem_path)
      gem_path.index(base_dir) || gem_path.size
    end

Gems higher up in `gem_path` take precedence

contains_requirable_file? (file)
Source

    # File lib/rubygems/basic_specification.rb, line 73
    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

Return true if this spec can require `file`.

datadir ()
Source

    # File lib/rubygems/basic_specification.rb, line 197
    def datadir
      # TODO: drop the extra ", gem_name" which is uselessly redundant
      File.expand_path(File.join(gems_dir, full_name, "data", name))
    end

The path to the data directory for this gem.

default_gem? ()
Source

    # File lib/rubygems/basic_specification.rb, line 101
    def default_gem?
      !loaded_from.nil? &&
        File.dirname(loaded_from) == Gem.default_specifications_dir
    end

default_gem_priority ()
Source

    # File lib/rubygems/basic_specification.rb, line 109
    def default_gem_priority
      default_gem? ? 1 : -1
    end

Regular gems take precedence over default gems

extension_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 123
    def extension_dir
      @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name))
    end

Returns full path to the directory where gem’s extensions are installed.

extensions_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 130
    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

Returns path to the extensions directory.

full_gem_path ()
Source

    # File lib/rubygems/basic_specification.rb, line 147
    def full_gem_path
      @full_gem_path ||= find_full_gem_path
    end

The full path to the gem (install path + full name).

TODO: This is duplicated with `gem_dir`. Eventually either of them should be deprecated.

full_name ()
Source

    # File lib/rubygems/basic_specification.rb, line 156
    def full_name
      if platform == Gem::Platform::RUBY || platform.nil?
        "#{name}-#{version}"
      else
        "#{name}-#{version}-#{platform}"
      end
    end

Returns the full name (name-version) of this `Gem`. Platform information is included (name-version-platform) if it is specified and not the default Ruby platform.

full_name_with_location ()
Source

    # File lib/rubygems/basic_specification.rb, line 169
    def full_name_with_location
      if base_dir != Gem.dir
        "#{full_name} in #{base_dir}"
      else
        full_name
      end
    end

Returns the full name of this `Gem` (see ‘Gem::BasicSpecification#full_name`). Information about where the gem is installed is also included if not installed in the default GEM_HOME.

full_require_paths ()
Source

    # File lib/rubygems/basic_specification.rb, line 181
    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

Full paths in the gem to add to `$LOAD_PATH` when this gem is activated.

gem_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 226
    def gem_dir
      @gem_dir ||= find_full_gem_path
    end

Returns the full path to this spec’s gem directory. eg: /usr/local/lib/ruby/1.8/gems/mygem-1.0

TODO: This is duplicated with `full_gem_path`. Eventually either of them should be deprecated.

gems_dir ()
Source

    # File lib/rubygems/basic_specification.rb, line 234
    def gems_dir
      raise NotImplementedError
    end

Returns the full path to the gems directory containing this spec’s gem directory. eg: /usr/local/lib/ruby/1.8/gems

ignored? ()
Source

    # File lib/rubygems/basic_specification.rb, line 95
    def ignored?
      return @ignored unless @ignored.nil?

      @ignored = missing_extensions?
    end

Return true if this spec should be ignored because it’s missing extensions.

lib_dirs_glob ()
Source

    # File lib/rubygems/basic_specification.rb, line 324
    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

Returns a string usable in `Dir.glob` to match all requirable paths for this spec.

matches_for_glob (glob)
Source

    # File lib/rubygems/basic_specification.rb, line 307
    def matches_for_glob(glob) # TODO: rename?
      glob = File.join(lib_dirs_glob, glob)

      Dir[glob]
    end

Return all files in this gem that match for `glob`.

name ()
Source

    # File lib/rubygems/basic_specification.rb, line 248
    def name
      raise NotImplementedError
    end

Name of the gem

platform ()
Source

    # File lib/rubygems/basic_specification.rb, line 255
    def platform
      raise NotImplementedError
    end

Platform of the gem

plugins ()
Source

    # File lib/rubygems/basic_specification.rb, line 316
    def plugins
      matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}")
    end

Returns the list of plugins in this spec.

require_paths ()
Source

    # File lib/rubygems/basic_specification.rb, line 280
    def require_paths
      return raw_require_paths unless have_extensions?

      [extension_dir].concat raw_require_paths
    end

Paths in the gem to add to `$LOAD_PATH` when this gem is activated.

See also require_paths=

If you have an extension you do not need to add `"ext"` to the require path, the extension build process will copy the extension files into “lib” for you.

The default value is `"lib"`

Usage:

    # If all library files are in the root directory...
    spec.require_path = '.'

source_paths ()
Source

    # File lib/rubygems/basic_specification.rb, line 290
    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

Returns the paths to the source files for use with analysis and documentation tools. These paths are relative to full_gem_path.

stubbed? ()
Source

    # File lib/rubygems/basic_specification.rb, line 356
    def stubbed?
      raise NotImplementedError
    end

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

this ()
Source

    # File lib/rubygems/basic_specification.rb, line 360
    def this
      self
    end

to_fullpath (path)
Source

    # File lib/rubygems/basic_specification.rb, line 206
    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

Full path of the target library file. If the file is not in this gem, return nil.

to_spec ()
Source

    # File lib/rubygems/basic_specification.rb, line 341
    def to_spec
      raise NotImplementedError
    end

Return a `Gem::Specification` from this gem

version ()
Source

    # File lib/rubygems/basic_specification.rb, line 348
    def version
      raise NotImplementedError
    end

Version of the gem

### Private Instance Methods

have_extensions? ()
Source

    # File lib/rubygems/basic_specification.rb, line 366
    def have_extensions?
      !extensions.empty?
    end

have_file? (file, suffixes)
Source

    # File lib/rubygems/basic_specification.rb, line 370
    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