kafo 7.0.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
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