Class: PuppetLibrary::Forge::Multi

Inherits:
Object
  • 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

Constructor Details

#initializeMulti

Returns a new instance of Multi.



39
40
41
# File 'lib/puppet_library/forge/multi.rb', line 39

def initialize
    @forges = []
end

Instance Method Details

#add_forge(forge) ⇒ Object

Add another forge to delegate to.



44
45
46
# File 'lib/puppet_library/forge/multi.rb', line 44

def add_forge(forge)
    @forges << forge
end

#get_module_buffer(author, name, version) ⇒ Object

Raises:



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

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:



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

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



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/puppet_library/forge/multi.rb', line 81

def (author, name, version)
     = []
    @forges.each do |forge|
        begin
             << forge.(author, name, version)
        rescue ModuleNotFound
            # Try the next one
        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

#search_modules(query) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/puppet_library/forge/multi.rb', line 48

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

    SearchResult.merge_by_full_name(all_results)
end