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
29 def initialize
30   @data = DEFAULTS.dup
31   @data['dependencies'] = @data['dependencies'].dup
32 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
65 def add_dependency(name, version_requirement=nil, repository=nil)
66   validate_name(name)
67   validate_version_range(version_requirement) if version_requirement
68 
69   dup = @data['dependencies'].find { |d| d.full_module_name == name && d.version_requirement != version_requirement }
70   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
71 
72   dep = Dependency.new(name, version_requirement, repository)
73   @data['dependencies'].add(dep)
74 
75   dep
76 end
dashed_name() click to toggle source

Returns a filesystem-friendly version of this module name.

   # File lib/puppet/module_tool/metadata.rb
35 def dashed_name
36   @data['name'].tr('/', '-') if @data['name']
37 end
Also aliased as: full_module_name
dependencies() click to toggle source
   # File lib/puppet/module_tool/metadata.rb
86 def dependencies
87   @data['dependencies'].to_a
88 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
82 def description
83   @data['description']
84 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
111 def method_missing(name, *args)
112   return @data[name.to_s] if @data.key? name.to_s
113   super
114 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
40 def release_name
41   return nil unless @data['name'] && @data['version']
42   [ dashed_name, @data['version'] ].join('-')
43 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
94 def to_hash
95   @data
96 end
Also aliased as: to_data_hash
to_json() click to toggle source
    # File lib/puppet/module_tool/metadata.rb
 99 def to_json
100   data = @data.dup.merge('dependencies' => dependencies)
101 
102   contents = data.keys.map do |k|
103     value = (Puppet::Util::Json.dump(data[k], :pretty => true) rescue data[k].to_json)
104     %Q("#{k}": #{value})
105   end
106 
107   "{\n" + contents.join(",\n").gsub(/^/, '  ') + "\n}\n"
108 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
51 def update(data)
52   process_name(data) if data['name']
53   process_version(data) if data['version']
54   process_source(data) if data['source']
55   process_data_provider(data) if data['data_provider']
56   merge_dependencies(data) if data['dependencies']
57 
58   @data.merge!(data)
59   return self
60 end

Private Instance Methods

merge_dependencies(data) click to toggle source

Validates and parses the dependencies.

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

Do basic validation and parsing of the name parameter.

    # File lib/puppet/module_tool/metadata.rb
119 def process_name(data)
120   validate_name(data['name'])
121   author, @module_name = data['name'].split(/[-\/]/, 2)
122 
123   data['author'] ||= author if @data['author'] == DEFAULTS['author']
124 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
138 def process_source(data)
139   if data['source'] =~ %r[://]
140     source_uri = URI.parse(data['source'])
141   else
142     source_uri = URI.parse("http://#{data['source']}")
143   end
144 
145   if source_uri.host =~ /^(www\.)?github\.com$/
146     source_uri.scheme = 'https'
147     source_uri.path.sub!(/\.git$/, '')
148     data['project_page'] ||= @data['project_page'] || source_uri.to_s
149     data['issues_url'] ||= @data['issues_url'] || source_uri.to_s.sub(/\/*$/, '') + '/issues'
150   end
151 
152 rescue URI::Error
153   return
154 end
process_version(data) click to toggle source

Do basic validation on the version parameter.

    # File lib/puppet/module_tool/metadata.rb
127 def process_version(data)
128   validate_version(data['version'])
129 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
200 def validate_data_provider(value)
201   if value.is_a?(String)
202     unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/
203       if value =~ /^[a-zA-Z]/
204         raise ArgumentError, _("field 'data_provider' contains non-alphanumeric characters")
205       else
206         raise ArgumentError, _("field 'data_provider' must begin with a letter")
207       end
208     end
209   else
210     raise ArgumentError, _("field 'data_provider' must be a string")
211   end
212 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
167 def validate_name(name)
168   return if name =~ /\A[a-z0-9]+[-\/][a-z][a-z0-9_]*\Z/i
169 
170   namespace, modname = name.split(/[-\/]/, 2)
171   modname = :namespace_missing if namespace == ''
172 
173   err = case modname
174   when nil, '', :namespace_missing
175     _("the field must be a namespaced module name")
176   when /[^a-z0-9_]/i
177     _("the module name contains non-alphanumeric (or underscore) characters")
178   when /^[^a-z]/i
179     _("the module name must begin with a letter")
180   else
181     _("the namespace contains non-alphanumeric characters")
182   end
183 
184   raise ArgumentError, _("Invalid 'name' field in metadata.json: %{err}") % { err: err }
185 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
188 def validate_version(version)
189   return if SemanticPuppet::Version.valid?(version)
190 
191   err = _("version string cannot be parsed as a valid Semantic Version")
192   raise ArgumentError, _("Invalid 'version' field in metadata.json: %{err}") % { err: err }
193 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
215 def validate_version_range(version_range)
216   SemanticPuppet::VersionRange.parse(version_range)
217 rescue ArgumentError => e
218   raise ArgumentError, _("Invalid 'version_range' field in metadata.json: %{err}") % { err: e }
219 end