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 29 def initialize 30 @data = DEFAULTS.dup 31 @data['dependencies'] = @data['dependencies'].dup 32 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 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
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
# File lib/puppet/module_tool/metadata.rb 86 def dependencies 87 @data['dependencies'].to_a 88 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 82 def description 83 @data['description'] 84 end
Expose any metadata keys as callable reader methods.
# 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
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
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
# 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
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
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
# File lib/puppet/module_tool/metadata.rb 131 def process_data_provider(data) 132 validate_data_provider(data['data_provider']) 133 end
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
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
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
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
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
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
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