Class: PuppetLibrary::Forge::Multi
- 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
-
#add_forge(forge) ⇒ Object
Add another forge to delegate to.
- #clear_cache ⇒ Object
- #get_module_buffer(author, name, version) ⇒ Object
- #get_module_metadata(author, name) ⇒ Object
- #get_module_metadata_with_dependencies(author, name, version) ⇒ Object
-
#initialize ⇒ Multi
constructor
A new instance of Multi.
- #prime ⇒ Object
- #search_modules(query) ⇒ Object
Methods included from Util::Logging
#debug, #info, #logger, #logs, #warn
Constructor Details
#initialize ⇒ Multi
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_cache ⇒ Object
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
67 68 69 70 71 72 73 74 75 76 |
# File 'lib/puppet_library/forge/multi.rb', line 67 def get_module_buffer(, name, version) @forges.each do |forge| begin return forge.get_module_buffer(, name, version) rescue ModuleNotFound # Try the next one end end raise ModuleNotFound end |
#get_module_metadata(author, name) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/puppet_library/forge/multi.rb', line 78 def (, name) = @forges.inject([]) do |, forge| begin << forge.(, 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 (, name, version) modules_to_search = [ OpenStruct.new(: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., spec.name, spec.version) # Search all subforges for all versions of the dependencies too modules_to_search += .keys.map do |dep_full_name| , dep_name = dep_full_name.split("/") OpenStruct.new(: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 |
#prime ⇒ Object
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 |