kojo 0.3.3 → 0.3.8

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: 74de16b71f9f82631f4c62aa2f8a295b1c575ec72115d010d7188a7fbd412114
4
- data.tar.gz: fd97420ac441b2872c9c48b9326057e441fac811efba27e4763852655c6a479d
3
+ metadata.gz: 31deffc66dbb1ff100bb90f669f8d2995f8eeac92c78919434caffbb9ecfee69
4
+ data.tar.gz: 6c4b75d7e13b627520d403d8885333a9c30b06cd40c56889e2cd4823ac125b12
5
5
  SHA512:
6
- metadata.gz: de8d9c02d15b26336b345a585130077ae17052e0876bd2ae5abdc5048d7f7eb18f10808ef8d99d96a0083cccac67a52497d66ee05ab120f1a15c834712accb3d
7
- data.tar.gz: 982cbeb243666fe90116dc179634d19d9075889b8a9cc65053dc75a8646892522423340e9fad2794c200899336cc23ddd56855ca51a2c6428ab2a82eef9a41c8
6
+ metadata.gz: b6731a253afc7c3ccdb8f718e4a78d70d6bfcea9079c269f0b9ca1d8da3596abcbfd5b895fa2e32bbc2b14629c4b5a022cd7996fb3428a6260cb5b5b64b97aa8
7
+ data.tar.gz: 0c285f0dcaeff09fb183fe2f02e8f25a9905b4431bca7908dfc0824bfd5caba74d215476e661b519733c790b2b79ea599c9d325f03bdab7c847f98761c815ffc
data/README.md CHANGED
@@ -2,24 +2,22 @@
2
2
 
3
3
  ![kojo](images/kojo.png)
4
4
 
5
- Kojo Configuration Ninja
6
- ==================================================
5
+ # Kojo Configuration Ninja
7
6
 
8
7
  [![Gem Version](https://badge.fury.io/rb/kojo.svg)](https://badge.fury.io/rb/kojo)
9
- [![Build Status](https://travis-ci.com/DannyBen/kojo.svg?branch=master)](https://travis-ci.com/DannyBen/kojo)
8
+ [![Build Status](https://github.com/DannyBen/kojo/workflows/Test/badge.svg)](https://github.com/DannyBen/kojo/actions?query=workflow%3ATest)
10
9
  [![Maintainability](https://api.codeclimate.com/v1/badges/f24566ad04b5054a2251/maintainability)](https://codeclimate.com/github/DannyBen/kojo/maintainability)
11
10
 
12
11
 
13
12
  Kojo helps you generate configuration files from templates, using variables
14
- and definition files.
15
- It is a command line utility, and it works on any text file format.
13
+ and definition files. It is a command line utility, and works on any text file
14
+ format.
16
15
 
17
16
  </div>
18
17
 
19
18
  ---
20
19
 
21
- Table of Contents
22
- --------------------------------------------------
20
+ ## Table of Contents
23
21
 
24
22
  - [Installation](#installation)
25
23
  - [Usage](#usage)
@@ -28,28 +26,32 @@ Table of Contents
28
26
  - [Transform an Entire Folder](#transform-an-entire-folder)
29
27
  - [Transform One to Many using Config](#transform-one-to-many-using-config)
30
28
  - [Transform One to Many using Front Matter](#transform-one-to-many-using-front-matter)
29
+ - [Interactive Form Templates](#interactive-form-templates)
31
30
  - [Conditions and Loops with ERB](#conditions-and-loops-with-erb)
32
- - [Interactive Mode](#interactive-mode)
31
+ - [Interactive Fallback](#interactive-fallback)
33
32
  - [Using from Ruby Code](#using-from-ruby-code)
34
33
  - [Contributing / Support](#contributing--support)
35
34
 
36
35
  ---
37
36
 
38
- Installation
39
- --------------------------------------------------
37
+ ## Installation
40
38
 
41
- $ gem install kojo
39
+ ```shell
40
+ $ gem install kojo
41
+ ```
42
42
 
43
+ Or with Docker:
43
44
 
45
+ ```shell
46
+ $ alias kojo='docker run --rm -it -v "$PWD:/app" dannyben/kojo'
47
+ ```
44
48
 
45
- Usage
46
- --------------------------------------------------
49
+ ## Usage
47
50
 
48
51
  If you prefer to learn by example, see the [examples](examples#examples) folder for
49
52
  several use cases. Each example subfolder contains the command to run, the
50
53
  relevant files, and the expected output.
51
54
 
52
-
53
55
  ### Variables
54
56
 
55
57
  ![kojo](images/features-vars.svg)
@@ -63,8 +65,6 @@ Include variables in your configuration templates by using this syntax:
63
65
  - Variables from the top level will be forwarded downstream, and aggregated
64
66
  with any additional variables that are defined in subsequent `@imports`.
65
67
 
66
-
67
-
68
68
  ### Import
69
69
 
70
70
  ![kojo](images/features-import.svg)
@@ -86,8 +86,6 @@ resulting configuration file.
86
86
 
87
87
  The space after `filename` is optional.
88
88
 
89
-
90
-
91
89
  ### Transform an Entire Folder
92
90
 
93
91
  ![kojo](images/features-dir.svg)
@@ -97,8 +95,6 @@ output folder, with all the variables and `@imports` evaluated.
97
95
 
98
96
  You may use `%{variables}` in filenames.
99
97
 
100
-
101
-
102
98
  ### Transform One to Many using Config
103
99
 
104
100
  ![kojo](images/features-config.svg)
@@ -169,6 +165,20 @@ Your template that uses %{arg} goes here
169
165
  Additional arguments provided to the command line, will also be transferred
170
166
  to the template.
171
167
 
168
+ ### Interactive Form Templates
169
+
170
+ ![kojo](images/features-form.svg)
171
+
172
+ Using the `kojo form` command lets you define an ERB or [ERBX][erbx] template, and include interactive prompts to enter the input.
173
+
174
+ 1. Use either ERB tags (`<%= %>`, `<%- -%>`) or ERBX tags (`{{ }}`, `(( ))`).
175
+ 2. Use the built in `prompt` object, which is a [TTY::Prompt](tty-prompt) instance, to prompt for input when running the command (for example: `{{ prompt.ask? "Your Name?" }}`)
176
+ 3. Any unidentified ruby command will be forwarded to the `prompt` object, so `prompt.ask` is the same as just using `ask`.
177
+ 4. If there is a file with the same name as the template, and with an `.rb` extension (for example `form.md` and `form.md.rb`), then the ruby file will be loaded into the ERB template as if it was written inside it.
178
+ 5. If you prefer using a single template file (without the ruby appendix), you can simply use regular ERB/ERBX tags, like demonstrated below.
179
+
180
+ ![kojo](images/features-form-inline.svg)
181
+
172
182
  ### Conditions and Loops with ERB
173
183
 
174
184
  ![kojo](images/features-erb.svg)
@@ -182,10 +192,7 @@ Use this syntax for ruby code:
182
192
  <%- ruby code here -%> # for code that should not be printed
183
193
  <%= ruby code here -%> # for code that should be printed
184
194
  ```
185
-
186
-
187
- Interactive Mode
188
- --------------------------------------------------
195
+ ## Interactive Fallback
189
196
 
190
197
  When Kojo encounters a variable that was not supplied (either through the command
191
198
  line or through a configuration file), it will prompt for a value.
@@ -201,21 +208,20 @@ running from within Ruby code.
201
208
  When running from within Ruby code, you can also use `Kojo.interactive = true`
202
209
  and `Kojo.interactive?` to get the current state.
203
210
 
204
-
205
- Using from Ruby Code
206
- --------------------------------------------------
211
+ ## Using from Ruby Code
207
212
 
208
213
  Although Kojo was primarily designed as a command line utility, you can also
209
214
  use it as a library from your Ruby code.
210
215
 
211
216
  These are the primary classes:
212
217
 
213
- | Class | Description | CLI equivalent
214
- |-----------------------------|----------------------------------------------|---------------
215
- | `Kojo::Template` | generate from a single template | `kojo file`
216
- | `Kojo::FrontMatterTemplate` | generate from a template with a front matter | `kojo single`
217
- | `Kojo::Config` | generate from a config file | `kojo config`
218
- | `Kojo::Collection` | generate from a directory | `kojo dir`
218
+ | Class | Description | CLI equivalent |
219
+ | --------------------------- | -------------------------------------------- | -------------- |
220
+ | `Kojo::Template` | generate from a single template | `kojo file` |
221
+ | `Kojo::FrontMatterTemplate` | generate from a template with a front matter | `kojo single` |
222
+ | `Kojo::Config` | generate from a config file | `kojo config` |
223
+ | `Kojo::Collection` | generate from a directory | `kojo dir` |
224
+ | `Kojo::Form` | generate interactively | `kojo form` |
219
225
 
220
226
  ### Examples
221
227
 
@@ -246,9 +252,13 @@ end
246
252
  template = Kojo::FrontMatterTemplate.new 'examples/single/Dockerfile'
247
253
  params = { version: '0.1.1' }
248
254
 
249
- result = template.render params do |path, content|
255
+ template.render params do |path, content|
250
256
  # code to handle results here
251
257
  end
258
+
259
+ # Form
260
+ template = Kojo::Form.new 'examples/form/movie.md'
261
+ puts template.render
252
262
  ```
253
263
 
254
264
  In addition, Kojo extends Ruby's `File` class with the `File.deep_write`
@@ -265,12 +275,13 @@ config.generate do |path, content|
265
275
  end
266
276
  ```
267
277
 
268
- Contributing / Support
269
- --------------------------------------------------
278
+ ## Contributing / Support
270
279
 
271
280
  If you experience any issue, have a question or a suggestion, or if you wish
272
281
  to contribute, feel free to [open an issue][issues].
273
282
 
274
283
  ---
275
284
 
276
- [issues]: https://github.com/DannyBen/kojo/issues
285
+ [issues]: https://github.com/DannyBen/kojo/issues
286
+ [erbx]: https://github.com/DannyBen/erbx
287
+ [tty-prompt]: https://github.com/piotrmurach/tty-prompt#contents
@@ -1,6 +1,9 @@
1
1
  require 'requires'
2
2
  require 'byebug' if ENV['BYEBUG']
3
3
 
4
+ require 'yaml'
5
+ require 'json'
6
+
4
7
  requires 'kojo/refinements'
5
8
  requires 'kojo/extensions'
6
9
 
@@ -9,6 +12,7 @@ require 'kojo/template'
9
12
  require 'kojo/collection'
10
13
  require 'kojo/config'
11
14
  require 'kojo/front_matter_template'
15
+ require 'kojo/form'
12
16
 
13
17
  module Kojo
14
18
  class << self
@@ -15,6 +15,8 @@ module Kojo
15
15
  runner.route 'dir', to: Kojo::Commands::DirCmd
16
16
  runner.route 'config', to: Kojo::Commands::ConfigCmd
17
17
  runner.route 'single', to: Kojo::Commands::SingleCmd
18
+ runner.route 'form', to: Kojo::Commands::FormCmd
19
+ runner.route 'tojson', to: Kojo::Commands::ToJsonCmd
18
20
 
19
21
  runner
20
22
  end
@@ -12,15 +12,19 @@ module Kojo
12
12
  @import_base = dir
13
13
  end
14
14
 
15
- def render(args={}, &block)
15
+ def render(args = {}, &block)
16
16
  files.each do |file|
17
17
  handle file, args, &block
18
18
  end
19
19
  end
20
20
 
21
+ def size
22
+ files.size
23
+ end
24
+
21
25
  private
22
26
 
23
- def handle(file, args={})
27
+ def handle(file, args = {})
24
28
  template = Template.new file
25
29
  template.import_base = import_base
26
30
 
@@ -34,7 +38,9 @@ module Kojo
34
38
  raise Kojo::NotFoundError, "Directory not found: #{dir}" unless Dir.exist? dir
35
39
  raise Kojo::NotFoundError, "Directory is empty: #{dir}" if Dir.empty? dir
36
40
 
37
- @files = Dir["#{dir}/**/*"].reject { |f| File.directory? f }.sort
41
+ @files = Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH)
42
+ .reject { |f| File.directory? f }
43
+ .sort
38
44
  end
39
45
  end
40
46
  end
@@ -4,9 +4,8 @@ module Kojo
4
4
  module Commands
5
5
  class CommandBase < MisterBin::Command
6
6
  def save(file, output)
7
- outpath = "#{outdir}/#{file}"
8
- File.deep_write outpath, output
9
- say "Saved #{outpath}"
7
+ File.deep_write file, output
8
+ say "Saved #{file}"
10
9
  end
11
10
  end
12
11
  end
@@ -3,7 +3,7 @@ require 'mister_bin'
3
3
 
4
4
  module Kojo::Commands
5
5
  # Handle calls to the +kojo config+ command
6
- class ConfigCmd < MisterBin::Command
6
+ class ConfigCmd < CommandBase
7
7
  using Kojo::Refinements
8
8
 
9
9
  attr_reader :gen, :outdir, :opts, :import_base, :config_file
@@ -59,13 +59,5 @@ module Kojo::Commands
59
59
  say output
60
60
  end
61
61
  end
62
-
63
- def save(path, output)
64
- dir = File.dirname path
65
- FileUtils.mkdir_p dir unless Dir.exist? dir
66
- File.write path, output
67
- say "Saved #{path}"
68
- end
69
-
70
62
  end
71
63
  end
@@ -62,7 +62,7 @@ module Kojo
62
62
 
63
63
  def write(collection)
64
64
  collection.render @opts do |file, output|
65
- save file, output
65
+ save "#{outdir}/#{file}", output
66
66
  end
67
67
  end
68
68
  end
@@ -3,7 +3,7 @@ require 'mister_bin'
3
3
  module Kojo
4
4
  module Commands
5
5
  # Handle calls to the +kojo file+ command
6
- class FileCmd < MisterBin::Command
6
+ class FileCmd < CommandBase
7
7
  using Kojo::Refinements
8
8
 
9
9
  attr_reader :opts, :outfile, :infile, :import_base
@@ -48,8 +48,7 @@ module Kojo
48
48
  output = template.render(opts)
49
49
 
50
50
  if outfile
51
- File.write outfile, output
52
- say "Saved #{outfile}"
51
+ save outfile, output
53
52
  else
54
53
  puts output
55
54
  end
@@ -0,0 +1,35 @@
1
+ require 'mister_bin'
2
+
3
+ module Kojo
4
+ module Commands
5
+ # Handle calls to the +kojo form+ command
6
+ class FormCmd < CommandBase
7
+ attr_reader :infile, :outdir
8
+
9
+ help "Fill a template form interactively"
10
+
11
+ usage "kojo form INFILE [--save FILE]"
12
+ usage "kojo form (-h|--help)"
13
+
14
+ option "-s --save FILE", "Save to file instead of printing"
15
+
16
+ param "INFILE", "ERBX template to transform"
17
+
18
+ example "kojo form report.md"
19
+ example "kojo form report.md --save output.md"
20
+
21
+ def run
22
+ infile = args['INFILE']
23
+ outfile = args['--save']
24
+ template = Kojo::Form.new infile
25
+
26
+ if outfile
27
+ save outfile, template.render
28
+ else
29
+ puts template.render
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -46,7 +46,7 @@ module Kojo
46
46
 
47
47
  def write(template)
48
48
  template.render opts do |file, output|
49
- save file, output
49
+ save "#{outdir}/#{file}", output
50
50
  end
51
51
  end
52
52
  end
@@ -0,0 +1,67 @@
1
+ require 'mister_bin'
2
+
3
+ module Kojo
4
+ module Commands
5
+ # Handle calls to the +kojo dir+ command
6
+ class ToJsonCmd < CommandBase
7
+ using Kojo::Refinements
8
+
9
+ attr_reader :input, :save_files, :replace_files
10
+
11
+ help "Convert one or more YAML files to JSON"
12
+
13
+ usage "kojo tojson INPUT... [(--save | --replace)]"
14
+ usage "kojo tojson (-h|--help)"
15
+
16
+ option "-s --save", "Save each input file in the same directory"
17
+ option "-r --replace", "Save each input file in the same directory and delete the input file"
18
+
19
+ param "INPUT", "Path to a YAML file or multiple files using a glob pattern"
20
+
21
+ example "kojo tojson myfile.yaml"
22
+ example "kojo tojson myfile.yaml --save"
23
+ example "kojo tojson indir/*.yaml"
24
+ example "kojo tojson indir/*.yaml --replace"
25
+ example "kojo tojson indir/**/*.yml"
26
+
27
+ def run
28
+ @input = get_input_files
29
+ @save_files = args['--save'] || args['--replace']
30
+ @replace_files = args['--replace']
31
+
32
+ save_files ? write : show
33
+ end
34
+
35
+ private
36
+
37
+ def tojson(path)
38
+ JSON.pretty_generate YAML.load_file(path)
39
+ end
40
+
41
+ # Glob patterns are usually handled by the shell, but in case
42
+ # we still have '*' in our string (for example, if it was sent
43
+ # quoted), we will do the globbing ourselves
44
+ def get_input_files
45
+ args['INPUT'].map do |path|
46
+ path.include?('*') ? Dir[path].sort : path
47
+ end.flatten
48
+ end
49
+
50
+ def show
51
+ input.each do |infile|
52
+ outfile = infile.gsub(/\.ya?ml/, '.json')
53
+ say "\n!txtgrn!# #{outfile}"
54
+ say tojson(infile)
55
+ end
56
+ end
57
+
58
+ def write
59
+ input.each do |infile|
60
+ outfile = infile.gsub(/\.ya?ml/, '.json')
61
+ save outfile, tojson(infile)
62
+ File.delete infile if replace_files
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,5 +1,3 @@
1
- require 'yaml'
2
-
3
1
  module Kojo
4
2
  # The Config class handles multiple template generation from a
5
3
  # definitions YAML file.
@@ -14,7 +12,7 @@ module Kojo
14
12
  @import_base = nil
15
13
  end
16
14
 
17
- def generate(opts={}, &block)
15
+ def generate(opts = {}, &block)
18
16
  if directory_mode?
19
17
  generate_from_dir opts, &block
20
18
  else
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  class File
2
4
  def self.deep_write(path, content)
3
5
  FileUtils.mkdir_p File.dirname(path)
@@ -0,0 +1,60 @@
1
+ require 'erbx'
2
+ require 'tty-prompt'
3
+
4
+ module Kojo
5
+ # The Form class handles interactive ERBX templates
6
+ class Form
7
+ attr_reader :file
8
+
9
+ def initialize(file)
10
+ @file = file
11
+ end
12
+
13
+ def content
14
+ @content ||= content!
15
+ end
16
+
17
+ def content!
18
+ content = File.read file
19
+ ruby_code = File.exist?("#{file}.rb") ? File.read("#{file}.rb") : nil
20
+ content = "<%-\n#{ruby_code}\n-%>\n#{content}" if ruby_code
21
+ content
22
+ end
23
+
24
+ def render
25
+ ERBX.new(content).result(binding)
26
+ rescue TTY::Reader::InputInterrupt
27
+ # :nocov:
28
+ raise Kojo::Interrupt
29
+ # :nocov:
30
+ end
31
+
32
+ def prompt
33
+ @prompt ||= TTY::Prompt.new
34
+ end
35
+
36
+ def method_missing(method_name, *args, **kargs, &block)
37
+ if respond_to? method_name
38
+ prompt.send method_name, *args, **kargs, &block
39
+ else
40
+ super
41
+ end
42
+ end
43
+
44
+ def respond_to?(method_name, include_private = false)
45
+ prompt.respond_to?(method_name) || super
46
+ end
47
+
48
+ # Below are TTY::Prompt functions that are not captured by the
49
+ # `mthod_missing`, so we specify them explicitly
50
+
51
+ def select(*args, &block)
52
+ prompt.select *args, &block
53
+ end
54
+
55
+ def warn(*args, &block)
56
+ prompt.warn *args, &block
57
+ end
58
+
59
+ end
60
+ end
@@ -1,5 +1,3 @@
1
- require 'yaml'
2
-
3
1
  module Kojo
4
2
  # The FrontMatterTemplate class handles a single template file, that
5
3
  # contains a YAML front matter.
@@ -12,7 +10,7 @@ module Kojo
12
10
  @file = file
13
11
  end
14
12
 
15
- def render(additional_args=nil)
13
+ def render(additional_args = nil)
16
14
  additional_args ||= {}
17
15
  config, @template = read_file file
18
16
 
@@ -24,7 +22,7 @@ module Kojo
24
22
 
25
23
  private
26
24
 
27
- def handle(args={})
25
+ def handle(args = {})
28
26
  content = template
29
27
  content = content.eval_erb args, file
30
28
  content = content.eval_vars args, file
@@ -5,7 +5,7 @@ module Kojo
5
5
  refine Array do
6
6
  # Convert an array of +["key=value", "key=value"]+ pairs to a hash
7
7
  def args_to_hash
8
- collect { |a| k, v = a.split '=' }
8
+ collect { |a| a.split '=' }
9
9
  .to_h
10
10
  .symbolize_keys
11
11
  .typecast_values
@@ -1,6 +1,5 @@
1
1
  require 'erb'
2
2
  require 'ostruct'
3
- require 'kojo/refinements/hash'
4
3
 
5
4
  module Kojo
6
5
  module Refinements
@@ -16,7 +16,7 @@ module Kojo
16
16
  @import_base = dir
17
17
  end
18
18
 
19
- def render(args={})
19
+ def render(args = {})
20
20
  @args = args
21
21
  evaluate file
22
22
  end
@@ -1,3 +1,3 @@
1
1
  module Kojo
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.8"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kojo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-05 00:00:00.000000000 Z
11
+ date: 2020-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mister_bin
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-prompt
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.21'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.21'
69
+ - !ruby/object:Gem::Dependency
70
+ name: erbx
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.1.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.1.1
55
83
  description: Generate configuration files from templates, using variables and definition
56
84
  files.
57
85
  email: db@dannyben.com
@@ -69,10 +97,13 @@ files:
69
97
  - lib/kojo/commands/config.rb
70
98
  - lib/kojo/commands/dir.rb
71
99
  - lib/kojo/commands/file.rb
100
+ - lib/kojo/commands/form.rb
72
101
  - lib/kojo/commands/single.rb
102
+ - lib/kojo/commands/to_json.rb
73
103
  - lib/kojo/config.rb
74
104
  - lib/kojo/exceptions.rb
75
105
  - lib/kojo/extensions/file.rb
106
+ - lib/kojo/form.rb
76
107
  - lib/kojo/front_matter_template.rb
77
108
  - lib/kojo/refinements/array.rb
78
109
  - lib/kojo/refinements/hash.rb
@@ -98,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
129
  - !ruby/object:Gem::Version
99
130
  version: '0'
100
131
  requirements: []
101
- rubygems_version: 3.0.3
132
+ rubygems_version: 3.1.4
102
133
  signing_key:
103
134
  specification_version: 4
104
135
  summary: Configuration Ninja