class PuppetfileEditor::Module
Module
class represents a puppet module in Puppetfile
Attributes
message[R]
name[R]
params[R]
status[R]
type[R]
Public Class Methods
new(title, args = nil)
click to toggle source
# File lib/puppetfile_editor/module.rb, line 12 def initialize(title, args = nil) @type = :undef @params = nil @message = nil @status = nil if [{ local: true }, :local].include? args @type = :local elsif args.nil? || args.is_a?(String) || args.is_a?(Symbol) @type = :forge @params = { version: args } unless args.nil? elsif args.is_a? Hash if args.key? :hg @type = :hg elsif args.key? :git @type = :git end @params = args calculate_indent end @author, @name = parse_title title end
Public Instance Methods
dump(args = {})
click to toggle source
# File lib/puppetfile_editor/module.rb, line 120 def dump(args = {}) output = [] case @type when :hg, :git output.push "mod '#{full_title}'" @params.each do |param_name, param_value| if param_value == :latest value = ':latest' else value = "'#{param_value}'" end param = "#{param_name}:".ljust(@indent) output.push " #{param} #{value}" end when :local if args[:legacy_local] output.push("mod '#{full_title}', :local") else output.push("mod '#{full_title}', local: true") end else if @params.nil? output.push("mod '#{full_title}'") else output.push("mod '#{full_title}', '#{@params[:version]}'") end end output.join(",\n") end
full_title()
click to toggle source
# File lib/puppetfile_editor/module.rb, line 150 def full_title return "#{@author}/#{@name}" if @author @name end
full_version()
click to toggle source
# File lib/puppetfile_editor/module.rb, line 156 def full_version case @type when :hg, :git @params.reject { |param, _| param.eql? @type }.map { |param, value| "#{param}: #{value}" }.sort.join(', ') when :forge return @params[:version] if @params.key? :version nil end end
merge_with(mod, force = false)
click to toggle source
# File lib/puppetfile_editor/module.rb, line 62 def merge_with(mod, force = false) unless mod.type == @type set_message("type mismatch ('#{@type}' vs '#{mod.type}')", :type_mismatched) return end case @type when :hg, :git new = mod.params.reject { |param, _| param.eql? @type } if !force && new.keys == [:tag] && !([:branch, :ref, :changeset] & @params.keys).empty? set_message("kept at #{full_version}", :wont_upgrade) return end if full_version == mod.full_version set_message("versions match (#{full_version})", :matched) return end begin old_version = Gem::Version.new(full_version.sub('tag: ', '')) new_version = Gem::Version.new(mod.full_version.sub('tag: ', '')) rescue ArgumentError # Older rubies throw ArgumentError when version is '0.1.0-dev1', for example. # Sad. set_message("could not compare versions, so updating (#{full_version} to #{mod.full_version})", :updated) else if old_version > new_version set_message("not downgrading (#{full_version} > #{mod.full_version})", :matched) return else set_message("updated (#{full_version} to #{mod.full_version})", :updated) end end @params.delete_if { |param, _| [:branch, :tag, :ref, :changeset].include? param } @params.merge!(new) calculate_indent when :forge unless force if mod.params.nil? || mod.params.is_a?(Symbol) set_message("won't upgrade to #{mod.full_version}", :wont_upgrade) return end end if full_version == mod.full_version set_message("versions match (#{full_version})", :matched) return elsif Gem::Version.new(full_version) > Gem::Version.new(mod.full_version) set_message("not downgrading (#{full_version} > #{mod.full_version})", :matched) return else set_message("updated (#{full_version} to #{mod.full_version})", :updated) end @params = mod.params else set_message('only git, forge, and hg modules are supported for merging', :skipped) end end
set(param, newvalue, force = false)
click to toggle source
# File lib/puppetfile_editor/module.rb, line 34 def set(param, newvalue, force = false) case @type when :hg, :git if !force && !([:branch, :ref, :changeset] & @params.keys).empty? set_message("kept at (#{full_version})", :wont_upgrade) elsif !%w[branch tag ref changeset].include? param set_message("only 'branch', 'tag', 'ref', and 'changeset' are supported for '#{@type}' modules.", :unsupported) else set_message("updated (#{full_version} to #{param}: #{newvalue}", :updated) @params.delete :branch @params.delete :tag @params.delete :ref @params.delete :changeset @params[param.to_sym] = newvalue calculate_indent end when :forge if param == 'version' @params[:version] = newvalue set_message("successfully set #{param} to #{newvalue} for #{@name}.", :updated) else set_message("only 'version' is supported for forge modules.", :unsupported) end else set_message("editing params for '#{@type}' modules is not supported.", :unsupported) end end
set_message(message, status)
click to toggle source
# File lib/puppetfile_editor/module.rb, line 167 def set_message(message, status) @message = message @status = status end
Private Instance Methods
calculate_indent()
click to toggle source
# File lib/puppetfile_editor/module.rb, line 184 def calculate_indent @indent = @params.keys.max_by(&:length).length + 1 end
parse_title(title)
click to toggle source
# File lib/puppetfile_editor/module.rb, line 174 def parse_title(title) if (match = title.match(/^(\w+)$/)) [nil, match[1]] elsif (match = title.match(%r{^(\w+)[/-](\w[\w-]*\w)$})) [match[1], match[2]] else raise ArgumentError, "Module name (#{title}) must match either 'modulename' or 'owner/modulename'" end end