class Puppet::ModuleTool::Metadata

This class provides a data structure representing a module's metadata. @api private

Constants

DEFAULTS

Attributes

module_name[RW]
name[RW]

Public Class Methods

new() click to toggle source
   # File lib/puppet/module_tool/metadata.rb
30 def initialize
31   @data = DEFAULTS.dup
32   @data['dependencies'] = @data['dependencies'].dup
33 end

Public Instance Methods

add_dependency(name, version_requirement=nil, repository=nil) click to toggle source

Validates the name and version_requirement for a dependency, then creates the Dependency and adds it. Returns the Dependency that was added.

   # File lib/puppet/module_tool/metadata.rb
66 def add_dependency(name, version_requirement=nil, repository=nil)
67   validate_name(name)
68   validate_version_range(version_requirement) if version_requirement
69 
70   dup = @data['dependencies'].find { |d| d.full_module_name == name && d.version_requirement != version_requirement }
71   raise ArgumentError, _("Dependency conflict for %{module_name}: Dependency %{name} was given conflicting version requirements %{version_requirement} and %{dup_version}. Verify that there are no duplicates in the metadata.json.") % { module_name: full_module_name, name: name, version_requirement: version_requirement, dup_version: dup.version_requirement } if dup
72 
73   dep = Dependency.new(name, version_requirement, repository)
74   @data['dependencies'].add(dep)
75 
76   dep
77 end
dashed_name() click to toggle source

Returns a filesystem-friendly version of this module name.

   # File lib/puppet/module_tool/metadata.rb
36 def dashed_name
37   @data['name'].tr('/', '-') if @data['name']
38 end
Also aliased as: full_module_name
dependencies() click to toggle source
   # File lib/puppet/module_tool/metadata.rb
87 def dependencies
88   @data['dependencies'].to_a
89 end
description() click to toggle source

Provides an accessor for the now defunct 'description' property. This addresses a regression in Puppet 3.6.x where previously valid templates referring to the 'description' property were broken. @deprecated

   # File lib/puppet/module_tool/metadata.rb
83 def description
84   @data['description']
85 end
full_module_name()
Alias for: dashed_name
method_missing(name, *args) click to toggle source

Expose any metadata keys as callable reader methods.

Calls superclass method
    # File lib/puppet/module_tool/metadata.rb
112 def method_missing(name, *args)
113   return @data[name.to_s] if @data.key? name.to_s
114   super
115 end
release_name() click to toggle source

Returns a string that uniquely represents this version of this module.

   # File lib/puppet/module_tool/metadata.rb
41 def release_name
42   return nil unless @data['name'] && @data['version']
43   [ dashed_name, @data['version'] ].join('-')
44 end
to_data_hash()
Alias for: to_hash
to_hash() click to toggle source

Returns a hash of the module's metadata. Used by Puppet's automated serialization routines.

@see Puppet::Network::FormatSupport#to_data_hash

   # File lib/puppet/module_tool/metadata.rb
95 def to_hash
96   @data
97 end
Also aliased as: to_data_hash
to_json() click to toggle source
    # File lib/puppet/module_tool/metadata.rb
100 def to_json
101   data = @data.dup.merge('dependencies' => dependencies)
102 
103   contents = data.keys.map do |k|
104     value = (Puppet::Util::Json.dump(data[k], :pretty => true) rescue data[k].to_json)
105     %Q("#{k}": #{value})
106   end
107 
108   "{\n" + contents.join(",\n").gsub(/^/, '  ') + "\n}\n"
109 end
update(data) click to toggle source

Merges the current set of metadata with another metadata hash. This method also handles the validation of module names and versions, in an effort to be proactive about module publishing constraints.

   # File lib/puppet/module_tool/metadata.rb
52 def update(data)
53   process_name(data) if data['name']
54   process_version(data) if data['version']
55   process_source(data) if data['source']
56   process_data_provider(data) if data['data_provider']
57   merge_dependencies(data) if data['dependencies']
58 
59   @data.merge!(data)
60   return self
61 end

Private Instance Methods

merge_dependencies(data) click to toggle source

Validates and parses the dependencies.

    # File lib/puppet/module_tool/metadata.rb
158 def merge_dependencies(data)
159   data['dependencies'].each do |dep|
160     add_dependency(dep['name'], dep['version_requirement'], dep['repository'])
161   end
162 
163   # Clear dependencies so @data dependencies are not overwritten
164   data.delete 'dependencies'
165 end
process_data_provider(data) click to toggle source
    # File lib/puppet/module_tool/metadata.rb
132 def process_data_provider(data)
133   validate_data_provider(data['data_provider'])
134 end
process_name(data) click to toggle source

Do basic validation and parsing of the name parameter.

    # File lib/puppet/module_tool/metadata.rb
120 def process_name(data)
121   validate_name(data['name'])
122   author, @module_name = data['name'].split(/[-\/]/, 2)
123 
124   data['author'] ||= author if @data['author'] == DEFAULTS['author']
125 end
process_source(data) click to toggle source

Do basic parsing of the source parameter. If the source is hosted on GitHub, we can predict sensible defaults for both project_page and issues_url.

    # File lib/puppet/module_tool/metadata.rb
139 def process_source(data)
140   if data['source'] =~ %r[://]
141     source_uri = URI.parse(data['source'])
142   else
143     source_uri = URI.parse("http://#{data['source']}")
144   end
145 
146   if source_uri.host =~ /^(www\.)?github\.com$/
147     source_uri.scheme = 'https'
148     source_uri.path.sub!(/\.git$/, '')
149     data['project_page'] ||= @data['project_page'] || source_uri.to_s
150     data['issues_url'] ||= @data['issues_url'] || source_uri.to_s.sub(/\/*$/, '') + '/issues'
151   end
152 
153 rescue URI::Error
154   return
155 end
process_version(data) click to toggle source

Do basic validation on the version parameter.

    # File lib/puppet/module_tool/metadata.rb
128 def process_version(data)
129   validate_version(data['version'])
130 end
validate_data_provider(value) click to toggle source

Validates that the given value is a symbolic name that starts with a letter and then contains only letters, digits, or underscore. Will raise an ArgumentError if that's not the case.

@param value [Object] The value to be tested

    # File lib/puppet/module_tool/metadata.rb
201 def validate_data_provider(value)
202   if value.is_a?(String)
203     unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/
204       if value =~ /^[a-zA-Z]/
205         raise ArgumentError, _("field 'data_provider' contains non-alphanumeric characters")
206       else
207         raise ArgumentError, _("field 'data_provider' must begin with a letter")
208       end
209     end
210   else
211     raise ArgumentError, _("field 'data_provider' must be a string")
212   end
213 end
validate_name(name) click to toggle source

Validates that the given module name is both namespaced and well-formed.

    # File lib/puppet/module_tool/metadata.rb
168 def validate_name(name)
169   return if name =~ /\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z/i
170 
171   namespace, modname = name.split(/[-\/]/, 2)
172   modname = :namespace_missing if namespace == ''
173 
174   err = case modname
175   when nil, '', :namespace_missing
176     _("the field must be a namespaced module name")
177   when /[^a-z0-9_]/i
178     _("the module name contains non-alphanumeric (or underscore) characters")
179   when /^[^a-z]/i
180     _("the module name must begin with a letter")
181   else
182     _("the namespace contains non-alphanumeric characters")
183   end
184 
185   raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
186 end
validate_version(version) click to toggle source

Validates that the version string can be parsed as per SemVer.

    # File lib/puppet/module_tool/metadata.rb
189 def validate_version(version)
190   return if SemanticPuppet::Version.valid?(version)
191 
192   err = _("version string cannot be parsed as a valid Semantic Version")
193   raise ArgumentError, _("Invalid 'version' field in metadata.json: %{err}") % { err: err }
194 end
validate_version_range(version_range) click to toggle source

Validates that the version range can be parsed by Semantic.

    # File lib/puppet/module_tool/metadata.rb
216 def validate_version_range(version_range)
217   SemanticPuppet::VersionRange.parse(version_range)
218 rescue ArgumentError => e
219   raise ArgumentError, _("Invalid 'version_range' field in metadata.json: %{err}") % { err: e }
220 end