Class: PuppetLibrary::Forge::Multi

Inherits:
Forge
  • Object
show all
Defined in:
lib/puppet_library/forge/multi.rb

Overview

A forge that delegates to multiple other forges.

For queries, all subforges are queried. The results are merged, giving preference to earlier ones. That is, if the same version of a module is found in two different subforges, the one contained in the earlier subforge is kept in the query results.

For downloads, subforges are queried sequentially. The first module found is returned.

Usage:

# A forge that serves modules from disk, and proxies a remote forge
multi_forge = Multi.new
multi_forge.add_forge(Directory.new("/var/modules"))
multi_forge.add_forge(Proxy.new("http://forge.puppetlabs.com"))

Instance Method Summary collapse

Methods included from Util::Logging

#debug, #info, #logger, #logs, #warn

Constructor Details

#initializeMulti

Returns a new instance of Multi.



42
43
44
# File 'lib/puppet_library/forge/multi.rb', line 42

def initialize
    @forges = []
end

Instance Method Details

#add_forge(forge) ⇒ Object

Add another forge to delegate to.



55
56
57
# File 'lib/puppet_library/forge/multi.rb', line 55

def add_forge(forge)
    @forges << forge
end

#clear_cacheObject



50
51
52
# File 'lib/puppet_library/forge/multi.rb', line 50

def clear_cache
    @forges.each_in_parallel &:clear_cache
end

#get_module_buffer(author, name, version) ⇒ Object

Raises:



67
68
69
70
71
72
73
74
75
76
# File 'lib/puppet_library/forge/multi.rb', line 67

def get_module_buffer(author, name, version)
    @forges.each do |forge|
        begin
            return forge.get_module_buffer(author, name, version)
        rescue ModuleNotFound
            # Try the next one
        end
    end
    raise ModuleNotFound
end

#get_module_metadata(author, name) ⇒ Object

Raises:



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/puppet_library/forge/multi.rb', line 78

def (author, name)
     = @forges.inject([]) do |, forge|
        begin
             << forge.(author, name)
        rescue ModuleNotFound
            
        end
    end
    raise ModuleNotFound if .empty?
    .deep_merge.tap do ||
        ["releases"] = ["releases"].unique_by { |release| release["version"] }
    end
end

#get_module_metadata_with_dependencies(author, name, version) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/puppet_library/forge/multi.rb', line 92

def (author, name, version)
    modules_to_search = [ OpenStruct.new(:author => author, :name => name, :version => version) ]

    already_searched_modules =  []

     = []
    while spec = modules_to_search.shift
        if already_searched_modules.include? spec
            next
        else
            already_searched_modules << spec
        end

        @forges.each do |forge|
            begin
                 = forge.(spec.author, spec.name, spec.version)

                # Search all subforges for all versions of the dependencies too
                modules_to_search += .keys.map do |dep_full_name|
                    dep_author, dep_name = dep_full_name.split("/")
                    OpenStruct.new(:author => dep_author, :name => dep_name, :version => nil)
                end

                 << 
            rescue ModuleNotFound
                # Try the next one
            end
        end
    end

    raise ModuleNotFound if .empty?
    .deep_merge.tap do ||
        .each do |module_name, releases|
            [module_name] = releases.unique_by { |release| release["version"] }
        end
    end
end

#primeObject



46
47
48
# File 'lib/puppet_library/forge/multi.rb', line 46

def prime
    @forges.each_in_parallel &:prime
end

#search_modules(query) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/puppet_library/forge/multi.rb', line 59

def search_modules(query)
    all_results = @forges.map do |forge|
        forge.search_modules(query)
    end.flatten

    SearchResult.merge_by_full_name(all_results)
end