class R10K::Module::Forge

Attributes

metadata[R]

@!attribute [r] metadata

@api private
@return [PuppetForge::Metadata]
v3_module[R]

@!attribute [r] v3_module

@api private
@return [PuppetForge::V3::Module] The Puppet Forge module metadata

Public Class Methods

implement?(name, args) click to toggle source
# File lib/r10k/module/forge.rb, line 15
def self.implement?(name, args)
  args[:type].to_s == 'forge'
end
new(title, dirname, opts, environment=nil) click to toggle source
Calls superclass method R10K::Module::Base::new
# File lib/r10k/module/forge.rb, line 35
def initialize(title, dirname, opts, environment=nil)
  super

  @metadata_file = R10K::Module::MetadataFile.new(path + 'metadata.json')
  @metadata = @metadata_file.read

  setopts(opts, {
    # Standard option interface
    :version => :expected_version,
    :source  => ::R10K::Util::Setopts::Ignore,
    :type    => ::R10K::Util::Setopts::Ignore,
  }, :raise_on_unhandled => false)

  # Validate version and raise on issue. Title is validated by base class.
  unless valid_version?(@expected_version)
    raise ArgumentError, _("Module version %{ver} is not a valid Forge module version") % {ver: @expected_version}
  end

  @expected_version ||= current_version || :latest

  @v3_module = PuppetForge::V3::Module.new(:slug => @title)
end
statically_defined_version(name, args) click to toggle source
# File lib/r10k/module/forge.rb, line 19
def self.statically_defined_version(name, args)
  args[:version] if args[:version].is_a?(String)
end

Public Instance Methods

current_version() click to toggle source

@return [String] The version of the currently installed module

# File lib/r10k/module/forge.rb, line 108
def current_version
  if insync?
    (@metadata ||= @metadata_file.read).nil? ? nil : @metadata.version
  else
    nil
  end
end
Also aliased as: version
deprecated?() click to toggle source
# File lib/r10k/module/forge.rb, line 126
def deprecated?
  begin
    @v3_module.fetch && @v3_module.has_attribute?('deprecated_at') && !@v3_module.deprecated_at.nil?
  rescue Faraday::ResourceNotFound => e
    raise PuppetForge::ReleaseNotFound, _("The module %{title} does not exist on %{url}.") % {title: @title, url: PuppetForge::V3::Release.conn.url_prefix}, e.backtrace
  end
end
exist?() click to toggle source
# File lib/r10k/module/forge.rb, line 118
def exist?
  path.exist?
end
expected_version() click to toggle source

@return [String] The expected version that the module

# File lib/r10k/module/forge.rb, line 92
def expected_version
  if @expected_version == :latest
    begin
      if @v3_module.current_release
        @expected_version = @v3_module.current_release.version
      else
        raise PuppetForge::ReleaseNotFound, _("The module %{title} does not appear to have any published releases, cannot determine latest version.") % { title: @title }
      end
    rescue Faraday::ResourceNotFound => e
      raise PuppetForge::ReleaseNotFound, _("The module %{title} does not exist on %{url}.") % {title: @title, url: PuppetForge::V3::Release.conn.url_prefix}, e.backtrace
    end
  end
  @expected_version
end
install() click to toggle source
# File lib/r10k/module/forge.rb, line 174
def install
  if deprecated?
    logger.warn "Puppet Forge module '#{@v3_module.slug}' has been deprecated, visit https://forge.puppet.com/#{@v3_module.slug.tr('-','/')} for more information."
  end

  parent_path = @path.parent
  if !parent_path.exist?
    parent_path.mkpath
  end
  module_release = R10K::Forge::ModuleRelease.new(@title, expected_version)
  module_release.install(@path)
end
Also aliased as: upgrade
insync?() click to toggle source
# File lib/r10k/module/forge.rb, line 122
def insync?
  status == :insync
end
properties() click to toggle source
# File lib/r10k/module/forge.rb, line 83
def properties
  {
    :expected => expected_version,
    :actual   => current_version,
    :type     => :forge,
  }
end
reinstall() click to toggle source
# File lib/r10k/module/forge.rb, line 193
def reinstall
  uninstall
  install
end
status() click to toggle source

Determine the status of the forge module.

@return [Symbol] :absent If the directory doesn't exist @return [Symbol] :mismatched If the module is not a forge module, or

isn't the right forge module

@return [Symbol] :mismatched If the module was previously a git checkout @return [Symbol] :outdated If the installed module is older than expected @return [Symbol] :insync If the module is in the desired state

# File lib/r10k/module/forge.rb, line 142
def status
  if not self.exist?
    # The module is not installed
    return :absent
  elsif not File.exist?(@path + 'metadata.json')
    # The directory exists but doesn't have a metadata file; it probably
    # isn't a forge module.
    return :mismatched
  end

  if File.directory?(@path + '.git')
    return :mismatched
  end

  # The module is present and has a metadata file, read the metadata to
  # determine the state of the module.
  @metadata = @metadata_file.read(@path + 'metadata.json')

  if not @title.tr('/','-') == @metadata.full_module_name.tr('/','-')

    # This is a forge module but the installed module is a different author
    # than the expected author.
    return :mismatched
  end

  if expected_version && (expected_version != @metadata.version)
    return :outdated
  end

  return :insync
end
sync(opts={}) click to toggle source

@param [Hash] opts Deprecated @return [Boolean] true if the module was updated, false otherwise

# File lib/r10k/module/forge.rb, line 64
def sync(opts={})
  updated = false
  if should_sync?
    case status
    when :absent
      install
      updated = true
    when :outdated
      upgrade
      updated = true
    when :mismatched
      reinstall
      updated = true
    end
    maybe_delete_spec_dir
  end
  updated
end
uninstall() click to toggle source
# File lib/r10k/module/forge.rb, line 189
def uninstall
  FileUtils.rm_rf full_path
end
upgrade()
Alias for: install
valid_version?(version) click to toggle source
# File lib/r10k/module/forge.rb, line 58
def valid_version?(version)
  version == :latest || version.nil? || PuppetForge::Util.version_valid?(version)
end
version()
Alias for: current_version

Private Instance Methods

parse_title(title) click to toggle source

Override the base parse_title to ensure we have a fully qualified name

# File lib/r10k/module/forge.rb, line 201
def parse_title(title)
  if (match = title.match(/\A(\w+)[-\/](\w+)\Z/))
    [match[1], match[2]]
  else
    raise ArgumentError, _("Forge module names must match 'owner/modulename', instead got #{title}")
  end
end