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