Class: Chef::Cookbook::CookbookVersionLoader
- Inherits:
-
Object
- Object
- Chef::Cookbook::CookbookVersionLoader
- Defined in:
- lib/chef/cookbook/cookbook_version_loader.rb
Overview
This class is only used drectly from the Chef::CookbookLoader and from chef-fs, so it only affects legacy-mode chef-client runs and knife. It is not used by server or zolo/zero modes.
This seems to be mostly a glorified factory method for creating CookbookVersion objects now, with creating Metadata objects bolted onto the side? It used to be also responsible for the merging of multiple objects when creating shadowed/merged cookbook versions from multiple sources. It also handles Chefignore files.
Constant Summary collapse
- UPLOADED_COOKBOOK_VERSION_FILE =
".uploaded-cookbook-version.json".freeze
Instance Attribute Summary collapse
-
#cookbook_path ⇒ Object
readonly
Returns the value of attribute cookbook_path.
-
#cookbook_settings ⇒ Object
readonly
Returns the value of attribute cookbook_settings.
-
#frozen ⇒ Object
readonly
Returns the value of attribute frozen.
-
#inferred_cookbook_name ⇒ Object
readonly
The cookbook’s name as inferred from its directory.
-
#metadata_error ⇒ Object
readonly
Returns the value of attribute metadata_error.
-
#uploaded_cookbook_version_file ⇒ Object
readonly
Returns the value of attribute uploaded_cookbook_version_file.
Instance Method Summary collapse
- #cookbook_name ⇒ Object
- #cookbook_version ⇒ Object
-
#initialize(path, chefignore = nil) ⇒ CookbookVersionLoader
constructor
A new instance of CookbookVersionLoader.
-
#load ⇒ Object
(also: #load_cookbooks)
Load the cookbook.
-
#load! ⇒ Object
Load the cookbook.
-
#metadata ⇒ Object
Generates the Cookbook::Metadata object.
Constructor Details
#initialize(path, chefignore = nil) ⇒ CookbookVersionLoader
Returns a new instance of CookbookVersionLoader.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 49 def initialize(path, chefignore = nil) @cookbook_path = File.( path ) # cookbook_path from which this was loaded @inferred_cookbook_name = File.basename( path ) @chefignore = chefignore @metadata = nil @relative_path = %r{#{Regexp.escape(cookbook_path)}/(.+)$} @metadata_loaded = false @cookbook_settings = { all_files: {}, } @metadata_filenames = [] @metadata_error = nil end |
Instance Attribute Details
#cookbook_path ⇒ Object (readonly)
Returns the value of attribute cookbook_path.
42 43 44 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 42 def cookbook_path @cookbook_path end |
#cookbook_settings ⇒ Object (readonly)
Returns the value of attribute cookbook_settings.
38 39 40 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 38 def cookbook_settings @cookbook_settings end |
#frozen ⇒ Object (readonly)
Returns the value of attribute frozen.
39 40 41 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 39 def frozen @frozen end |
#inferred_cookbook_name ⇒ Object (readonly)
The cookbook’s name as inferred from its directory.
45 46 47 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 45 def inferred_cookbook_name @inferred_cookbook_name end |
#metadata_error ⇒ Object (readonly)
Returns the value of attribute metadata_error.
47 48 49 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 47 def @metadata_error end |
#uploaded_cookbook_version_file ⇒ Object (readonly)
Returns the value of attribute uploaded_cookbook_version_file.
40 41 42 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 40 def uploaded_cookbook_version_file @uploaded_cookbook_version_file end |
Instance Method Details
#cookbook_name ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 140 def cookbook_name # The `name` attribute is now required in metadata, so # inferred_cookbook_name generally should not be used. Per CHEF-2923, # we have to not raise errors in cookbook metadata immediately, so that # users can still `knife cookbook upload some-cookbook` when an # unrelated cookbook has an error in its metadata. This situation # could prevent us from reading the `name` attribute from the metadata # entirely, but the name is used as a hash key in CookbookLoader, so we # fall back to the inferred name here. (.name || inferred_cookbook_name).to_sym end |
#cookbook_version ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 98 def cookbook_version return nil if empty? Chef::CookbookVersion.new(cookbook_name, cookbook_path).tap do |c| c.all_files = cookbook_settings[:all_files].values c. = c.freeze_version if frozen end end |
#load ⇒ Object Also known as: load_cookbooks
Load the cookbook. Does not raise an error if given a non-cookbook directory as the cookbook_path. This behavior is provided for compatibility, it is recommended to use #load! instead.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 80 def load # force lazy evaluation to occur # re-raise any exception that occurred when reading the metadata load_all_files remove_ignored_files if empty? Chef::Log.warn "Found a directory #{cookbook_name} in the cookbook path, but it contains no cookbook files. skipping." end cookbook_settings end |
#load! ⇒ Object
Load the cookbook. Raises an error if the cookbook_path given to the constructor doesn’t point to a valid cookbook.
67 68 69 70 71 72 73 74 75 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 67 def load! file_paths_map = load if empty? raise Exceptions::CookbookNotFoundInRepo, "The directory #{cookbook_path} does not contain a cookbook" end file_paths_map end |
#metadata ⇒ Object
Generates the Cookbook::Metadata object
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 110 def return @metadata unless @metadata.nil? @metadata = Chef::Cookbook::Metadata.new .each do || case when /\.rb$/ () when uploaded_cookbook_version_file () when /\.json$/ () else raise "Invalid metadata file: #{} for cookbook: #{cookbook_version}" end end @metadata # Rescue errors so that users can upload cookbooks via `knife cookbook # upload` even if some cookbooks in their chef-repo have errors in # their metadata. We only rescue StandardError because you have to be # doing something *really* terrible to raise an exception that inherits # directly from Exception in your metadata.rb file. rescue StandardError => e @metadata_error = e @metadata end |