module Librarian::Puppet::Source::Local

Public Instance Methods

fetch_dependencies(name, version, extra) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 37
def fetch_dependencies(name, version, extra)
  dependencies = Set.new

  if specfile?
    spec = environment.dsl(Pathname(specfile))
    dependencies.merge spec.dependencies
  end

  parsed_metadata['dependencies'].each do |d|
    gem_requirement = Librarian::Dependency::Requirement.new(d['version_requirement']).to_gem_requirement
    new_dependency = Dependency.new(d['name'], gem_requirement, forge_source)
    dependencies << new_dependency
  end

  dependencies
end
fetch_version(name, extra) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 31
def fetch_version(name, extra)
  cache!
  found_path = found_path(name)
  module_version
end
forge_source() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 54
def forge_source
  Forge.default
end
install!(manifest) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 9
def install!(manifest)
  manifest.source == self or raise ArgumentError

  debug { "Installing #{manifest}" }

  name, version = manifest.name, manifest.version
  found_path = found_path(name)
  raise Error, "Path for #{name} doesn't contain a puppet module" if found_path.nil?

  unless name.include? '/' or name.include? '-'
    warn { "Invalid module name '#{name}', you should qualify it with 'ORGANIZATION-#{name}' for resolution to work correctly" }
  end

  install_path = environment.install_path.join(module_name(name))
  if install_path.exist? && rsync? != true
    debug { "Deleting #{relative_path_to(install_path)}" }
    install_path.rmtree
  end

  install_perform_step_copy!(found_path, install_path)
end

Private Instance Methods

evaluate_modulefile(modulefile) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 84
def evaluate_modulefile(modulefile)
  @@require_puppet ||= require_puppet

  metadata = ::Puppet::ModuleTool::Metadata.new

  # Puppet 4 does not have the class
  unless defined? ::Puppet::ModuleTool::ModulefileReader
    warn { "Can't parse Modulefile in Puppet >= 4.0 and you are using #{Librarian::Puppet::puppet_version}. Ignoring dependencies in #{modulefile}" }
    return metadata
  end

  begin
    ::Puppet::ModuleTool::ModulefileReader.evaluate(metadata, modulefile)
    raise SyntaxError, "Missing version" unless metadata.version
  rescue ArgumentError, SyntaxError => error
    warn { "Unable to parse #{modulefile}, ignoring: #{error}" }
    if metadata.respond_to? :version=
      metadata.version = '0.0.1' # puppet < 3.6
    else
      metadata.update({'version' => '0.0.1'}) # puppet >= 3.6
    end
  end
  metadata
end
install_perform_step_copy!(found_path, install_path) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 161
def install_perform_step_copy!(found_path, install_path)
  debug { "Copying #{relative_path_to(found_path)} to #{relative_path_to(install_path)}" }
  cp_r(found_path, install_path)
end
manifest?(name, path) click to toggle source
# File lib/librarian/puppet/source/local.rb, line 166
def manifest?(name, path)
  return true if path.join('manifests').exist?
  return true if path.join('lib').join('puppet').exist?
  return true if path.join('lib').join('facter').exist?
  debug { "Could not find manifests, lib/puppet or lib/facter under #{path}, maybe it is not a puppet module" }
  true
end
metadata() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 145
def metadata
  File.join(filesystem_path, 'metadata.json')
end
metadata?() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 149
def metadata?
  File.exists?(metadata)
end
module_version() click to toggle source

Naming this method 'version' causes an exception to be raised.

# File lib/librarian/puppet/source/local.rb, line 61
def module_version
  if parsed_metadata['version']
    parsed_metadata['version']
  else
    warn { "Module #{to_s} does not have version, defaulting to 0.0.1" }
    '0.0.1'
  end
end
modulefile() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 137
def modulefile
  File.join(filesystem_path, 'Modulefile')
end
modulefile?() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 141
def modulefile?
  File.exists?(modulefile)
end
parsed_metadata() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 109
def parsed_metadata
  if @metadata.nil?
    @metadata = if metadata?
      begin
        JSON.parse(File.read(metadata))
      rescue JSON::ParserError => e
        raise Error, "Unable to parse json file #{metadata}: #{e}"
      end
    elsif modulefile?
      # translate Modulefile to metadata.json
      evaluated = evaluate_modulefile(modulefile)
      {
        'version' => evaluated.version,
        'dependencies' => evaluated.dependencies.map do |dependency|
          {
            'name' => dependency.instance_variable_get(:@full_module_name),
            'version_requirement' => dependency.instance_variable_get(:@version_requirement)
          }
        end
      }
    else
      {}
    end
    @metadata['dependencies'] ||= []
  end
  @metadata
end
require_puppet() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 70
def require_puppet
  begin
    require 'puppet'
    require 'puppet/module_tool'
  rescue LoadError
    $stderr.puts <<-EOF
  Unable to load puppet, the puppet gem is required for :git and :path source.
  Install it with: gem install puppet
    EOF
    exit 1
  end
  true
end
specfile() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 153
def specfile
  File.join(filesystem_path, environment.specfile_name)
end
specfile?() click to toggle source
# File lib/librarian/puppet/source/local.rb, line 157
def specfile?
  File.exists?(specfile)
end