# 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() click to toggle source

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

new() click to toggle source

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

### Public Instance Methods

activated?() click to toggle source

True when the gem has been activated

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

base_dir() click to toggle source

Returns the full path to the base gem directory.

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

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

contains_requirable_file?(file) click to toggle source

Return true if this spec can require `file`.

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

datadir() click to toggle source

The path to the data directory for this gem.

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

default_gem?() click to toggle source

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

extension_dir() click to toggle source

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

    # File lib/rubygems/basic_specification.rb, line 97
    def extension_dir
      @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)).tap(&Gem::UNTAINT)
    end

extensions_dir() click to toggle source

Returns path to the extensions directory.

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

full_gem_path() click to toggle source

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

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

full_name() click to toggle source

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.

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

full_require_paths() click to toggle source

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

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

gem_dir() click to toggle source

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

    # File lib/rubygems/basic_specification.rb, line 192
    def gem_dir
      @gem_dir ||= File.expand_path File.join(gems_dir, full_name)
    end

gems_dir() click to toggle source

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

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

lib_dirs_glob() click to toggle source

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

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

matches_for_glob(glob) click to toggle source

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

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

name() click to toggle source

Name of the gem

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

platform() click to toggle source

Platform of the gem

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

plugins() click to toggle source

Returns the list of plugins in this spec.

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

require_paths() click to toggle source

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 = '.'

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

      [extension_dir].concat raw_require_paths
    end

source_paths() click to toggle source

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

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

stubbed?() click to toggle source

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.

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

this() click to toggle source

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

to_fullpath(path) click to toggle source

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

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

to_spec() click to toggle source

Return a `Gem::Specification` from this gem

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

version() click to toggle source

Version of the gem

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

### Private Instance Methods

have_extensions?() click to toggle source

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

have_file?(file, suffixes) click to toggle source

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