summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc A. Paradise <marc.paradise@gmail.com>2021-05-26 12:31:47 -0400
committerTim Smith <tsmith84@gmail.com>2021-09-16 18:30:57 -0700
commit89179049c476dc892e7e9115a0e7ff74be589e4f (patch)
treefb17aab381f21425db4b04ed5a691532a4c40ed3
parentb7856e024cb860072216f0160febd648fa26ea8b (diff)
downloadchef-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.rb9
-rw-r--r--spec/unit/cookbook_version_spec.rb37
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