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 || 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