kafo 0.7.2 → 0.7.3

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
  SHA1:
3
- metadata.gz: 631c545585673f01f7e7887718b47ccf1b28166f
4
- data.tar.gz: def948da2ad4fa1eda020e4d0a7e822fcfaa45b9
3
+ metadata.gz: 357f8e1980ad47e91e5c7d8320a8abab921bb1c8
4
+ data.tar.gz: cbd0e38cb265b461b1b37a7c4055b675263f41eb
5
5
  SHA512:
6
- metadata.gz: ed6861706c4aee64ac86bf1cd9af46bdec15a43375fe66738af4b941a96a84f21a405e9215719c4b23865b0dfab8a9d8edf50b72703dee46d1d69121fdbb488d
7
- data.tar.gz: f8d316dd8859f49d4ed8407c232337aa76782f1c767c9e4697f0caca046261f4e59338ccccaade0d9df51049d6da448b0e83f904527773a5ef616b619d39c5b6
6
+ metadata.gz: 929c44d536d597978e5cbc19989e496bed18386b254938d25c121046132a939f217b1c8393af8ede19f63d19756f3d2d0ea0f65c4c5e8091cdfad150fdd15c6f
7
+ data.tar.gz: 57167458f21fa390c7600879dcb9835264dfc931ac51b891213b8c9e99157864b2144b9666d64e40258770b11d097a45d67e4020d242658a8e82d685e0256e85
data/README.md CHANGED
@@ -302,7 +302,7 @@ The installer stores names of applied migrations in `<config>/installer-scenario
302
302
  It is recommended to prefix the migration names with `date +%y%m%d%H%M%S` to avoid migration ordering issues.
303
303
 
304
304
  In a migration you can modify the scenario configuration as well as the answer file. The changed configs are stored immediately after all the migrations were applied.
305
- If you just want to apply the migrations you can use `--migrations-only` switch.
305
+ If you just want to apply the migrations you can use `--migrations-only` switch.
306
306
  Note that `--noop` and `--dont-save-answers` has no effect on migrations.
307
307
 
308
308
  Sample migration adding new module could look like as follows:
@@ -317,6 +317,20 @@ Sample migration adding new module could look like as follows:
317
317
  EOF
318
318
  ```
319
319
 
320
+ ### Enabling/disabling scenarios
321
+
322
+ Scenarios that are deprecated or wanted to be hidden on the system can be disabled with:
323
+
324
+ ```bash
325
+ foreman-installer --disable-scenario deprecated-scenario
326
+ Scenario deprecated-scenario was disabled.
327
+ ```
328
+ The disabled scenario is not shown in the scenario list and is prevented from being installed.
329
+ It is not deleted from the file system however so the custom values in the answer file are preserved
330
+ and e.g. migration to new scenario is still possible.
331
+
332
+ Disabled scenario can be enabled back again with `foreman-installer --enable-scenario SCENARIO`.
333
+
320
334
  ## Documentation
321
335
 
322
336
  Every parameter that can be set by kafo *must* be documented. This means that
@@ -894,6 +908,22 @@ parameter `--skip-checks-i-know-better` (or `-s`). This will completely
894
908
  disable running all system check scripts. Note that this option is
895
909
  not persisted between runs.
896
910
 
911
+ ## Parser cache
912
+
913
+ A cache of parsed Puppet modules and manifests can be created to skip the use
914
+ of kafo_parsers at runtime. This is useful when kafo_parsers doesn't support the
915
+ version of Puppet in use, and may also provide a small performance benefit.
916
+
917
+ Create the cache with `kafo-export-params -f parsercache --no-parser-cache` and
918
+ configure it in config/kafo.yaml with:
919
+
920
+ ```yaml
921
+ :parser_cache_path: ./parser_cache.yaml
922
+ ```
923
+
924
+ The cache will be skipped if the file modification time of the manifest is
925
+ greater than the mtime recorded in the cache.
926
+
897
927
  ## Exit code
898
928
 
899
929
  Kafo can terminate either before or after puppet is run. If it is run with
@@ -913,7 +943,7 @@ Other exit codes that can be returned:
913
943
  * '24' means that your answer file asks for puppet module that you did not provide
914
944
  * '25' means that kafo could not get default values from puppet
915
945
  * '26' means that kafo could not find the specified scenario
916
- * '27' means that kafo found previous installation that has different scenario than is the specified scenario
946
+ * '27' means that kafo found found scenario configuration error that prevents installation from continuing
917
947
  * '130' user interrupt (^C)
918
948
 
919
949
  ## Running Puppet Profiling
@@ -3,12 +3,12 @@ require 'rubygems'
3
3
  require 'ostruct'
4
4
  require 'clamp'
5
5
  require 'logging'
6
- require 'kafo/string_helper'
6
+ require 'kafo/configuration'
7
7
  require 'kafo/exceptions'
8
+ require 'kafo/parser_cache_writer'
9
+ require 'kafo/string_helper'
8
10
  require 'logger'
9
-
10
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'kafo'))
11
- require 'configuration'
11
+ require 'yaml'
12
12
 
13
13
  KafoConfigure = OpenStruct.new
14
14
  def KafoConfigure.exit(code)
@@ -17,35 +17,53 @@ end
17
17
 
18
18
  module Kafo
19
19
  class KafoExportParams < Clamp::Command
20
- TYPES = %w(md html asciidoc)
20
+ TYPES = %w(md html asciidoc parsercache)
21
21
 
22
22
  option ['-c', '--config'], 'FILE', 'Config file for which should we generate params',
23
23
  :required => true
24
24
 
25
25
  option ['-f', '--format'], 'FORMAT',
26
- 'Config file for which should we generate params', :default => 'md' do |format|
26
+ "Format parameters will be written in, valid options: #{TYPES.join(',')}", :default => 'md' do |format|
27
27
  format = format.downcase
28
28
  raise ArgumentError unless TYPES.include?(format)
29
29
  format
30
30
  end
31
31
 
32
+ option ['-o', '--output'], 'FILE', 'Output file to write parameters into', :default => '-'
33
+
34
+ option '--[no-]parser-cache', :flag, 'Enable or disable the parser cache, disable for fresh results', :default => true
35
+
32
36
  def execute
33
37
  c = Configuration.new(config, false)
38
+ c.app[:parser_cache_path] = nil unless parser_cache?
34
39
  KafoConfigure.config = c
35
40
  KafoConfigure.root_dir = File.expand_path(c.app[:installer_dir])
36
- KafoConfigure.module_dirs = File.expand_path(c.app[:module_dirs])
37
- KafoConfigure.logger = Logger.new(STDOUT)
41
+ KafoConfigure.module_dirs = c.module_dirs
42
+ KafoConfigure.logger = Logger.new(STDERR)
38
43
 
39
- exporter = self.class.const_get(format.capitalize).new(c)
44
+ if output == '-'
45
+ file = STDOUT
46
+ else
47
+ file = File.open(output, 'w')
48
+ end
49
+
50
+ exporter = self.class.const_get(format.capitalize).new(c, file)
40
51
  exporter.print_out
41
52
  end
42
53
 
43
- class Html
44
- include StringHelper
45
-
46
- def initialize(config)
54
+ class Writer
55
+ def initialize(config, file)
47
56
  @config = config
57
+ @file = file
58
+ end
59
+
60
+ def puts(*args)
61
+ @file.puts(*args)
48
62
  end
63
+ end
64
+
65
+ class Html < Writer
66
+ include StringHelper
49
67
 
50
68
  def print_out
51
69
  puts '<div id="installer-options">'
@@ -79,13 +97,9 @@ module Kafo
79
97
  end
80
98
  end
81
99
 
82
- class Asciidoc
100
+ class Asciidoc < Writer
83
101
  include StringHelper
84
102
 
85
- def initialize(config)
86
- @config = config
87
- end
88
-
89
103
  def print_out
90
104
  @config.modules.sort.each do |mod|
91
105
  puts "Parameters for '#{mod.name}':\n\n"
@@ -99,12 +113,12 @@ module Kafo
99
113
  end
100
114
  end
101
115
 
102
- class Md
116
+ class Md < Writer
103
117
  include StringHelper
104
118
 
105
- def initialize(config)
106
- @config = config
107
- @max = max_description_length
119
+ def initialize(*args)
120
+ super
121
+ @max = max_description_length
108
122
  end
109
123
 
110
124
  def print_out
@@ -129,6 +143,12 @@ module Kafo
129
143
  doc_lengths.max
130
144
  end
131
145
  end
146
+
147
+ class Parsercache < Writer
148
+ def print_out
149
+ puts Kafo::ParserCacheWriter.write(@config.modules).to_yaml
150
+ end
151
+ end
132
152
  end
133
153
  end
134
154
 
@@ -16,6 +16,8 @@
16
16
  # :module_dirs: /usr/share/kafo/modules
17
17
  # Similar as modules_dir but for kafo internal modules, leave nil if you don't need to change it
18
18
  # :kafo_modules_dir:
19
+ # Location of an optional cache of parsed module data, generate with kafo-export-params -f parsercache
20
+ # :parser_cache_path: /usr/share/kafo/parser_cache.yaml
19
21
  # Enable colors? If you don't touch this, we'll autodetect terminal capabilities
20
22
  # :colors: true
21
23
  # Color scheme, we support :bright and :dark (first is better for white background, dark for black background)
@@ -12,6 +12,7 @@ module Kafo
12
12
  DEFAULT = {
13
13
  :name => '',
14
14
  :description => '',
15
+ :enabled => true,
15
16
  :log_dir => '/var/log/kafo',
16
17
  :log_name => 'configuration.log',
17
18
  :log_level => 'info',
@@ -26,7 +27,8 @@ module Kafo
26
27
  :hook_dirs => [],
27
28
  :custom => {},
28
29
  :low_priority_modules => [],
29
- :verbose_log_level => 'info'
30
+ :verbose_log_level => 'info',
31
+ :parser_cache_path => './config/parser_cache.json'
30
32
  }
31
33
 
32
34
  def initialize(file, persist = true)
@@ -256,6 +258,12 @@ module Kafo
256
258
  @config_file.gsub(/\.yaml$/, '.migrations')
257
259
  end
258
260
 
261
+ def parser_cache
262
+ if app[:parser_cache_path]
263
+ @parser_cache ||= Kafo::ParserCacheReader.new_from_file(File.expand_path(app[:parser_cache_path]))
264
+ end
265
+ end
266
+
259
267
  private
260
268
 
261
269
  def custom_storage
@@ -52,6 +52,8 @@ module Kafo
52
52
 
53
53
  # Handle --list-scenarios before we need them
54
54
  scenario_manager.list_available_scenarios if ARGV.include?('--list-scenarios')
55
+ scenario_manager.check_enable_scenario
56
+ scenario_manager.check_disable_scenario
55
57
  setup_config(config_file)
56
58
 
57
59
  self.class.hooking.execute(:pre_migrations)
@@ -76,7 +78,7 @@ module Kafo
76
78
 
77
79
  if scenario_manager.configured?
78
80
  scenario_manager.check_scenario_change(self.class.config_file)
79
- if scenario_manager.scenario_changed?(self.class.config_file)
81
+ if scenario_manager.scenario_changed?(self.class.config_file) && !self.class.in_help_mode?
80
82
  prev_config = scenario_manager.load_configuration(scenario_manager.previous_scenario)
81
83
  prev_config.run_migrations
82
84
  self.class.config.migrate_configuration(prev_config, :skip => [:log_name])
@@ -164,6 +166,10 @@ module Kafo
164
166
  self.exit_handler.exit_code
165
167
  end
166
168
 
169
+ def self.in_help_mode?
170
+ ARGV.include?('--help') || ARGV.include?('--full-help') || ARGV.include?('-h')
171
+ end
172
+
167
173
  def exit_code
168
174
  self.class.exit_code
169
175
  end
@@ -270,6 +276,8 @@ module Kafo
270
276
  self.class.app_option ['-l', '--verbose-log-level'], 'LEVEL', 'Log level for verbose mode output',
271
277
  :default => 'info'
272
278
  self.class.app_option ['-S', '--scenario'], 'SCENARIO', 'Use installation scenario'
279
+ self.class.app_option ['--disable-scenario'], 'SCENARIO', 'Disable installation scenario'
280
+ self.class.app_option ['--enable-scenario'], 'SCENARIO', 'Enable installation scenario'
273
281
  self.class.app_option ['--list-scenarios'], :flag, 'List available installation scenaraios'
274
282
  self.class.app_option ['--force'], :flag, 'Force change of installation scenaraio'
275
283
  self.class.app_option ['--compare-scenarios'], :flag, 'Show changes between last used scenario and the scenario specified with -S or --scenario argument'
@@ -79,7 +79,7 @@ module Kafo
79
79
  end
80
80
 
81
81
  def get_type(type)
82
- type = type.capitalize
82
+ type = (type || 'string').capitalize
83
83
  Params.const_defined?(type) ? Params.const_get(type) : raise(TypeError, "undefined parameter type '#{type}'")
84
84
  end
85
85
  end
@@ -0,0 +1,47 @@
1
+ module Kafo
2
+ class ParserCacheReader
3
+ def self.new_from_file(cache_path)
4
+ if cache_path.nil? || cache_path.empty?
5
+ logger.debug "No parser cache configured in :parser_cache_path, skipping setup"
6
+ return nil
7
+ end
8
+
9
+ unless File.exist?(cache_path)
10
+ logger.warn "Parser cache configured at #{cache_path} is missing, skipping setup"
11
+ return nil
12
+ end
13
+
14
+ parsed = YAML.load(File.read(cache_path))
15
+ if !parsed.is_a?(Hash) || parsed[:version] != 1 || !parsed[:files].is_a?(Hash)
16
+ logger.warn "Parser cache is from a different version of Kafo, skipping setup"
17
+ return nil
18
+ end
19
+
20
+ logger.debug "Using #{cache_path} cache with parsed modules"
21
+ new(parsed)
22
+ end
23
+
24
+ def self.logger
25
+ KafoConfigure.logger
26
+ end
27
+
28
+ def initialize(cache)
29
+ @cache = cache
30
+ end
31
+
32
+ def logger
33
+ KafoConfigure.logger
34
+ end
35
+
36
+ def get(key, manifest_path)
37
+ return nil unless @cache[:files].has_key?(key)
38
+
39
+ if @cache[:files][key][:mtime] && File.mtime(manifest_path).to_i > @cache[:files][key][:mtime]
40
+ logger.debug "Parser cache for #{manifest_path} is outdated, ignoring cache entry"
41
+ return nil
42
+ end
43
+
44
+ @cache[:files][key][:data]
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,14 @@
1
+ module Kafo
2
+ class ParserCacheWriter
3
+ def self.write(modules)
4
+ {
5
+ :version => 1,
6
+ :files => Hash[modules.sort.map { |m| write_module(m) }]
7
+ }
8
+ end
9
+
10
+ def self.write_module(mod)
11
+ [mod.identifier, {:data => mod.raw_data, :mtime => File.mtime(mod.manifest_path).to_i}]
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  require 'kafo/param'
3
3
  require 'kafo/param_builder'
4
+ require 'kafo/parser_cache_reader'
4
5
  require 'kafo_parsers/puppet_module_parser'
5
6
  require 'kafo/validator'
6
7
 
@@ -9,7 +10,7 @@ module Kafo
9
10
  PRIMARY_GROUP_NAME = 'Parameters'
10
11
 
11
12
  attr_reader :name, :identifier, :params, :dir_name, :class_name, :manifest_name, :manifest_path,
12
- :groups, :params_path, :params_class_name, :configuration
13
+ :groups, :params_path, :params_class_name, :configuration, :raw_data
13
14
 
14
15
  def initialize(identifier, parser = KafoParsers::PuppetModuleParser, configuration = KafoConfigure.config)
15
16
  @identifier = identifier
@@ -27,6 +28,7 @@ module Kafo
27
28
  end
28
29
  @manifest_path = File.join(module_dir, module_manifest_path)
29
30
  @parser = parser
31
+ @parser_cache = @configuration.parser_cache
30
32
  @validations = []
31
33
  @logger = KafoConfigure.logger
32
34
  @groups = {}
@@ -48,9 +50,10 @@ module Kafo
48
50
 
49
51
  def parse(builder_klass = ParamBuilder)
50
52
  @params = []
51
- raw_data = @parser.parse(manifest_path)
52
- builder = builder_klass.new(self, raw_data)
53
- @validations = raw_data[:validations]
53
+ @raw_data = @parser_cache.get(identifier, manifest_path) if @parser_cache
54
+ @raw_data ||= @parser.parse(manifest_path)
55
+ builder = builder_klass.new(self, @raw_data)
56
+ @validations = @raw_data[:validations]
54
57
 
55
58
  builder.validate
56
59
  @params = builder.build_params
@@ -17,7 +17,7 @@ module Kafo
17
17
  @available_scenarios ||= Dir.glob(File.join(config_dir, '*.yaml')).reject { |f| f =~ /#{last_scenario_link}$/ }.inject({}) do |scns, scn_file|
18
18
  begin
19
19
  content = YAML.load_file(scn_file)
20
- if content.is_a?(Hash) && content.has_key?(:answer_file)
20
+ if content.is_a?(Hash) && content.has_key?(:answer_file) && content.fetch(:enabled, true)
21
21
  # add scenario name for legacy configs
22
22
  content[:name] = File.basename(scn_file, '.yaml') unless content.has_key?(:name)
23
23
  scns[scn_file] = content
@@ -76,14 +76,13 @@ module Kafo
76
76
  !!(defined?(CONFIG_DIR) && CONFIG_DIR)
77
77
  end
78
78
 
79
- def scenario_from_args
79
+ def scenario_from_args(arg_name='--scenario|-S')
80
80
  # try scenario provided in the args via -S or --scenario
81
- parsed = ARGV.join(" ").match /(--scenario|-S)(\s+|[=]?)(\S+)/
81
+ parsed = ARGV.join(" ").match /(#{arg_name})(\s+|[=]?)(\S+)/
82
82
  if parsed
83
83
  scenario_file = File.join(config_dir, "#{parsed[3]}.yaml")
84
84
  return scenario_file if File.exists?(scenario_file)
85
- KafoConfigure.logger.fatal "Scenario (#{scenario_file}) was not found, can not continue"
86
- KafoConfigure.exit(:unknown_scenario)
85
+ fail_now("Scenario (#{scenario_file}) was not found, can not continue", :unknown_scenario)
87
86
  end
88
87
  end
89
88
 
@@ -93,20 +92,13 @@ module Kafo
93
92
  select_scenario_interactively
94
93
  if scenario.nil?
95
94
  fail_now("Scenario was not selected, can not continue. Use --list-scenarios to list available options.", :unknown_scenario)
95
+ elsif !scenario_enabled?(scenario)
96
+ fail_now("Selected scenario is DISABLED, can not continue. Use --list-scenarios to list available options." \
97
+ " You can also --enable-scenario SCENARIO to make the selected scenario available.", :scenario_error)
96
98
  end
97
99
  scenario
98
100
  end
99
101
 
100
- def scenario_from_args
101
- # try scenario provided in the args via -S or --scenario
102
- parsed = ARGV.join(" ").match /(--scenario|-S)(\s+|[=]?)(\S+)/
103
- if parsed
104
- scenario_file = File.join(config_dir, "#{parsed[3]}.yaml")
105
- return scenario_file if File.exists?(scenario_file)
106
- fail_now("Scenario (#{scenario_file}) was not found, can not continue", :unknown_scenario)
107
- end
108
- end
109
-
110
102
  def show_scenario_diff(prev_scenario, new_scenario)
111
103
  say ::HighLine.color("Scenarios are being compared, that may take a while...", :info)
112
104
  prev_conf = load_and_setup_configuration(prev_scenario)
@@ -126,27 +118,48 @@ module Kafo
126
118
  end
127
119
  end
128
120
 
121
+ def check_enable_scenario
122
+ scenario = scenario_from_args('--enable-scenario')
123
+ set_scenario_availability(scenario, true) if scenario
124
+ end
125
+
126
+ def check_disable_scenario
127
+ scenario = scenario_from_args('--disable-scenario')
128
+ set_scenario_availability(scenario, false) if scenario
129
+ end
130
+
131
+ def set_scenario_availability(scenario, available)
132
+ cfg = load_configuration(scenario)
133
+ cfg.app[:enabled] = available
134
+ cfg.save_configuration(cfg.app)
135
+ say "Scenario #{File.basename(scenario, ".yaml")} was #{available ? "enabled" : "disabled"}"
136
+ KafoConfigure.exit(0)
137
+ end
138
+
139
+ def scenario_enabled?(scenario)
140
+ load_configuration(scenario).app[:enabled]
141
+ end
142
+
129
143
  def confirm_scenario_change(new_scenario)
130
- unless ARGV.include?('--force')
131
- if (ARGV & ['--interactive', '-i']).any?
132
- show_scenario_diff(@previous_scenario, new_scenario)
133
-
134
- wizard = KafoWizards.wizard(:cli, 'Confirm installation scenario selection',
135
- :description => "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. Please confirm that you want to proceed.")
136
- wizard.entries << wizard.factory.button(:proceed, :label => 'Proceed with selected installation scenario', :default => false)
137
- wizard.entries << wizard.factory.button(:cancel, :label => 'Cancel Installation', :default => true)
138
- result = wizard.run
139
- if result == :cancel
140
- say 'Installation was cancelled by user'
141
- dump_log_and_exit(0)
142
- end
143
- else
144
- message = "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. " +
145
- "Use --force to override. You can use --compare-scenarios to see the differences"
146
- KafoConfigure.logger.error(message)
147
- dump_log_and_exit(:scenario_error)
144
+ if (ARGV & ['--interactive', '-i']).any?
145
+ show_scenario_diff(@previous_scenario, new_scenario)
146
+
147
+ wizard = KafoWizards.wizard(:cli, 'Confirm installation scenario selection',
148
+ :description => "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. Please confirm that you want to proceed.")
149
+ wizard.entries << wizard.factory.button(:proceed, :label => 'Proceed with selected installation scenario', :default => false)
150
+ wizard.entries << wizard.factory.button(:cancel, :label => 'Cancel Installation', :default => true)
151
+ result = wizard.run
152
+ if result == :cancel
153
+ say 'Installation was cancelled by user'
154
+ dump_log_and_exit(0)
148
155
  end
156
+ elsif !ARGV.include?('--force') && !KafoConfigure.in_help_mode?
157
+ message = "You are trying to replace existing installation with different scenario. This may lead to unpredictable states. " +
158
+ "Use --force to override. You can use --compare-scenarios to see the differences"
159
+ KafoConfigure.logger.error(message)
160
+ dump_log_and_exit(:scenario_error)
149
161
  end
162
+ true
150
163
  end
151
164
 
152
165
  def print_scenario_diff(prev_conf, new_conf)
@@ -3,7 +3,7 @@
3
3
  module Kafo
4
4
  class SystemChecker
5
5
  def self.check
6
- KafoConfigure.check_dirs.each do |dir|
6
+ KafoConfigure.check_dirs.all? do |dir|
7
7
  new(File.join(dir, '*')).check
8
8
  end
9
9
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module Kafo
3
- VERSION = "0.7.2"
3
+ VERSION = "0.7.3"
4
4
  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: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marek Hulan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-23 00:00:00.000000000 Z
11
+ date: 2016-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "<"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 11.0.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "<"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 11.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -241,6 +241,8 @@ files:
241
241
  - lib/kafo/params/integer.rb
242
242
  - lib/kafo/params/password.rb
243
243
  - lib/kafo/params/string.rb
244
+ - lib/kafo/parser_cache_reader.rb
245
+ - lib/kafo/parser_cache_writer.rb
244
246
  - lib/kafo/password_manager.rb
245
247
  - lib/kafo/progress_bar.rb
246
248
  - lib/kafo/progress_bars/black_white.rb