class Pod::Source::Aggregate

The Aggregate manages a directory of sources repositories.

Attributes

sources[R]

@return [Array<Source>] The ordered list of sources.

Public Class Methods

new(sources) click to toggle source

@param [Array<Source>] repos_dirs @see Sources

# File lib/cocoapods-core/source/aggregate.rb, line 12
def initialize(sources)
  raise "Cannot initialize an aggregate with a nil source: (#{sources})" if sources.include?(nil)
  @sources = sources
end

Public Instance Methods

all_pods() click to toggle source

@return [Array<String>] the names of all the pods available.

# File lib/cocoapods-core/source/aggregate.rb, line 19
def all_pods
  sources.map(&:pods).flatten.uniq
end
all_sets() click to toggle source

@return [Array<Set>] The sets for all the pods available.

@note Implementation detail: The sources don’t cache their values

because they might change in response to an update. Therefore
this method to preserve performance caches the values before
processing them.
# File lib/cocoapods-core/source/aggregate.rb, line 30
def all_sets
  pods_by_source = {}
  sources.each do |source|
    pods_by_source[source] = source.pods
  end
  pods = pods_by_source.values.flatten.uniq

  pods.map do |pod|
    pod_sources = sources.select { |s| pods_by_source[s].include?(pod) }
    pod_sources = pod_sources.compact
    Specification::Set.new(pod, pod_sources)
  end
end
generate_search_index_for_changes_in_source(source, spec_paths) click to toggle source

Generates from scratch the search data for changed specifications in given source.

@param [Source] source

The source from which a search index will be generated.

@param [Array<String>] spec_paths

Array of file path names for corresponding changed specifications.

@return [Hash{String=>Hash}] The search data for changed specifications.

# File lib/cocoapods-core/source/aggregate.rb, line 150
def generate_search_index_for_changes_in_source(source, spec_paths)
  pods = source.pods_for_specification_paths(spec_paths)
  sets = pods.map do |pod|
    Specification::Set.new(pod, source)
  end
  generate_search_index_for_sets(sets)
end
generate_search_index_for_source(source) click to toggle source

Generates from scratch the search data for given source. This operation can take a considerable amount of time (seconds) as it needs to evaluate the most representative podspec for each Pod.

@param [Source] source

The source from which a search index will be generated.

@return [Hash{String=>Hash}] The search data for the source.

# File lib/cocoapods-core/source/aggregate.rb, line 137
def generate_search_index_for_source(source)
  generate_search_index_for_sets(source.pod_sets)
end
representative_set(name) click to toggle source

Returns a set configured with the source which contains the highest version in the aggregate.

@param [String] name

The name of the Pod.

@return [Set] The most representative set for the Pod with the given

name. Returns nil if no representative source found containing a pod with given name.
# File lib/cocoapods-core/source/aggregate.rb, line 53
def representative_set(name)
  representative_source = nil
  highest_version = nil
  sources.each do |source|
    source_versions = source.versions(name)
    if source_versions
      source_version = source_versions.first
      if highest_version.nil? || (highest_version < source_version)
        highest_version = source_version
        representative_source = source
      end
    end
  end
  representative_source ? Specification::Set.new(name, representative_source) : nil
end
search_by_name(query, full_text_search = false) click to toggle source

@return [Array<Set>] the sets that contain the search term.

@raise If no source including the set can be found.

@todo Clients should raise not this method.

@see Source#search_by_name

# File lib/cocoapods-core/source/aggregate.rb, line 97
def search_by_name(query, full_text_search = false)
  pods_by_source = {}
  result = []
  sources.each do |s|
    source_pods = s.search_by_name(query, full_text_search)
    pods_by_source[s] = source_pods.map(&:name)
  end

  root_spec_names = pods_by_source.values.flatten.uniq
  root_spec_names.each do |pod|
    result_sources = sources.select do |source|
      pods_by_source[source].include?(pod)
    end

    result << Specification::Set.new(pod, result_sources)
  end

  if result.empty?
    extra = ', author, summary, or description' if full_text_search
    raise Informative, 'Unable to find a pod with name' \
      "#{extra} matching `#{query}'"
  end
  result
end

Private Instance Methods

generate_search_index_for_sets(sets) click to toggle source

Generates search data for given array of sets.

# File lib/cocoapods-core/source/aggregate.rb, line 164
def generate_search_index_for_sets(sets)
  result = {}
  sets.each do |set|
    word_list_from_set(set).each do |w|
      (result[w] ||= []).push(set.name)
    end
  end
  result
end
word_list_from_set(set) click to toggle source

Returns the vocabulary extracted from the most representative specification of the set. Vocabulary contains words from following information:

- version
- summary
- description
- authors

@param [Set] set

The set for which the information is needed.

@note If the specification can’t load an empty array is returned and

a warning is printed.

@note For compatibility with non Ruby clients a strings are used

instead of symbols for the keys.

@return [Array<String>] An array of words contained by the set’s search related information.

# File lib/cocoapods-core/source/aggregate.rb, line 193
def word_list_from_set(set)
  spec = set.specification
  word_list = [set.name.dup]
  if spec.summary
    word_list += spec.summary.split
  end
  if spec.description
    word_list += spec.description.split
  end
  if spec.authors
    spec.authors.each_pair do |k, v|
      word_list += k.split if k
      word_list += v.split if v
    end
  end
  word_list.uniq
rescue
  CoreUI.warn "Skipping `#{set.name}` because the podspec contains " \
    'errors.'
  []
end