kafo 0.7.2 → 0.7.3

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