30
32
attr_reader :name, :environment
31
33
attr_writer :environment
35
attr_accessor :dependencies, :forge_name
33
36
attr_accessor :source, :author, :version, :license, :puppetversion, :summary, :description, :project_page
108
112
def load_metadata
109
113
data = PSON.parse File.read(metadata_file)
110
[:source, :author, :version, :license, :puppetversion].each do |attr|
114
@forge_name = data['name'].gsub('-', '/') if data['name']
116
[:source, :author, :version, :license, :puppetversion, :dependencies].each do |attr|
111
117
unless value = data[attr.to_s]
112
118
unless attr == :puppetversion
113
119
raise MissingMetadata, "No #{attr} module metadata provided for #{self.name}"
123
# NOTICE: The fallback to `versionRequirement` is something we'd like to
124
# not have to support, but we have a reasonable number of releases that
125
# don't use `version_requirement`. When we can deprecate this, we should.
126
if attr == :dependencies
127
value.tap do |dependencies|
128
dependencies.each do |dep|
129
dep['version_requirement'] ||= dep['versionRequirement'] || '>= 0.0.0'
116
134
send(attr.to_s + "=", value)
157
def validate_dependencies
158
return unless defined?(@requires)
160
@requires.each do |name, version|
161
unless mod = environment.module(name)
162
raise MissingModule, "Missing module #{name} required by #{self.name}"
165
if version and mod.version != version
166
raise IncompatibleModule, "Required module #{name} is version #{mod.version} but #{self.name} requires #{version}"
179
def dependencies_as_modules
180
dependent_modules = []
181
dependencies and dependencies.each do |dep|
182
author, dep_name = dep["name"].split('/')
183
found_module = environment.module(dep_name)
184
dependent_modules << found_module if found_module
191
environment.module_requirements[self.forge_name] || {}
194
def has_local_changes?
195
changes = Puppet::ModuleTool::Applications::Checksummer.run(path)
200
Puppet::ModuleTool::Applications::Checksummer.run(path)
203
# Identify and mark unmet dependencies. A dependency will be marked unmet
204
# for the following reasons:
206
# * not installed and is thus considered missing
207
# * installed and does not meet the version requirements for this module
208
# * installed and doesn't use semantic versioning
210
# Returns a list of hashes representing the details of an unmet dependency.
216
# :reason => :missing,
217
# :name => 'puppetlabs-mysql',
218
# :version_constraint => 'v0.0.1',
220
# :installed_version => '0.0.1'
223
# :name => 'puppetlabs-bacula',
224
# :version => 'v1.0.0'
229
def unmet_dependencies
230
unmet_dependencies = []
231
return unmet_dependencies unless dependencies
233
dependencies.each do |dependency|
234
forge_name = dependency['name']
235
version_string = dependency['version_requirement'] || '>= 0.0.0'
238
environment.module_by_forge_name(forge_name)
245
:version_constraint => version_string.gsub(/^(?=\d)/, "v"),
247
:name => self.forge_name,
248
:version => self.version.gsub(/^(?=\d)/, "v")
251
:installed_version => dep_mod.nil? ? nil : dep_mod.version
256
error_details[:reason] = :missing
257
unmet_dependencies << error_details
263
required_version_semver_range = SemVer[version_string]
264
actual_version_semver = SemVer.new(dep_mod.version)
266
error_details[:reason] = :non_semantic_version
267
unmet_dependencies << error_details
271
unless required_version_semver_range.include? actual_version_semver
272
error_details[:reason] = :version_mismatch
273
unmet_dependencies << error_details
171
282
def validate_puppet_version
193
304
def assert_validity
194
raise InvalidName, "Invalid module name; module names must be alphanumeric (plus '-'), not '#{name}'" unless name =~ /^[-\w]+$/
305
raise InvalidName, "Invalid module name #{name}; module names must be alphanumeric (plus '-'), not '#{name}'" unless name =~ /^[-\w]+$/
198
309
self.name == other.name &&
199
self.version == other.version &&
200
self.path == other.path &&
201
self.environment == other.environment
310
self.version == other.version &&
311
self.path == other.path &&
312
self.environment == other.environment