1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
# frozen_string_literal: true
require 'net/http'
require_relative '../../../puppet/util/json'
require_relative '../../../puppet/util/colors'
module Puppet::ModuleTool
module Applications
class Application
include Puppet::Util::Colors
def self.run(*args)
new(*args).run
end
attr_accessor :options
def initialize(options = {})
@options = options
end
def run
raise NotImplementedError, "Should be implemented in child classes."
end
def discuss(response, success, failure)
case response
when Net::HTTPOK, Net::HTTPCreated
Puppet.notice success
else
errors = begin
Puppet::Util::Json.load(response.body)['error']
rescue
"HTTP #{response.code}, #{response.body}"
end
Puppet.warning "#{failure} (#{errors})"
end
end
def metadata(require_metadata = false)
return @metadata if @metadata
@metadata = Puppet::ModuleTool::Metadata.new
unless @path
raise ArgumentError, _("Could not determine module path")
end
if require_metadata && !Puppet::ModuleTool.is_module_root?(@path)
raise ArgumentError, _("Unable to find metadata.json in module root at %{path} See https://puppet.com/docs/puppet/latest/modules_publishing.html for required file format.") % { path: @path }
end
metadata_path = File.join(@path, 'metadata.json')
if File.file?(metadata_path)
File.open(metadata_path) do |f|
@metadata.update(Puppet::Util::Json.load(f))
rescue Puppet::Util::Json::ParseError => ex
raise ArgumentError, _("Could not parse JSON %{metadata_path}") % { metadata_path: metadata_path }, ex.backtrace
end
end
if File.file?(File.join(@path, 'Modulefile'))
Puppet.warning _("A Modulefile was found in the root directory of the module. This file will be ignored and can safely be removed.")
end
@metadata
end
def load_metadata!
@metadata = nil
metadata(true)
end
def parse_filename(filename)
match = /^((.*?)-(.*?))-(\d+\.\d+\.\d+.*?)$/.match(File.basename(filename, '.tar.gz'))
if match
module_name, author, shortname, version = match.captures
else
raise ArgumentError, _("Could not parse filename to obtain the username, module name and version. (%{release_name})") % { release_name: @release_name }
end
unless SemanticPuppet::Version.valid?(version)
raise ArgumentError, _("Invalid version format: %{version} (Semantic Versions are acceptable: http://semver.org)") % { version: version }
end
{
:module_name => module_name,
:author => author,
:dir_name => shortname,
:version => version
}
end
end
end
end
|