Class: R10K::Module::Forge

Inherits:
Base
  • Object
show all
Includes:
Logging
Defined in:
lib/r10k/module/forge.rb

Constant Summary

Constants included from Logging

Logging::LOG_LEVELS

Instance Attribute Summary collapse

Attributes inherited from Base

#dirname, #environment, #name, #owner, #path, #title

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

debug_formatter, default_formatter, default_outputter, #logger, #logger_name, parse_level

Methods inherited from Base

#accept, #full_path

Constructor Details

#initialize(title, dirname, expected_version, environment = nil) ⇒ Forge

Returns a new instance of Forge.



35
36
37
38
39
40
41
42
43
# File 'lib/r10k/module/forge.rb', line 35

def initialize(title, dirname, expected_version, environment=nil)
  super

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

  @expected_version = expected_version || current_version || :latest
  @v3_module = PuppetForge::V3::Module.new(:slug => @title)
end

Instance Attribute Details

#metadataObject (readonly)

Returns the value of attribute metadata.



26
27
28
# File 'lib/r10k/module/forge.rb', line 26

def 
  @metadata
end

#v3_moduleObject (readonly)

Returns the value of attribute v3_module.



31
32
33
# File 'lib/r10k/module/forge.rb', line 31

def v3_module
  @v3_module
end

Class Method Details

.implement?(name, args) ⇒ Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/r10k/module/forge.rb', line 15

def self.implement?(name, args)
  !!(name.match %r[\w+[/-]\w+]) && valid_version?(args)
end

.valid_version?(expected_version) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/r10k/module/forge.rb', line 19

def self.valid_version?(expected_version)
  expected_version == :latest || expected_version.nil? || PuppetForge::Util.version_valid?(expected_version)
end

Instance Method Details

#current_versionString Also known as: version

Returns The version of the currently installed module.

Returns:

  • (String)

    The version of the currently installed module



77
78
79
# File 'lib/r10k/module/forge.rb', line 77

def current_version
  @metadata ? @metadata.version : nil
end

#deprecated?Boolean

Returns:

  • (Boolean)


91
92
93
94
95
96
97
# File 'lib/r10k/module/forge.rb', line 91

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?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/r10k/module/forge.rb', line 83

def exist?
  path.exist?
end

#expected_versionString

Returns The expected version that the module.

Returns:

  • (String)

    The expected version that the module



65
66
67
68
69
70
71
72
73
74
# File 'lib/r10k/module/forge.rb', line 65

def expected_version
  if @expected_version == :latest
    begin
      @expected_version = @v3_module.current_release.version
    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

#installObject Also known as: upgrade



139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/r10k/module/forge.rb', line 139

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

#insync?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/r10k/module/forge.rb', line 87

def insync?
  status == :insync
end

#propertiesObject



56
57
58
59
60
61
62
# File 'lib/r10k/module/forge.rb', line 56

def properties
  {
    :expected => expected_version,
    :actual   => current_version,
    :type     => :forge,
  }
end

#reinstallObject



158
159
160
161
# File 'lib/r10k/module/forge.rb', line 158

def reinstall
  uninstall
  install
end

#statusSymbol

Determine the status of the forge module.

Returns:

  • (Symbol)

    :absent If the directory doesn’t exist

  • (Symbol)

    :mismatched If the module is not a forge module, or isn’t the right forge module

  • (Symbol)

    :mismatched If the module was previously a git checkout

  • (Symbol)

    :outdated If the installed module is older than expected

  • (Symbol)

    :insync If the module is in the desired state



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/r10k/module/forge.rb', line 107

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 = {}) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/r10k/module/forge.rb', line 45

def sync(opts={})
  case status
  when :absent
    install
  when :outdated
    upgrade
  when :mismatched
    reinstall
  end
end

#uninstallObject



154
155
156
# File 'lib/r10k/module/forge.rb', line 154

def uninstall
  FileUtils.rm_rf full_path
end