Class: Pod::Specification::Set

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-core/specification/set.rb,
lib/cocoapods-core/specification/set/presenter.rb,
lib/cocoapods-core/specification/set/statistics.rb

Overview

Note:

The alphabetical order of the sets is used to select a specification if multiple are available for a given version.

Note:

The set class is not and should be not aware of the backing store of a Source.

A Specification::Set is responsible of handling all the specifications of a Pod. This class stores the information of the dependencies that required a Pod in the resolution process.

Direct Known Subclasses

External

Defined Under Namespace

Classes: External, Presenter, Statistics

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, sources = []) ⇒ Set

Returns a new instance of Set.

Parameters:

  • name (String)

    the name of the Pod.

  • sources (Array<Source>, Source) (defaults to: [])

    the sources that contain a Pod.



37
38
39
40
41
42
43
# File 'lib/cocoapods-core/specification/set.rb', line 37

def initialize(name, sources = [])
  @name    = name
  sources  = sources.is_a?(Array) ? sources : [sources]
  @sources = sources.sort_by(&:name)
  @required_by  = []
  @dependencies = []
end

Instance Attribute Details

#nameString (readonly)

Returns the name of the Pod.

Returns:

  • (String)

    the name of the Pod.



24
25
26
# File 'lib/cocoapods-core/specification/set.rb', line 24

def name
  @name
end

#sourcesArray<Source> (readonly)

Returns the sources that contain the specifications for the available versions of a Pod.

Returns:

  • (Array<Source>)

    the sources that contain the specifications for the available versions of a Pod.



29
30
31
# File 'lib/cocoapods-core/specification/set.rb', line 29

def sources
  @sources
end

Instance Method Details

#==(other) ⇒ Object



144
145
146
# File 'lib/cocoapods-core/specification/set.rb', line 144

def ==(other)
  self.class === other && @name == other.name && @sources.map(&:name) == other.sources.map(&:name)
end

#dependencyDependency

Returns a dependency that includes all the versions requirements of the stored dependencies.

Returns:

  • (Dependency)

    a dependency that includes all the versions requirements of the stored dependencies.



74
75
76
77
78
# File 'lib/cocoapods-core/specification/set.rb', line 74

def dependency
  @dependencies.inject(Dependency.new(name)) do |previous, dependency|
    previous.merge(dependency.to_root_dependency)
  end
end

#highest_versionVersion

Returns The highest version known of the specification.

Returns:

  • (Version)

    The highest version known of the specification.



123
124
125
# File 'lib/cocoapods-core/specification/set.rb', line 123

def highest_version
  versions.first
end

#highest_version_spec_pathPathname

Returns The path of the highest version.

Returns:

  • (Pathname)

    The path of the highest version.



129
130
131
# File 'lib/cocoapods-core/specification/set.rb', line 129

def highest_version_spec_path
  specification_path_for_version(highest_version)
end

#required_by(dependency, dependent_name) ⇒ void

TODO:

This should simply return a boolean. Is CocoaPods that should raise.

This method returns an undefined value.

Stores a dependency on the Pod.

Parameters:

  • dependency (Dependency)

    a dependency that requires the Pod.

  • dependent_name (String)

    the name of the owner of the dependency. It is used only to display the Pod::Informative.

Raises:

  • If the versions requirement of the dependency are not compatible with the previously stored dependencies.



62
63
64
65
66
67
68
69
# File 'lib/cocoapods-core/specification/set.rb', line 62

def required_by(dependency, dependent_name)
  unless @required_by.empty? || dependency.requirement.satisfied_by?(Version.new(required_version.to_s))
    raise Informative, "#{dependent_name} tries to activate `#{dependency}', but already activated version `#{required_version}' by #{@required_by.to_sentence}."
  end
  @specification = nil
  @required_by  << dependent_name
  @dependencies << dependency
end

#required_versionVersion

TODO:

This should simply return nil. CocoaPods should raise instead.

Returns the highest version that satisfies the stored dependencies.

Returns:

  • (Version)

    the highest version that satisfies the stored dependencies.



105
106
107
108
109
110
111
112
# File 'lib/cocoapods-core/specification/set.rb', line 105

def required_version
  version = versions.find { |v| dependency.match?(name, v) }
  unless version
    raise Informative, "Required version (#{dependency}) not found " \
      "for `#{name}`.\nAvailable versions: #{versions.join(', ')}"
  end
  version
end

#specificationSpecification

Note:

If multiple sources have a specification for the #required_version The alphabetical order of their names is used to disambiguate.

Returns the top level specification of the Pod for the #required_version.

Returns:



87
88
89
# File 'lib/cocoapods-core/specification/set.rb', line 87

def specification
  @specification ||= Specification.from_file(specification_path_for_version(required_version))
end

#specification_path_for_version(version) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/cocoapods-core/specification/set.rb', line 91

def specification_path_for_version(version)
  sources = []
  versions_by_source.each do |source, source_versions|
    sources << source if source_versions.include?(required_version)
  end
  source = sources.sort_by(&:name).first
  source.specification_path(name, required_version)
end

#to_hashHash

Returns a hash representation of the set composed by dumb data types.

Examples:


"name" => "CocoaLumberjack",
"versions" => { "master" => [ "1.6", "1.3.3"] },
"highest_version" => "1.6",
"highest_version_spec" => 'REPO/CocoaLumberjack/1.6/CocoaLumberjack.podspec'

Returns:

  • (Hash)

    The hash representation.



164
165
166
167
168
169
170
171
172
173
174
# File 'lib/cocoapods-core/specification/set.rb', line 164

def to_hash
  versions = versions_by_source.inject({}) do |memo, (source, version)|
    memo[source.name] = version.map(&:to_s); memo
  end
  {
    'name' => name,
    'versions' => versions,
    'highest_version' => highest_version.to_s,
    'highest_version_spec' => highest_version_spec_path.to_s
  }
end

#to_sObject Also known as: inspect



148
149
150
# File 'lib/cocoapods-core/specification/set.rb', line 148

def to_s
  "#<#{self.class.name} for `#{name}' with required version `#{required_version}' available at `#{sources.map(&:name) * ', '}'>"
end

#versionsArray<Version>

Returns all the available versions for the Pod, sorted from highest to lowest.

Returns:

  • (Array<Version>)

    all the available versions for the Pod, sorted from highest to lowest.



117
118
119
# File 'lib/cocoapods-core/specification/set.rb', line 117

def versions
  versions_by_source.values.flatten.uniq.sort.reverse
end

#versions_by_sourceHash{Source => Version}

Returns all the available versions for the Pod grouped by source.

Returns:

  • (Hash{Source => Version})

    all the available versions for the Pod grouped by source.



136
137
138
139
140
141
142
# File 'lib/cocoapods-core/specification/set.rb', line 136

def versions_by_source
  result = {}
  sources.each do |source|
    result[source] = source.versions(name)
  end
  result
end