class Pod::Dependency

The Dependency allows to specify dependencies of a {Podfile} or a {Specification} on a Pod. It stores the name of the dependency, version requirements and external sources information.

This class is based on the dependency class of RubyGems and mimics its implementation with adjustments specific to CocoaPods. RubyGems is available under the [MIT license](github.com/rubygems/rubygems/blob/master/MIT.txt).

Attributes

external_source[RW]

@return [Hash{Symbol=>String}] a hash describing the external source

where the pod should be fetched. The external source has to
provide its own {Specification} file.
name[RW]

@return [String] The name of the Pod described by this dependency.

podspec_repo[RW]

@return [String] The source URL of the podspec repo to use to resolve

this dependency. If not set then the standard source list
should be used to resolve the dependency.
specific_version[RW]

@return [Version] whether the dependency points to a specific version.

Public Class Methods

from_string(string) click to toggle source

Generates a dependency from its string representation.

@param [String] string

The string that describes the dependency generated from
{#to_s}.

@note The information about external sources is not completely

serialized in the string representation and should be stored a
part by clients that need to create a dependency equal to the
original one.

@return [Dependency] the dependency described by the string.

# File lib/cocoapods-core/dependency.rb, line 349
def self.from_string(string)
  match_data = string.match(/((?:\s?[^\s(])+)( (?:.*))?/)
  name = match_data[1]
  version = match_data[2]
  version = version.gsub(/[()]/, '') if version
  case version
  when nil, /from `(.*)(`|')/
    Dependency.new(name)
  else
    version_requirements = version.split(',') if version
    Dependency.new(name, version_requirements)
  end
end
new(name = nil, *requirements) click to toggle source

@overload initialize(name, requirements)

@param    [String] name
          the name of the Pod.

@param    [Array, Version, String, Requirement] requirements
          an array specifying the version requirements of the
          dependency.

@example  Initialization with version requirements.

          Dependency.new('AFNetworking')
          Dependency.new('AFNetworking', '~> 1.0')
          Dependency.new('AFNetworking', '>= 0.5', '< 0.7')

@overload initialize(name, external_source)

@param    [String] name
          the name of the Pod.

@param    [Hash] external_source
          a hash describing the external source.

@example  Initialization with an external source.

          Dependency.new('libPusher', {:git     => 'example.com/repo.git'})
          Dependency.new('libPusher', {:path    => 'path/to/folder'})
          Dependency.new('libPusher', {:podspec => 'example.com/libPusher.podspec'})

@overload initialize(name, requirements, podspec_repo)

@param    [String] name
          the name of the Pod.

@param    [Array, Version, String, Requirement] requirements
          an array specifying the version requirements of the
          dependency.

@param    [Hash] podspec_repo
          The URL of the specific podspec repo to resolve this dependency from.

@example  Initialization with a specific podspec repo

          Dependency.new('Artsy+UILabels', '~> 1.0', :source => 'https://github.com/Artsy/Specs.git')
# File lib/cocoapods-core/dependency.rb, line 72
def initialize(name = nil, *requirements)
  if requirements.last.is_a?(Hash)
    additional_params = requirements.pop.select { |_, v| !v.nil? }
    additional_params = nil if additional_params.empty?

    if additional_params && @podspec_repo = additional_params[:source]
      # This dependency specifies the exact source podspec repo to use.
      additional_params.delete(:source)
      unless additional_params.empty?
        raise Informative, 'A dependency with a specified podspec repo may ' \
          "not include other source parameters (#{name})."
      end
    elsif @external_source = additional_params
      unless requirements.empty?
        raise Informative, 'A dependency with an external source may not ' \
          "specify version requirements (#{name})."
      end
    end

  elsif requirements.last == :head
    raise Informative, '`:head` dependencies have been removed. Please use ' \
      "normal external source dependencies (`:git => 'GIT_REPO_URL'`) " \
      "instead of `:head` for `#{name}`."
  end

  if requirements.length == 1 && requirements.first.is_a?(Requirement)
    requirements = requirements.first
  end
  @name = name
  @requirement = Requirement.create(requirements)
end

Public Instance Methods

<=>(other) click to toggle source

@return [Fixnum] How the dependency should be sorted respect to another

one according to its name.
# File lib/cocoapods-core/dependency.rb, line 220
def <=>(other)
  name <=> other.name
end
==(other) click to toggle source

@return [Bool] whether the dependency is equal to another taking into

account the loaded specification, the head options and the
external source.
# File lib/cocoapods-core/dependency.rb, line 201
def ==(other)
  self.class == other.class &&
    name == other.name &&
    external_source == other.external_source &&
    podspec_repo == other.podspec_repo &&
    requirement == other.requirement
end
Also aliased as: eql?
compatible?(other) click to toggle source

Checks if a dependency would be satisfied by the requirements of another dependency.

@param [Dependency] other

the other dependency.

@note This is used by the Lockfile to check if a stored dependency is

still compatible with the Podfile.

@return [Bool] whether the dependency is compatible with the given one.

# File lib/cocoapods-core/dependency.rb, line 188
def compatible?(other)
  return false unless name == other.name
  return false unless external_source == other.external_source

  other.requirement.requirements.all? do |_operator, version|
    requirement.satisfied_by? Version.new(version)
  end
end
eql?(other)
Alias for: ==
external?() click to toggle source

@return [Bool] whether the dependency points to an external source.

# File lib/cocoapods-core/dependency.rb, line 132
def external?
  !@external_source.nil?
end
hash() click to toggle source

@return [Fixnum] The hash value based on the name and on the requirements.

# File lib/cocoapods-core/dependency.rb, line 213
def hash
  name.hash ^ requirement.hash
end
inspect() click to toggle source

@return [String] a string representation suitable for debugging.

# File lib/cocoapods-core/dependency.rb, line 365
def inspect
  "<#{self.class} name=#{name} requirements=#{requirement} " \
    "source=#{podspec_repo || 'nil'} external_source=#{external_source || 'nil'}>"
end
local?() click to toggle source

@return [Bool] whether the dependency points to a local path.

# File lib/cocoapods-core/dependency.rb, line 138
def local?
  if external_source
    external_source[:path]
  end
end
match?(name, version) click to toggle source

Checks whether the dependency would be satisfied by the specification with the given name and version.

@param [String]

The proposed name.

@param [String, Version] version

The proposed version.

@return [Bool] Whether the dependency is satisfied.

# File lib/cocoapods-core/dependency.rb, line 296
def match?(name, version)
  return false unless self.name == name
  return true if requirement.none?
  requirement.satisfied_by?(Version.new(version))
end
merge(other) click to toggle source

Merges the version requirements of the dependency with another one.

@param [Dependency] other

the other dependency to merge with.

@note If one of the dependencies specifies an external source or is head,

the resulting dependency preserves this attributes.

@return [Dependency] a dependency (not necessarily a new instance) that

also includes the version requirements of the given one.
# File lib/cocoapods-core/dependency.rb, line 235
def merge(other)
  unless name == other.name
    raise ArgumentError, "#{self} and #{other} have different names"
  end

  default   = Requirement.default
  self_req  = requirement
  other_req = other.requirement

  req = if other_req == default
          self_req
        elsif self_req == default
          other_req
        else
          self_req.as_list.concat(other_req.as_list)
        end

  opts = {}

  if external_source || other.external_source
    opts.
      merge!(external_source || {}).
      merge!(other.external_source || {})

    req_to_set = req
    req = []
  end

  if podspec_repo && other.podspec_repo && podspec_repo != other.podspec_repo
    raise ArgumentError, "#{self} and #{other} have different podspec repos"
  end

  if repo = podspec_repo || other.podspec_repo
    opts[:source] = repo
  end

  self.class.new(name, *req, opts).tap do |dep|
    dep.instance_variable_set(:@requirement, Requirement.create(req_to_set)) if req_to_set
  end
end
prerelease?() click to toggle source

Whether the dependency has any pre-release requirements

@return [Bool] Whether the dependency has any pre-release requirements

# File lib/cocoapods-core/dependency.rb, line 280
def prerelease?
  return @prerelease if defined?(@prerelease)
  @prerelease = requirement.requirements.any? { |_op, version| version.prerelease? }
end
requirement() click to toggle source

@return [Requirement] the requirement of this dependency (a set of

one or more version restrictions).
# File lib/cocoapods-core/dependency.rb, line 111
def requirement
  @specific_requirement || @requirement
end
root_name() click to toggle source

Returns the name of the Pod that the dependency is pointing to.

@note In case this is a dependency for a subspec, e.g.

'RestKit/Networking', this returns 'RestKit', which is what the
Pod::Source needs to know to retrieve the correct {Specification}
from disk.

@return [String] the name of the Pod.

# File lib/cocoapods-core/dependency.rb, line 173
def root_name
  subspec_dependency? ? @name.split('/').first : @name
end
specific_version=(version) click to toggle source

@param [Version] version the specific version to point to

# File lib/cocoapods-core/dependency.rb, line 117
def specific_version=(version)
  @specific_version = version
  @specific_requirement = if version
                            Requirement.new(Version.new(version.version))
                          end
end
subspec_dependency?() click to toggle source

@return [Bool] whether the dependency points to a subspec.

# File lib/cocoapods-core/dependency.rb, line 126
def subspec_dependency?
  @name.include?('/')
end
to_root_dependency() click to toggle source

Creates a new dependency with the name of the top level spec and the same version requirements.

@note This is used by the {Specification::Set} class to merge

dependencies and resolve the required version of a Pod regardless
what particular specification (subspecs or top level) is
required.

@todo This should not use `dup`. The `name` property should be an

attr_reader.

@return [Dependency] a dependency with the same versions requirements

that is guaranteed to point to a top level specification.
# File lib/cocoapods-core/dependency.rb, line 158
def to_root_dependency
  dep = dup
  dep.name = root_name
  dep
end
to_s() click to toggle source

Creates a string representation of the dependency suitable for serialization and de-serialization without loss of information. The string is also suitable for UI.

@note This representation is used by the {Lockfile}.

@example Output examples

"libPusher"
"libPusher (= 1.0)"
"libPusher (~> 1.0.1)"
"libPusher (> 1.0, < 2.0)"
"libPusher (from `www.example.com')"
"libPusher (defined in Podfile)"
"RestKit/JSON"

@return [String] the representation of the dependency.

# File lib/cocoapods-core/dependency.rb, line 324
def to_s
  version = ''
  if external?
    version << external_source_description(external_source)
  elsif requirement != Requirement.default
    version << requirement.to_s
  end
  result = @name.dup
  result << " (#{version})" unless version.empty?
  result
end

Private Instance Methods

external_source_description(source) click to toggle source

Creates a string representation of the external source suitable for UI.

@example Output examples

"from `www.example.com/libPusher.git', tag `v0.0.1'"
"from `www.example.com/libPusher.podspec'"
"from `~/path/to/libPusher'"

@todo Improve the description for Mercurial and Subversion.

@return [String] the description of the external source.

# File lib/cocoapods-core/dependency.rb, line 386
def external_source_description(source)
  if source.key?(:git)
    desc =  "`#{source[:git]}`"
    desc << ", commit `#{source[:commit]}`" if source[:commit]
    desc << ", branch `#{source[:branch]}`" if source[:branch]
    desc << ", tag `#{source[:tag]}`"       if source[:tag]
  elsif source.key?(:hg)
    desc =  "`#{source[:hg]}`"
  elsif source.key?(:svn)
    desc =  "`#{source[:svn]}`"
  elsif source.key?(:podspec)
    desc = "`#{source[:podspec]}`"
  elsif source.key?(:path)
    desc = "`#{source[:path]}`"
  else
    desc = "`#{source}`"
  end
  "from #{desc}"
end