diff options
author | Marc A. Paradise <marc.paradise@gmail.com> | 2021-05-26 12:31:47 -0400 |
---|---|---|
committer | Tim Smith <tsmith84@gmail.com> | 2021-09-16 18:30:57 -0700 |
commit | 89179049c476dc892e7e9115a0e7ff74be589e4f (patch) | |
tree | fb17aab381f21425db4b04ed5a691532a4c40ed3 | |
parent | b7856e024cb860072216f0160febd648fa26ea8b (diff) | |
download | chef-89179049c476dc892e7e9115a0e7ff74be589e4f.tar.gz |
Support recipes that and in .yaml as well as .yml
This adds support for recipe files that end in the '.yaml'
extension in addition to existing support for '.yml', because
both are valid and common extensions for yaml files.
Of note is that the message we log when a recipes/default.y[a]ml
and a root_files/recipe.y[a]ml both exist will be slightly off, in that
we don't capture the actual extension of each file. This seems to be
more complexity than it was worth, for a message that is shown at the
beginning of the run and largely ignored.
I also tried to add a bit of localized unit testing for
`recipe_yml_filenames_by_name` because we didn't before. Mostly focuses
on this use case (yaml, yml both work) but we could probalby improve
that by including tests for a mix of yaml/yml files.
Signed-off-by: Marc A. Paradise <marc.paradise@gmail.com>
-rw-r--r-- | lib/chef/cookbook_version.rb | 9 | ||||
-rw-r--r-- | spec/unit/cookbook_version_spec.rb | 37 |
2 files changed, 43 insertions, 3 deletions
diff --git a/lib/chef/cookbook_version.rb b/lib/chef/cookbook_version.rb index 420532585a..209b02838e 100644 --- a/lib/chef/cookbook_version.rb +++ b/lib/chef/cookbook_version.rb @@ -140,9 +140,12 @@ class Chef def recipe_yml_filenames_by_name @recipe_ym_filenames_by_name ||= begin name_map = yml_filenames_by_name(files_for("recipes")) - root_alias = cookbook_manifest.root_files.find { |record| record[:name] == "root_files/recipe.yml" } + root_alias = cookbook_manifest.root_files.find { |record| + record[:name] == "root_files/recipe.yml" || + record[:name] == "root_files/recipe.yaml" + } if root_alias - Chef::Log.error("Cookbook #{name} contains both recipe.yml and and recipes/default.yml, ignoring recipes/default.yml") if name_map["default"] + Chef::Log.error("Cookbook #{name} contains both recipe.yml and recipes/default.yml, ignoring recipes/default.yml") if name_map["default"] name_map["default"] = root_alias[:full_path] end name_map @@ -583,7 +586,7 @@ class Chef end def yml_filenames_by_name(records) - records.select { |record| record[:name] =~ /\.yml$/ }.inject({}) { |memo, record| memo[File.basename(record[:name], ".yml")] = record[:full_path]; memo } + records.select { |record| record[:name] =~ /\.(y[a]?ml)$/ }.inject({}) { |memo, record| memo[File.basename(record[:name], File.extname(record[:name]))] = record[:full_path]; memo } end def file_vendor diff --git a/spec/unit/cookbook_version_spec.rb b/spec/unit/cookbook_version_spec.rb index 01345e32e7..215b07e049 100644 --- a/spec/unit/cookbook_version_spec.rb +++ b/spec/unit/cookbook_version_spec.rb @@ -41,7 +41,44 @@ describe Chef::CookbookVersion do it "has empty metadata" do expect(cookbook_version.metadata).to eq(Chef::Cookbook::Metadata.new) end + end + + describe "#recipe_yml_filenames_by_name" do + let(:cookbook_version) { Chef::CookbookVersion.new("name", "/tmp/name") } + + def files_for_recipe(extension) + [ + { name: "recipes/default.#{extension}", full_path: "/home/user/repo/cookbooks/test/recipes/default.#{extension}" }, + { name: "recipes/other.#{extension}", full_path: "/home/user/repo/cookbooks/test/recipes/other.#{extension}" }, + ] + end + %w{yml yaml}.each do |extension| + + context "and YAML files are present including a recipes/default.#{extension}" do + before(:each) do + allow(cookbook_version).to receive(:files_for).with("recipes").and_return(files_for_recipe(extension)) + end + + context "and manifest does not include a root_files/recipe.#{extension}" do + it "returns all YAML recipes with a correct default of default.#{extension}" do + expect(cookbook_version.recipe_yml_filenames_by_name).to eq({ "default" => "/home/user/repo/cookbooks/test/recipes/default.#{extension}", + "other" => "/home/user/repo/cookbooks/test/recipes/other.#{extension}" }) + end + end + + context "and manifest also includes a root_files/recipe.#{extension}" do + let(:root_files) { [{ name: "root_files/recipe.#{extension}", full_path: "/home/user/repo/cookbooks/test/recipe.#{extension}" } ] } + before(:each) do + allow(cookbook_version.cookbook_manifest).to receive(:root_files).and_return(root_files) + end + it "returns all YAML recipes with a correct default of recipe.#{extension}" do + expect(cookbook_version.recipe_yml_filenames_by_name).to eq({ "default" => "/home/user/repo/cookbooks/test/recipe.#{extension}", + "other" => "/home/user/repo/cookbooks/test/recipes/other.#{extension}" }) + end + end + end + end end describe "with a cookbook directory named tatft" do |