diff options
-rw-r--r-- | README.markdown | 11 | ||||
-rw-r--r-- | lib/puppet/parser/functions/load_module_metadata.rb | 16 | ||||
-rwxr-xr-x | spec/functions/load_module_metadata.rb | 16 |
3 files changed, 43 insertions, 0 deletions
diff --git a/README.markdown b/README.markdown index 7eed5d7..9853da8 100644 --- a/README.markdown +++ b/README.markdown @@ -449,6 +449,17 @@ Loads a YAML file containing an array, string, or hash, and returns the data in *Type*: rvalue. +#### `load_module_metadata` + +Loads the metadata.json of a target module. Can be used to determine module version and authorship for dynamic support of modules. + + ~~~ + $metadata = load_module_metadata('archive') + notify { $metadata['author']: } + ~~~ + +*Type*: rvalue. + #### `lstrip` Strips spaces to the left of a string. *Type*: rvalue. diff --git a/lib/puppet/parser/functions/load_module_metadata.rb b/lib/puppet/parser/functions/load_module_metadata.rb new file mode 100644 index 0000000..0664a23 --- /dev/null +++ b/lib/puppet/parser/functions/load_module_metadata.rb @@ -0,0 +1,16 @@ +module Puppet::Parser::Functions + newfunction(:load_module_metadata, :type => :rvalue, :doc => <<-EOT + EOT + ) do |args| + raise(Puppet::ParseError, "load_module_metadata(): Wrong number of arguments, expects one") unless args.size == 1 + mod = args[0] + module_path = function_get_module_path([mod]) + metadata_json = File.join(module_path, 'metadata.json') + + raise(Puppet::ParseError, "load_module_metadata(): No metadata.json file for module #{mod}") unless File.exists?(metadata_json) + + metadata = PSON.load(File.read(metadata_json)) + + return metadata + end +end diff --git a/spec/functions/load_module_metadata.rb b/spec/functions/load_module_metadata.rb new file mode 100755 index 0000000..ba542eb --- /dev/null +++ b/spec/functions/load_module_metadata.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe 'load_module_metadata' do + it { is_expected.not_to eq(nil) } + it { is_expected.to run.with_params().and_raise_error(Puppet::ParseError, /wrong number of arguments/i) } + it { is_expected.to run.with_params("one", "two").and_raise_error(Puppet::ParseError, /wrong number of arguments/i) } + + it "should json parse the file" do + allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/') + allow(File).to receive(:exists?).with(/metadata.json/).and_return(true) + allow(File).to receive(:read).with(/metadata.json/).and_return('{"name": "spencer-science"}') + + result = subject.call(['science']) + expect(result['name']).to eq('spencer-science') + end +end |