class Puppet::ModuleTool::Metadata
This class provides a data structure representing a module's metadata. @api private
Constants
- DEFAULTS
Attributes
Public Class Methods
# 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
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
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
# File lib/puppet/module_tool/metadata.rb 87 def dependencies 88 @data['dependencies'].to_a 89 end
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
Expose any metadata keys as callable reader methods.
# 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
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
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
# 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
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
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
# File lib/puppet/module_tool/metadata.rb 132 def process_data_provider(data) 133 validate_data_provider(data['data_provider']) 134 end
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
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
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
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
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
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
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