kafo 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ae11e11628c99446f1b247135f656e0f5546c6045499b05b9b00b83665b5afc
4
- data.tar.gz: bd4361d90a598e7f3beb6a27f28a5f7992a0e30b033f327cfbe5dd0488676766
3
+ metadata.gz: b2f9f3f9827dd2b9f738acab79a596169fd4c4ea075ec5a99c35a40f291dfcee
4
+ data.tar.gz: 1695c0717da6eb8809a14114bd09746efcb1dd82773cf585dbb987ea97c13f8e
5
5
  SHA512:
6
- metadata.gz: 709acb14a02a183b1f3b5b604014d6d22aedca7d15e08fdd29408296aa189d9813be07b873cb151b412015b5a0c3b313a6224e7e91c8dea5a44c77063fb0b263
7
- data.tar.gz: b53a7e0ddbe08344b26d68a965ad14a550930be9bf943920df2d352a45d5edb1806e4b9612623109a7db33d8470722a36a73429631985f20728cd57446f2f712
6
+ metadata.gz: 0d26ee6f46875bcaa7f77c2e83dfc7b77aaee073f0977e9dedb1afc977fd118bc55fb430f450dacab0b8d016bf0805462a4a8c4bfe5cbd82e4d515abcc6c915a
7
+ data.tar.gz: c5b129d7e90fb1895afc03781b723e2cd9fa792eb2f3ac1d754a8c744f120a555be977067af66f4c1868ab5fc195093bd1623195b117f73be57106888504ff43
@@ -125,7 +125,7 @@ module Kafo
125
125
  end
126
126
 
127
127
  def print_out
128
- puts "| #{('Parameter name').ljust(40)} | #{'Description'.ljust(@max)} |"
128
+ puts "| #{'Parameter name'.ljust(40)} | #{'Description'.ljust(@max)} |"
129
129
  puts "| #{'-'*40} | #{'-' * @max} |"
130
130
  @config.modules.sort.each do |mod|
131
131
  mod.params.sort.each do |param|
@@ -383,7 +383,7 @@ EOS
383
383
  # Loads YAML from mixed output, finding the "---" and "..." document start/end delimiters
384
384
  def load_yaml_from_output(lines)
385
385
  start = lines.find_index { |l| l.start_with?('---') }
386
- last = lines[start..-1].find_index("...")
386
+ last = lines[start..].find_index("...")
387
387
  if start.nil? || last.nil?
388
388
  puts "Could not find default values in output"
389
389
  @logger.error 'Could not find default values in Puppet output, cannot continue'
@@ -61,7 +61,7 @@ module Kafo
61
61
  bracket_count = 1
62
62
  until bracket_count.zero?
63
63
  next_bracket = scanner.scan_until(/[\[\]]/) or raise ConfigurationException, "missing close bracket in argument #{args.count + 1} in data type #{input}"
64
- case next_bracket[-1..-1]
64
+ case next_bracket[-1..]
65
65
  when '['
66
66
  bracket_count += 1
67
67
  when ']'
@@ -102,7 +102,7 @@ module Kafo
102
102
  end
103
103
 
104
104
  def typecast(value)
105
- value == 'UNDEF' ? nil : value
105
+ (value == 'UNDEF') ? nil : value
106
106
  end
107
107
 
108
108
  def valid?(value, errors = [])
@@ -19,7 +19,7 @@ module Kafo
19
19
  end
20
20
 
21
21
  def typecast(value)
22
- value.to_s =~ /\d+/ ? value.to_f : value
22
+ value.to_s.match?(/\d+/) ? value.to_f : value
23
23
  end
24
24
 
25
25
  def valid?(input, errors = [])
@@ -8,13 +8,11 @@ module Kafo
8
8
  attr_reader :inner_type, :inner_value
9
9
 
10
10
  def initialize(inner_type_or_value)
11
- begin
12
- @inner_type = DataType.new_from_string(inner_type_or_value)
13
- @inner_value = nil
14
- rescue ConfigurationException
15
- @inner_type = nil
16
- @inner_value = inner_type_or_value
17
- end
11
+ @inner_type = DataType.new_from_string(inner_type_or_value)
12
+ @inner_value = nil
13
+ rescue ConfigurationException
14
+ @inner_type = nil
15
+ @inner_value = inner_type_or_value
18
16
  end
19
17
 
20
18
  def to_s
@@ -8,13 +8,11 @@ module Kafo
8
8
  attr_reader :inner_type, :inner_value
9
9
 
10
10
  def initialize(inner_type_or_value)
11
- begin
12
- @inner_type = DataType.new_from_string(inner_type_or_value)
13
- @inner_value = nil
14
- rescue ConfigurationException
15
- @inner_type = nil
16
- @inner_value = inner_type_or_value
17
- end
11
+ @inner_type = DataType.new_from_string(inner_type_or_value)
12
+ @inner_value = nil
13
+ rescue ConfigurationException
14
+ @inner_type = nil
15
+ @inner_value = inner_type_or_value
18
16
  end
19
17
 
20
18
  def to_s
@@ -8,4 +8,7 @@ module Kafo
8
8
 
9
9
  class ParserError < StandardError
10
10
  end
11
+
12
+ class PuppetReportError < StandardError
13
+ end
11
14
  end
@@ -19,6 +19,15 @@ module Kafo
19
19
  end
20
20
  end
21
21
 
22
+ def reportdir
23
+ @reportdir ||= File.join(directory, 'reports')
24
+ end
25
+
26
+ def reports
27
+ # Reports are stored in $reportdir/$certname/$report
28
+ Dir.glob(File.join(reportdir, '*', '*.*')).sort_by { |path| File.mtime(path) }
29
+ end
30
+
22
31
  def store_answers
23
32
  answer_data = HieraConfigurer.generate_data(@config.modules, @config.app[:order])
24
33
  @logger.debug("Writing temporary answers to #{answer_file}")
@@ -37,6 +46,8 @@ module Kafo
37
46
  'environmentpath' => environmentpath,
38
47
  'factpath' => factpath,
39
48
  'hiera_config' => hiera_config,
49
+ 'reports' => 'store',
50
+ 'reportdir' => reportdir,
40
51
  }.merge(settings)
41
52
 
42
53
  PuppetConfigurer.new(puppet_conf, settings)
@@ -84,10 +84,8 @@ module Kafo
84
84
  end
85
85
 
86
86
  def parametrization
87
- @parametrization ||= begin
88
- @params.inject({}) do |h,p|
89
- h.update(parametrize(p) => p, parametrize(p, 'reset-') => p)
90
- end
87
+ @parametrization ||= @params.inject({}) do |h,p|
88
+ h.update(parametrize(p) => p, parametrize(p, 'reset-') => p)
91
89
  end
92
90
  end
93
91
  end
@@ -22,7 +22,7 @@ module Kafo
22
22
  classes = []
23
23
  data = modules.select(&:enabled?).inject({}) do |config, mod|
24
24
  classes << mod.class_name
25
- config.update(Hash[mod.params_hash.map { |k, v| ["#{mod.class_name}::#{k}", v] }])
25
+ config.update(mod.params_hash.transform_keys { |k| "#{mod.class_name}::#{k}" })
26
26
  end
27
27
  data['classes'] = sort_modules(classes, order)
28
28
  data
@@ -196,5 +196,13 @@ module Kafo
196
196
  def exit_code
197
197
  self.kafo.exit_code
198
198
  end
199
+
200
+ # Return the Puppet report, if any.
201
+ # Only available after Puppet actual ran.
202
+ #
203
+ # @return [Optional[Kafo::PuppetReport]]
204
+ def puppet_report
205
+ self.kafo.puppet_report
206
+ end
199
207
  end
200
208
  end
@@ -21,7 +21,9 @@ require 'kafo/help_builder'
21
21
  require 'kafo/wizard'
22
22
  require 'kafo/system_checker'
23
23
  require 'kafo/puppet_command'
24
+ require 'kafo/puppet_failed_resource'
24
25
  require 'kafo/puppet_log_parser'
26
+ require 'kafo/puppet_report'
25
27
  require 'kafo/progress_bar'
26
28
  require 'kafo/hooking'
27
29
  require 'kafo/exit_handler'
@@ -34,6 +36,8 @@ module Kafo
34
36
  class KafoConfigure < Clamp::Command
35
37
  include StringHelper
36
38
 
39
+ attr_accessor :puppet_report
40
+
37
41
  class << self
38
42
  include AppOption::Declaration
39
43
 
@@ -510,29 +514,27 @@ module Kafo
510
514
  logger.notice("Starting system configuration.")
511
515
 
512
516
  PTY.spawn(*PuppetCommand.format_command(command)) do |stdin, stdout, pid|
513
- begin
514
- stdin.each do |line|
515
- line = normalize_encoding(line)
516
- method, message = log_parser.parse(line)
517
- progress_log(method, message, logger)
518
-
519
- if (output = line.match(/(.+\]): Starting to evaluate the resource( \((?<count>\d+) of (?<total>\d+)\))?/))
520
- if (output[:count].to_i % 250) == 1 && output[:count].to_i != 1
521
- logger.notice("#{output[:count].to_i - 1} configuration steps out of #{output[:total]} steps complete.")
522
- end
517
+ stdin.each do |line|
518
+ line = normalize_encoding(line)
519
+ method, message = log_parser.parse(line)
520
+ progress_log(method, message, logger)
521
+
522
+ if (output = line.match(/(?:.+\]): Starting to evaluate the resource( \((?<count>\d+) of (?<total>\d+)\))?/))
523
+ if (output[:count].to_i % 250) == 1 && output[:count].to_i != 1
524
+ logger.notice("#{output[:count].to_i - 1} configuration steps out of #{output[:total]} steps complete.")
523
525
  end
524
-
525
- @progress_bar.update(line) if @progress_bar
526
526
  end
527
- rescue Errno::EIO # we reach end of input
528
- exit_status = PTY.check(pid, true)
529
- if exit_status.nil? # process is still running
530
- begin
531
- Process.wait(pid)
532
- rescue Errno::ECHILD # process could exit meanwhile so we rescue
533
- end
534
- self.class.exit_handler.exit_code = $?.exitstatus
527
+
528
+ @progress_bar.update(line) if @progress_bar
529
+ end
530
+ rescue Errno::EIO # we reach end of input
531
+ exit_status = PTY.check(pid, true)
532
+ if exit_status.nil? # process is still running
533
+ begin
534
+ Process.wait(pid)
535
+ rescue Errno::ECHILD # process could exit meanwhile so we rescue
535
536
  end
537
+ self.class.exit_handler.exit_code = $?.exitstatus
536
538
  end
537
539
  end
538
540
  rescue PTY::ChildExited => e # could be raised by PTY.check
@@ -542,6 +544,12 @@ module Kafo
542
544
  @progress_bar.close if @progress_bar
543
545
  logger.notice "System configuration has finished."
544
546
 
547
+ if (last_report = execution_env.reports.last)
548
+ # For debugging: you can easily copy the last report to fixtures
549
+ # FileUtils.cp(last_report, File.join(__dir__, '..', '..', 'test', 'fixtures', 'reports', File.basename(last_report)))
550
+ self.puppet_report = PuppetReport.load_report_file(last_report)
551
+ end
552
+
545
553
  self.class.hooking.execute(:post)
546
554
  self.class.exit(exit_code)
547
555
  end
@@ -4,8 +4,8 @@ module Kafo
4
4
  default_name = name
5
5
 
6
6
  types.each do |hook_type|
7
- self.class.send(:define_method, hook_type) do |name=nil, &block|
8
- registry.send(:register, hook_type, name || default_name, &block)
7
+ self.class.send(:define_method, hook_type) do |hook_name = nil, &block|
8
+ registry.send(:register, hook_type, hook_name || default_name, &block)
9
9
  end
10
10
  end
11
11
  end
data/lib/kafo/param.rb CHANGED
@@ -47,7 +47,7 @@ module Kafo
47
47
  # For literal default values, only use 'manifest_default'. For variable or values from a data
48
48
  # lookup, use the value loaded back from the dump in 'default'.
49
49
  def default
50
- @type.typecast(dump_default_needed? || !@default.nil? ? @default : manifest_default)
50
+ @type.typecast((dump_default_needed? || !@default.nil?) ? @default : manifest_default)
51
51
  end
52
52
 
53
53
  def default=(default)
@@ -71,7 +71,7 @@ module Kafo
71
71
  end
72
72
 
73
73
  def manifest_default_params_variable
74
- manifest_default[1..-1] if dump_default_needed?
74
+ manifest_default[1..] if dump_default_needed?
75
75
  end
76
76
 
77
77
  def module_name
@@ -132,7 +132,7 @@ module Kafo
132
132
  end
133
133
 
134
134
  def visible?(context = [])
135
- condition.nil? || condition.empty? ? true : evaluate_condition(context)
135
+ (condition.nil? || condition.empty?) ? true : evaluate_condition(context)
136
136
  end
137
137
 
138
138
  def condition_value
@@ -155,7 +155,7 @@ module Kafo
155
155
  arg
156
156
  end
157
157
  end.map do |arg|
158
- arg == :undef ? nil : arg
158
+ (arg == :undef) ? nil : arg
159
159
  end
160
160
  end
161
161
 
@@ -39,7 +39,7 @@ module Kafo
39
39
 
40
40
  if (line_monitor = MONITOR_RESOURCE.match(line))
41
41
  @resources << line_monitor[1]
42
- @total = (@total == :unknown ? 1 : @total + 1)
42
+ @total = ((@total == :unknown) ? 1 : @total + 1)
43
43
  end
44
44
 
45
45
  if (line_start = EVALTRACE_START.match(line))
@@ -71,7 +71,7 @@ module Kafo
71
71
 
72
72
  def close
73
73
  @bar.show({ :msg => done_message,
74
- :done => @total == :unknown ? @bar.done + 1 : @total,
74
+ :done => (@total == :unknown) ? @bar.done + 1 : @total,
75
75
  :total => @total }, true)
76
76
  @bar.close
77
77
  end
@@ -6,7 +6,7 @@ module Kafo
6
6
 
7
7
  def finite_template
8
8
  'Installing'.ljust(22) + ' ${<msg>} [${<percent>%}]' +
9
- (@term_width >= 83 ? ' [${<bar>}]' : '')
9
+ ((@term_width >= 83) ? ' [${<bar>}]' : '')
10
10
  end
11
11
 
12
12
  def infinite_template
@@ -16,7 +16,7 @@ module Kafo
16
16
  'Installing'.ljust(22) +
17
17
  ANSI::Code.yellow { ' ${<msg>}' } +
18
18
  ANSI::Code.green { ' [${<percent>%}]' } +
19
- (@term_width >= 83 ? ' [${<bar>}]' : '')
19
+ ((@term_width >= 83) ? ' [${<bar>}]' : '')
20
20
  end
21
21
 
22
22
  def infinite_template
@@ -43,7 +43,7 @@ module Kafo
43
43
  File.join([bin_path, bin_name].compact)
44
44
  end
45
45
 
46
- def self.is_aio_puppet?
46
+ def self.aio_puppet?
47
47
  puppet_command = search_puppet_path('puppet')
48
48
  File.realpath(puppet_command).start_with?('/opt/puppetlabs')
49
49
  rescue Errno::ENOENT
@@ -51,7 +51,7 @@ module Kafo
51
51
  end
52
52
 
53
53
  def self.format_command(command)
54
- if is_aio_puppet?
54
+ if aio_puppet?
55
55
  [clean_env_vars, command, :unsetenv_others => true]
56
56
  else
57
57
  [::ENV, command, :unsetenv_others => false]
@@ -0,0 +1,68 @@
1
+ module Kafo
2
+ class PuppetFailedResource
3
+ # @param [Hash] status
4
+ # The status hash from the report
5
+ # @param [Array[Hash]] logs
6
+ # Relevant log lines for this resoure
7
+ def initialize(status, logs)
8
+ @status = status
9
+ @logs = logs
10
+ end
11
+
12
+ # @example
13
+ # puppet_failed_resource.resource == 'Exec[/bin/true]'
14
+ # @return [String] A resource
15
+ def resource
16
+ @status['resource']
17
+ end
18
+
19
+ # @example
20
+ # puppet_failed_resource.type == 'Exec'
21
+ # @return [String] A resource type
22
+ def type
23
+ @status['resource_type']
24
+ end
25
+
26
+ # @example
27
+ # puppet_failed_resource.title == '/bin/true'
28
+ # @return [String] A resource title
29
+ def title
30
+ @status['title']
31
+ end
32
+
33
+ def to_s
34
+ "Puppet #{type} resource '#{title}'"
35
+ end
36
+
37
+ # @return [Array[String]] The event messages
38
+ def event_messages
39
+ @status['events'].map { |event| event['message'] }
40
+ end
41
+
42
+ # A collection of Puppet log messages
43
+ #
44
+ # The log messages include detailed information of what failed. Some debug
45
+ # information, such as timing but crucially the command output, both stdout
46
+ # and stderr.
47
+ #
48
+ # @return [Array[String]] The Puppet log messages for this resource
49
+ def log_messages
50
+ @logs.map { |log| log['message'] }
51
+ end
52
+
53
+ # A collection of Puppet log messages grouped by source
54
+ #
55
+ # The log messages include detailed information of what failed. Some debug
56
+ # information, such as timing but crucially the command output, both stdout
57
+ # and stderr.
58
+ #
59
+ # A resource can have multiple sources. For example, exec can have both
60
+ # unless and returns. Combining the output of those can be confusing, so
61
+ # this presents them separate.
62
+ #
63
+ # @return [Hash[String, Array[String]]] The Puppet log messages for this resource
64
+ def log_messages_by_source
65
+ @logs.group_by { |log| log['source'] }.transform_values { |logs| logs.map { |log| log['message'] } }
66
+ end
67
+ end
68
+ end
@@ -123,7 +123,7 @@ module Kafo
123
123
 
124
124
  # mapping from configuration with stringified keys
125
125
  def mapping
126
- @mapping ||= Hash[@configuration.app[:mapping].map { |k, v| [k.to_s, v] }]
126
+ @mapping ||= @configuration.app[:mapping].transform_keys(&:to_s)
127
127
  end
128
128
 
129
129
  # custom module directory name
@@ -137,7 +137,7 @@ module Kafo
137
137
  end
138
138
 
139
139
  def get_class_name
140
- manifest_name == 'init' ? name : "#{dir_name}::#{manifest_name.gsub('/', '::')}"
140
+ (manifest_name == 'init') ? name : "#{dir_name}::#{manifest_name.gsub('/', '::')}"
141
141
  end
142
142
 
143
143
  def get_params_path
@@ -165,11 +165,11 @@ module Kafo
165
165
  end
166
166
 
167
167
  def default_manifest_name
168
- identifier.include?('::') ? identifier.split('::')[1..-1].join('/') : 'init'
168
+ identifier.include?('::') ? identifier.split('::')[1..].join('/') : 'init'
169
169
  end
170
170
 
171
171
  def default_params_name
172
- identifier.include?('::') ? (identifier.split('::')[1..-1] + ['params']).join('/') : 'params'
172
+ identifier.include?('::') ? (identifier.split('::')[1..] + ['params']).join('/') : 'params'
173
173
  end
174
174
 
175
175
  def get_name
@@ -0,0 +1,64 @@
1
+ module Kafo
2
+ # An abstraction over the Puppet report format
3
+ #
4
+ # @see https://puppet.com/docs/puppet/8/format_report.html
5
+ class PuppetReport
6
+ # Load a Puppet report from a path
7
+ #
8
+ # Both YAML and JSON are supported.
9
+ #
10
+ # @param [String] path
11
+ # The path to Puppet report
12
+ #
13
+ # @return [PuppetReport] The report from the path
14
+ def self.load_report_file(path)
15
+ raise ArgumentError, 'No path given' unless path || path.empty?
16
+ raise ArgumentError, "#{path} is not a readable file" unless File.file?(path) && File.readable?(path)
17
+
18
+ data = case File.extname(path)
19
+ when '.yaml'
20
+ require 'yaml'
21
+ content = File.read(path).gsub(%r{!ruby/object.*$}, '')
22
+ YAML.safe_load(content, permitted_classes: [Time, Symbol])
23
+ when '.json'
24
+ require 'json'
25
+ JSON.parse(File.read(path))
26
+ else
27
+ raise ArgumentError, "Unsupported file extension for #{path}"
28
+ end
29
+
30
+ PuppetReport.new(data)
31
+ end
32
+
33
+ # @param [Hash] report
34
+ # The Puppet report
35
+ def initialize(report)
36
+ @report = report
37
+ end
38
+
39
+ # @return [Integer] The report format
40
+ def report_format
41
+ @report['report_format']
42
+ end
43
+
44
+ # @return [Array[Hash]] The Puppet logs
45
+ def logs
46
+ @report['logs']
47
+ end
48
+
49
+ # @return [Array[PuppetFailedResource]] The failed resources and their status
50
+ def failed_resources
51
+ statuses = @report['resource_statuses']
52
+
53
+ raise PuppetReportError, "No resource statuses found in report" unless statuses
54
+
55
+ statuses.select { |_title, status| status['failed'] }.map do |title, status|
56
+ # TODO: There's also a message with source Puppet
57
+ # Executing with uid=USER: '/tmp/failing-command'
58
+ # This shows up after Executing '/tmp/failing-command'
59
+ related_logs = logs.select { |log| log['source'].include?(title) }
60
+ PuppetFailedResource.new(status, related_logs)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -35,7 +35,7 @@ module Kafo
35
35
  say ::HighLine.color("Available scenarios", :info)
36
36
  available_scenarios.each do |config_file, content|
37
37
  scenario = File.basename(config_file, '.yaml')
38
- use = (File.expand_path(config_file) == @previous_scenario ? 'INSTALLED' : "use: --scenario #{scenario}")
38
+ use = ((File.expand_path(config_file) == @previous_scenario) ? 'INSTALLED' : "use: --scenario #{scenario}")
39
39
  say ::HighLine.color(" #{content[:name]} ", :title)
40
40
  say "(#{use})"
41
41
  say " " + content[:description] if !content[:description].nil? && !content[:description].empty?
data/lib/kafo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
  module Kafo
3
3
  PARSER_CACHE_VERSION = 1
4
- VERSION = "7.0.0"
4
+ VERSION = "7.2.0"
5
5
  end
data/lib/kafo/wizard.rb CHANGED
@@ -190,7 +190,7 @@ END
190
190
  else
191
191
  HighLine::SystemExtensions.terminal_size
192
192
  end
193
- highline.wrap_at = data.first > 80 ? 80 : data.first if data.first
193
+ highline.wrap_at = (data.first > 80) ? 80 : data.first if data.first
194
194
  highline.page_at = data.last if data.last
195
195
  highline
196
196
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kafo
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marek Hulan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-05 00:00:00.000000000 Z
11
+ date: 2023-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -31,7 +31,7 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3'
33
33
  - !ruby/object:Gem::Dependency
34
- name: rake
34
+ name: minitest
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
@@ -45,7 +45,7 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  - !ruby/object:Gem::Dependency
48
- name: minitest
48
+ name: minitest-reporters
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
@@ -59,7 +59,7 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: minitest-reporters
62
+ name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
@@ -87,7 +87,7 @@ dependencies:
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  - !ruby/object:Gem::Dependency
90
- name: kafo_wizards
90
+ name: ansi
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - ">="
@@ -101,7 +101,7 @@ dependencies:
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
103
  - !ruby/object:Gem::Dependency
104
- name: ansi
104
+ name: kafo_wizards
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - ">="
@@ -273,8 +273,10 @@ files:
273
273
  - lib/kafo/progress_bars/colored.rb
274
274
  - lib/kafo/puppet_command.rb
275
275
  - lib/kafo/puppet_configurer.rb
276
+ - lib/kafo/puppet_failed_resource.rb
276
277
  - lib/kafo/puppet_log_parser.rb
277
278
  - lib/kafo/puppet_module.rb
279
+ - lib/kafo/puppet_report.rb
278
280
  - lib/kafo/scenario_manager.rb
279
281
  - lib/kafo/scenario_option.rb
280
282
  - lib/kafo/store.rb