2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# BasicSpecification is an abstract class which implements some common code
|
|
|
|
# used by both Specification and StubSpecification.
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
class Gem::BasicSpecification
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# The path this gemspec was loaded from. This attribute is not persisted.
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
attr_reader :loaded_from
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def self.default_specifications_dir
|
|
|
|
File.join(Gem.default_dir, "specifications", "default")
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# True when the gem has been activated
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def activated?
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Returns the full path to the base gem directory.
|
|
|
|
#
|
|
|
|
# eg: /usr/local/lib/ruby/gems/1.8
|
|
|
|
|
|
|
|
def base_dir
|
|
|
|
return Gem.dir unless loaded_from
|
|
|
|
@base_dir ||= if default_gem? then
|
|
|
|
File.dirname File.dirname File.dirname loaded_from
|
|
|
|
else
|
|
|
|
File.dirname File.dirname loaded_from
|
|
|
|
end
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Return true if this spec can require +file+.
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def contains_requirable_file? file
|
|
|
|
root = full_gem_path
|
|
|
|
suffixes = Gem.suffixes
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
require_paths.any? do |lib|
|
|
|
|
base = "#{root}/#{lib}/#{file}"
|
|
|
|
suffixes.any? { |suf| File.file? "#{base}#{suf}" }
|
2013-07-09 19:21:36 -04:00
|
|
|
end
|
2013-08-26 16:24:51 -04:00
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def default_gem?
|
|
|
|
loaded_from &&
|
|
|
|
File.dirname(loaded_from) == self.class.default_specifications_dir
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
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.untaint
|
|
|
|
path if File.directory? path
|
|
|
|
end
|
|
|
|
|
|
|
|
private :find_full_gem_path
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# The full path to the gem (install path + full name).
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
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
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# 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.
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def full_name
|
|
|
|
if platform == Gem::Platform::RUBY or platform.nil? then
|
|
|
|
"#{name}-#{version}".untaint
|
|
|
|
else
|
|
|
|
"#{name}-#{version}-#{platform}".untaint
|
2013-07-09 19:21:36 -04:00
|
|
|
end
|
2013-08-26 16:24:51 -04:00
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Returns the full path to the gems directory containing this spec's
|
|
|
|
# gem directory. eg: /usr/local/lib/ruby/1.8/gems
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def gems_dir
|
|
|
|
# TODO: this logic seems terribly broken, but tests fail if just base_dir
|
|
|
|
@gems_dir ||= File.join(loaded_from && base_dir || Gem.dir, "gems")
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Set the path the Specification was loaded from. +path+ is converted to a
|
|
|
|
# String.
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def loaded_from= path
|
|
|
|
@loaded_from = path && path.to_s
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
@full_gem_path = nil
|
|
|
|
@gems_dir = nil
|
|
|
|
@base_dir = nil
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Name of the gem
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def name
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Platform of the gem
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def platform
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
##
|
|
|
|
# Require paths of the gem
|
2013-07-09 19:21:36 -04:00
|
|
|
|
2013-08-26 16:24:51 -04:00
|
|
|
def require_paths
|
|
|
|
raise NotImplementedError
|
2013-07-09 19:21:36 -04:00
|
|
|
end
|
2013-08-26 16:24:51 -04:00
|
|
|
|
|
|
|
##
|
|
|
|
# Return a Gem::Specification from this gem
|
|
|
|
|
|
|
|
def to_spec
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Version of the gem
|
|
|
|
|
|
|
|
def version
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
2013-07-09 19:21:36 -04:00
|
|
|
end
|
2013-08-26 16:24:51 -04:00
|
|
|
|