Maintenance of Ruby 2.0.0 ended on February 24, 2016. Read more

In Files

  • rubygems/dependency.rb

Class/Module Index [+]





Valid dependency types.



Dependency name or regular expression.


Allows you to force this dependency to be a prerelease.

Public Class Methods

new(name, *requirements) click to toggle source

Constructs a dependency with name and requirements. The last argument can optionally be the dependency type, which defaults to :runtime.

               # File rubygems/dependency.rb, line 37
def initialize name, *requirements
  case name
  when String then # ok
  when Regexp then
    msg = ["NOTE: w/ a regexp is deprecated.",
           " called from #{Gem.location_of_caller.join(":")}"]
    warn msg.join("\n") unless Gem::Deprecate.skip
    raise ArgumentError,
          "dependency name must be a String, was #{name.inspect}"

  type         = Symbol === requirements.last ? requirements.pop : :runtime
  requirements = requirements.first if 1 == requirements.length # unpack

  unless TYPES.include? type
    raise ArgumentError, "Valid types are #{TYPES.inspect}, " +
                         "not #{type.inspect}"

  @name        = name
  @requirement = Gem::Requirement.create requirements
  @type        = type
  @prerelease  = false

  # This is for Marshal backwards compatibility. See the comments in
  # +requirement+ for the dirty details.

  @version_requirements = @requirement

Public Instance Methods

<=>(other) click to toggle source

Dependencies are ordered by name.

               # File rubygems/dependency.rb, line 178
def <=> other <=>
=~(other) click to toggle source

Uses this dependency as a pattern to compare to other. This dependency will match if the name matches the other’s name, and other has only an equal version requirement that satisfies this dependency.

               # File rubygems/dependency.rb, line 188
def =~ other
  unless Gem::Dependency === other
    return unless other.respond_to?(:name) && other.respond_to?(:version)
    other =, other.version

  return false unless name ===

  reqs = other.requirement.requirements

  return false unless reqs.length == 1
  return false unless reqs.first.first == '='

  version = reqs.first.last

  requirement.satisfied_by? version
latest_version?() click to toggle source

Is this dependency simply asking for the latest version of a gem?

               # File rubygems/dependency.rb, line 97
def latest_version?
match?(obj, version=nil) click to toggle source

DOC: this method needs either documented or :nodoc’d

               # File rubygems/dependency.rb, line 208
def match? obj, version=nil
  if !version
    name =
    version = obj.version
    name = obj

  return false unless === name
  return true if requirement.none?

matches_spec?(spec) click to toggle source

DOC: this method needs either documented or :nodoc’d

               # File rubygems/dependency.rb, line 224
def matches_spec? spec
  return false unless name ===
  return true  if requirement.none?

matching_specs(platform_only = false) click to toggle source

DOC: this method needs either documented or :nodoc’d

               # File rubygems/dependency.rb, line 252
def matching_specs platform_only = false
  matches = Gem::Specification.find_all { |spec| === and # TODO: == instead of ===
      requirement.satisfied_by? spec.version

  if platform_only
    matches.reject! { |spec|
      not Gem::Platform.match spec.platform

  matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
merge(other) click to toggle source

Merges the requirements of other into this dependency

               # File rubygems/dependency.rb, line 234
def merge other
  unless name == then
    raise ArgumentError,
          "#{self} and #{other} have different names"

  default = Gem::Requirement.default
  self_req  = self.requirement
  other_req = other.requirement

  return name, self_req  if other_req == default
  return name, other_req if self_req  == default name, self_req.as_list.concat(other_req.as_list)
prerelease?() click to toggle source

Does this dependency require a prerelease?

               # File rubygems/dependency.rb, line 89
def prerelease?
  @prerelease || requirement.prerelease?
requirement() click to toggle source

What does this dependency require?

               # File rubygems/dependency.rb, line 119
def requirement
  return @requirement if defined?(@requirement) and @requirement

  # @version_requirements and @version_requirement are legacy ivar
  # names, and supported here because older gems need to keep
  # working and Dependency doesn't implement marshal_dump and
  # marshal_load. In a happier world, this would be an
  # attr_accessor. The horrifying instance_variable_get you see
  # below is also the legacy of some old restructurings.
  # Note also that because of backwards compatibility (loading new
  # gems in an old RubyGems installation), we can't add explicit
  # marshaling to this class until we want to make a big
  # break. Maybe 2.0.
  # Children, define explicit marshal and unmarshal behavior for
  # public classes. Marshal formats are part of your public API.

  # REFACTOR: See above

  if defined?(@version_requirement) && @version_requirement
    version = @version_requirement.instance_variable_get :@version
    @version_requirement  = nil
    @version_requirements = version

  @requirement = @version_requirements if defined?(@version_requirements)
requirements_list() click to toggle source

DOC: this method needs documentation or :nodoc”d

               # File rubygems/dependency.rb, line 149
def requirements_list
specific?() click to toggle source

True if the dependency will not always match the latest version.

               # File rubygems/dependency.rb, line 270
def specific?
to_spec() click to toggle source

DOC: this method needs either documented or :nodoc’d

               # File rubygems/dependency.rb, line 306
def to_spec
  matches = self.to_specs

  matches.find { |spec| spec.activated? } or matches.last
to_specs() click to toggle source

DOC: this method needs either documented or :nodoc’d

               # File rubygems/dependency.rb, line 276
def to_specs
  matches = matching_specs true

  # TODO: check Gem.activated_spec[] in case matches falls outside

  if matches.empty? then
    specs = Gem::Specification.find_all { |s|
     == name
            }.map { |x| x.full_name }

    if specs.empty?
      total = Gem::Specification.to_a.size
      error =            "Could not find '#{name}' (#{requirement}) among #{total} total gem(s)"
      error =            "Could not find '#{name}' (#{requirement}) - did find: [#{specs.join ','}]"
    end        =
    error.requirement = self.requirement
    raise error

  # TODO: any other resolver validations should go here

type() click to toggle source

Dependency type.

               # File rubygems/dependency.rb, line 164
def type
  @type ||= :runtime

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit