kojo 0.3.0 → 0.3.1

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: 8eb56880a27b8b6afe976fcd2f4d7b3e46efe647f6892bb616b10cf6a56f592c
4
- data.tar.gz: be2b2b5e1a935abf7b049b7960a8d38c4694f0931fd54ae38ed0434e7ffbe58b
3
+ metadata.gz: b8608c2acf1ded769eac7140256f0cd9d7b172cc38c6ccf4c8b0cb5a3ef15fd7
4
+ data.tar.gz: 0b94e504f27c2504ce3801b94c81f6b8f94d583189d529ffe6c6f73a00b19216
5
5
  SHA512:
6
- metadata.gz: d55ba5416cc208750f98f7702fadf4a6e64634fc0a27123b8978b90e9892a7954d8f68efcebd32a5503fad75925ee71632cab9095b4538fe6bd03872efc60655
7
- data.tar.gz: 2e9933b0a385a19b39e0c63aa4fc3e76f6d1b80e29eb5c3f1f3973b2a5494311b94ce757140c408d859797172a8233d5f2186ea0bd4a4abec99d3411eaf9b3ba
6
+ metadata.gz: 9086487049e3ddd2a0f4e2ce912ca451a1b67c1812301a967893e9bd701b762598343d7aef04a2d0a90dbfddb46e2da7eabfec48400a5a96ab152033d1860d73
7
+ data.tar.gz: e9c040bd31fd36cca5ec7be5285a1098d42a26d216a4edb26bfb41dc9ea0b227f49e3ca435bd19c8427b89a313cf6fd1df631e332e519fb62924d968d95856c2
data/README.md CHANGED
@@ -8,7 +8,7 @@ Kojo Configuration Ninja
8
8
  [![Gem Version](https://badge.fury.io/rb/kojo.svg)](https://badge.fury.io/rb/kojo)
9
9
  [![Build Status](https://travis-ci.com/DannyBen/kojo.svg?branch=master)](https://travis-ci.com/DannyBen/kojo)
10
10
  [![Maintainability](https://api.codeclimate.com/v1/badges/f24566ad04b5054a2251/maintainability)](https://codeclimate.com/github/DannyBen/kojo/maintainability)
11
- [![Test Coverage](https://api.codeclimate.com/v1/badges/f24566ad04b5054a2251/test_coverage)](https://codeclimate.com/github/DannyBen/kojo/test_coverage)
11
+
12
12
 
13
13
  Kojo helps you generate configuration files from templates, using variables
14
14
  and definition files.
@@ -30,6 +30,7 @@ Table of Contents
30
30
  - [Transform One to Many using Front Matter](#transform-one-to-many-using-front-matter)
31
31
  - [Conditions and Loops with ERB](#conditions-and-loops-with-erb)
32
32
  - [Interactive Mode](#interactive-mode)
33
+ - [Using from Ruby Code](#using-from-ruby-code)
33
34
 
34
35
  ---
35
36
 
@@ -164,6 +165,9 @@ Your template that uses %{arg} goes here
164
165
  ...
165
166
  ```
166
167
 
168
+ Additional arguments provided to the command line, will also be transferred
169
+ to the template.
170
+
167
171
  ### Conditions and Loops with ERB
168
172
 
169
173
  ![kojo](images/features-erb.svg)
@@ -187,3 +191,63 @@ line or through a configuration file), it will prompt for a value.
187
191
 
188
192
  ![kojo](images/interactive-mode.gif)
189
193
 
194
+ You can enable or disable interactive mode by setting the environment
195
+ variable `KOJO_INTERACTIVE` to `yes` or `no`.
196
+
197
+ By default, interactivity is enabled when running the CLI, and disabled when
198
+ running from within Ruby code.
199
+
200
+ When running from within Ruby code, you can also use `Kojo.interactive = true`
201
+ and `Kojo.interactive?` to get the current state.
202
+
203
+
204
+ Using from Ruby Code
205
+ --------------------------------------------------
206
+
207
+ Although Kojo was primarily designed as a command line utility, you can also
208
+ use it as a library from your Ruby code.
209
+
210
+ These are the primary classes:
211
+
212
+ | Class | Description | CLI equivalent
213
+ |-----------------------------|----------------------------------------------|---------------
214
+ | `Kojo::Template` | generate from a single template | `kojo file`
215
+ | `Kojo::FrontMatterTemplate` | generate from a template with a front matter | `kojo single`
216
+ | `Kojo::Config` | generate from a config file | `kojo config`
217
+ | `Kojo::Collection` | generate from a directory | `kojo dir`
218
+
219
+ ### Examples
220
+
221
+ ```ruby
222
+ # Template
223
+ template = Kojo::Template.new 'examples/variables/main.yml'
224
+ result = template.render domain: 'example.com', scale: 2
225
+ puts result
226
+
227
+ # Collection
228
+ collection = Kojo::Collection.new 'examples/dir'
229
+ collection.import_base = 'examples/dir/imports'
230
+
231
+ params = { env: 'env', app: 'app' }
232
+ result = collection.render params do |path, content|
233
+ # code to handle results here
234
+ end
235
+
236
+ # Config
237
+ config = Kojo::Config.new 'examples/config-from-file/config.yml'
238
+ config.import_base = "examples/config-from-file/imports"
239
+
240
+ config.generate do |path, content|
241
+ # code to handle results here
242
+ end
243
+
244
+ # FrontMatterTemplate
245
+ template = Kojo::FrontMatterTemplate.new 'examples/single/Dockerfile'
246
+ params = { version: '0.1.1' }
247
+
248
+ result = template.render params do |path, content|
249
+ # code to handle results here
250
+ end
251
+
252
+ ```
253
+
data/bin/kojo CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'kojo'
3
+ require 'kojo/cli'
3
4
  require 'colsole'
4
5
  include Colsole
5
6
 
data/lib/kojo.rb CHANGED
@@ -1,12 +1,24 @@
1
1
  require 'requires'
2
2
  require 'byebug' if ENV['BYEBUG']
3
3
 
4
- requires 'kojo/exceptions'
5
- requires 'kojo/template'
6
- requires 'kojo/commands/command_base'
7
- requires 'kojo'
4
+ requires 'kojo/refinements'
5
+
6
+ require 'kojo/exceptions'
7
+ require 'kojo/template'
8
+ require 'kojo/collection'
9
+ require 'kojo/config'
10
+ require 'kojo/front_matter_template'
8
11
 
9
12
  module Kojo
10
- module Commands
13
+ class << self
14
+ def interactive?
15
+ return @interactive unless @interactive.nil?
16
+ @interactive = ENV['KOJO_INTERACTIVE'] == 'yes'
17
+ end
18
+
19
+ def interactive=(value)
20
+ @interactive = value
21
+ end
11
22
  end
23
+
12
24
  end
data/lib/kojo/cli.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  require 'mister_bin'
2
+ require 'kojo/version'
3
+ requires 'commands'
2
4
 
3
5
  module Kojo
4
6
  # The CLI class is used by the kojo binary and forwards incoming CLI
5
7
  # commands to the relevant Kojo::Commands class
6
8
  class CLI
7
9
  def self.runner
10
+ Kojo.interactive = ENV['KOJO_INTERACTIVE'] != 'no'
11
+
8
12
  runner = MisterBin::Runner.new version: Kojo::VERSION
9
13
 
10
14
  runner.route 'file', to: Kojo::Commands::FileCmd
@@ -2,6 +2,8 @@ module Kojo
2
2
  # The Collection class is a wrapper around the {Template} object. It
3
3
  # provides a mechanism for processing an entire directory of templates.
4
4
  class Collection
5
+ using Refinements
6
+
5
7
  attr_reader :dir
6
8
  attr_accessor :import_base
7
9
 
@@ -1,13 +1,15 @@
1
1
  require 'mister_bin'
2
2
 
3
- module Kojo::Commands
4
- class CommandBase < MisterBin::Command
5
- def save(file, output)
6
- outpath = "#{outdir}/#{file}"
7
- dir = File.dirname outpath
8
- FileUtils.mkdir_p dir unless Dir.exist? dir
9
- File.write outpath, output
10
- say "Saved #{outpath}"
3
+ module Kojo
4
+ module Commands
5
+ class CommandBase < MisterBin::Command
6
+ def save(file, output)
7
+ outpath = "#{outdir}/#{file}"
8
+ dir = File.dirname outpath
9
+ FileUtils.mkdir_p dir unless Dir.exist? dir
10
+ File.write outpath, output
11
+ say "Saved #{outpath}"
12
+ end
11
13
  end
12
14
  end
13
- end
15
+ end
@@ -4,6 +4,8 @@ require 'mister_bin'
4
4
  module Kojo::Commands
5
5
  # Handle calls to the +kojo config+ command
6
6
  class ConfigCmd < MisterBin::Command
7
+ using Kojo::Refinements
8
+
7
9
  attr_reader :gen, :outdir, :opts, :import_base, :config_file
8
10
 
9
11
  help "Transform based on instructions from a config file"
@@ -41,7 +43,7 @@ module Kojo::Commands
41
43
  private
42
44
 
43
45
  def run!
44
- config = Kojo::Config.new config_file
46
+ config = Config.new config_file
45
47
  config.import_base = import_base if import_base
46
48
 
47
49
  config.generate opts do |file, output|
@@ -1,66 +1,70 @@
1
1
  require 'mister_bin'
2
2
 
3
- module Kojo::Commands
4
- # Handle calls to the +kojo dir+ command
5
- class DirCmd < CommandBase
6
- attr_reader :opts, :indir, :outdir, :import_base
3
+ module Kojo
4
+ module Commands
5
+ # Handle calls to the +kojo dir+ command
6
+ class DirCmd < CommandBase
7
+ using Kojo::Refinements
7
8
 
8
- help "Transform a folder of templates to a similar output folder"
9
+ attr_reader :opts, :indir, :outdir, :import_base
9
10
 
10
- usage "kojo dir INDIR [--save DIR --imports DIR --args FILE] [ARGS...]"
11
- usage "kojo dir (-h|--help)"
11
+ help "Transform a folder of templates to a similar output folder"
12
12
 
13
- option "-s --save DIR", "Save output to directory instead of printing"
14
- option "-i --imports DIR", "Specify base directory for @import directives"
15
- option "-a --args FILE", "Load arguments from YAML file"
13
+ usage "kojo dir INDIR [--save DIR --imports DIR --args FILE] [ARGS...]"
14
+ usage "kojo dir (-h|--help)"
16
15
 
17
- param "INDIR", "Directory containing templates to transform"
18
- param "ARGS", "Optional key=value pairs"
16
+ option "-s --save DIR", "Save output to directory instead of printing"
17
+ option "-i --imports DIR", "Specify base directory for @import directives"
18
+ option "-a --args FILE", "Load arguments from YAML file"
19
19
 
20
- example "kojo dir indir"
21
- example "kojo dir in --save out env=production"
22
- example "kojo dir in --save out --imports snippets env=production"
23
- example "kojo dir in -s out -i snippets -a args.yml"
20
+ param "INDIR", "Directory containing templates to transform"
21
+ param "ARGS", "Optional key=value pairs"
24
22
 
25
- def run
26
- @opts = args['ARGS'].args_to_hash
27
- @indir = args['INDIR']
28
- @outdir = args['--save']
29
- @import_base = args['--imports']
30
- argfile = args['--args']
23
+ example "kojo dir indir"
24
+ example "kojo dir in --save out env=production"
25
+ example "kojo dir in --save out --imports snippets env=production"
26
+ example "kojo dir in -s out -i snippets -a args.yml"
31
27
 
32
- if argfile
33
- fileopts = YAML.load_file(argfile).symbolize_keys
34
- @opts = fileopts.merge @opts
35
- end
28
+ def run
29
+ @opts = args['ARGS'].args_to_hash
30
+ @indir = args['INDIR']
31
+ @outdir = args['--save']
32
+ @import_base = args['--imports']
33
+ argfile = args['--args']
36
34
 
37
- run!
38
- end
35
+ if argfile
36
+ fileopts = YAML.load_file(argfile).symbolize_keys
37
+ @opts = fileopts.merge @opts
38
+ end
39
+
40
+ run!
41
+ end
39
42
 
40
- private
43
+ private
41
44
 
42
- def run!
43
- collection = Kojo::Collection.new @indir
44
- collection.import_base = import_base if import_base
45
+ def run!
46
+ collection = Collection.new @indir
47
+ collection.import_base = import_base if import_base
45
48
 
46
- if outdir
47
- write collection
48
- else
49
- show collection
49
+ if outdir
50
+ write collection
51
+ else
52
+ show collection
53
+ end
50
54
  end
51
- end
52
55
 
53
- def show(collection)
54
- collection.render @opts do |file, output|
55
- say "\n!txtgrn!# #{file}"
56
- say output
56
+ def show(collection)
57
+ collection.render @opts do |file, output|
58
+ say "\n!txtgrn!# #{file}"
59
+ say output
60
+ end
57
61
  end
58
- end
59
62
 
60
- def write(collection)
61
- collection.render @opts do |file, output|
62
- save file, output
63
+ def write(collection)
64
+ collection.render @opts do |file, output|
65
+ save file, output
66
+ end
63
67
  end
64
68
  end
65
69
  end
66
- end
70
+ end
@@ -1,56 +1,60 @@
1
1
  require 'mister_bin'
2
2
 
3
- module Kojo::Commands
4
- # Handle calls to the +kojo file+ command
5
- class FileCmd < MisterBin::Command
6
- attr_reader :opts, :outfile, :infile, :import_base
7
-
8
- help "Transform a file from a template"
9
-
10
- usage "kojo file INFILE [--save FILE --imports DIR --args FILE] [ARGS...]"
11
- usage "kojo file (-h|--help)"
12
-
13
- option "-s --save FILE", "Save to file instead of printing"
14
- option "-i --imports DIR", "Specify base directory for @import directives"
15
- option "-a --args FILE", "Load arguments from YAML file"
16
-
17
- param "INFILE", "Template to transform"
18
- param "ARGS", "Optional key=value pairs"
19
-
20
- example "kojo file main.yml"
21
- example "kojo file main.yml --save out.yml"
22
- example "kojo file main.yml -s out.yml app=lause"
23
- example "kojo file main.yml -s out.yml --args args.yml"
24
-
25
- def run
26
- @opts = args['ARGS'].args_to_hash
27
- @outfile = args['--save']
28
- @infile = args['INFILE']
29
- @import_base = args['--imports']
30
- argfile = args['--args']
31
-
32
- if argfile
33
- fileopts = YAML.load_file(argfile).symbolize_keys
34
- @opts = fileopts.merge opts
35
- end
3
+ module Kojo
4
+ module Commands
5
+ # Handle calls to the +kojo file+ command
6
+ class FileCmd < MisterBin::Command
7
+ using Kojo::Refinements
36
8
 
37
- run!
38
- end
9
+ attr_reader :opts, :outfile, :infile, :import_base
10
+
11
+ help "Transform a file from a template"
12
+
13
+ usage "kojo file INFILE [--save FILE --imports DIR --args FILE] [ARGS...]"
14
+ usage "kojo file (-h|--help)"
15
+
16
+ option "-s --save FILE", "Save to file instead of printing"
17
+ option "-i --imports DIR", "Specify base directory for @import directives"
18
+ option "-a --args FILE", "Load arguments from YAML file"
19
+
20
+ param "INFILE", "Template to transform"
21
+ param "ARGS", "Optional key=value pairs"
22
+
23
+ example "kojo file main.yml"
24
+ example "kojo file main.yml --save out.yml"
25
+ example "kojo file main.yml -s out.yml app=lause"
26
+ example "kojo file main.yml -s out.yml --args args.yml"
39
27
 
40
- private
28
+ def run
29
+ @opts = args['ARGS'].args_to_hash
30
+ @outfile = args['--save']
31
+ @infile = args['INFILE']
32
+ @import_base = args['--imports']
33
+ argfile = args['--args']
41
34
 
42
- def run!
43
- template = Kojo::Template.new infile
44
- template.import_base = import_base if import_base
45
- output = template.render(opts)
35
+ if argfile
36
+ fileopts = YAML.load_file(argfile).symbolize_keys
37
+ @opts = fileopts.merge opts
38
+ end
46
39
 
47
- if outfile
48
- File.write outfile, output
49
- say "Saved #{outfile}"
50
- else
51
- puts output
40
+ run!
52
41
  end
53
- end
54
42
 
43
+ private
44
+
45
+ def run!
46
+ template = Template.new infile
47
+ template.import_base = import_base if import_base
48
+ output = template.render(opts)
49
+
50
+ if outfile
51
+ File.write outfile, output
52
+ say "Saved #{outfile}"
53
+ else
54
+ puts output
55
+ end
56
+ end
57
+
58
+ end
55
59
  end
56
- end
60
+ end
@@ -1,50 +1,54 @@
1
1
  require 'mister_bin'
2
2
 
3
- module Kojo::Commands
4
- # Handle calls to the +kojo single+ command
5
- class SingleCmd < CommandBase
6
- attr_reader :opts, :infile, :outdir
3
+ module Kojo
4
+ module Commands
5
+ # Handle calls to the +kojo single+ command
6
+ class SingleCmd < CommandBase
7
+ using Kojo::Refinements
7
8
 
8
- help "Transform using a single file that contains the instructions"
9
+ attr_reader :opts, :infile, :outdir
9
10
 
10
- usage "kojo single INFILE [--save DIR] [ARGS...]"
11
- usage "kojo single (-h|--help)"
11
+ help "Transform using a single file that contains the instructions"
12
12
 
13
- option "-s --save DIR", "Save output to directory instead of printing"
13
+ usage "kojo single INFILE [--save DIR] [ARGS...]"
14
+ usage "kojo single (-h|--help)"
14
15
 
15
- param "INFILE", "Template to transform. The template should contain a YAML front matter with transformation instructions"
16
- param "ARGS", "Optional key=value pairs"
16
+ option "-s --save DIR", "Save output to directory instead of printing"
17
17
 
18
- example "kojo single Dockerfile"
19
- example "kojo single template.Dockerfile --save ."
20
- example "kojo single template.Dockerfile --save output"
21
- example "kojo single template.Dockerfile scale=2"
18
+ param "INFILE", "Template to transform. The template should contain a YAML front matter with transformation instructions"
19
+ param "ARGS", "Optional key=value pairs"
22
20
 
23
- def run
24
- @opts = args['ARGS'].args_to_hash
25
- @outdir = args['--save']
26
- @infile = args['INFILE']
27
- run!
28
- end
21
+ example "kojo single Dockerfile"
22
+ example "kojo single template.Dockerfile --save ."
23
+ example "kojo single template.Dockerfile --save output"
24
+ example "kojo single template.Dockerfile scale=2"
29
25
 
30
- private
26
+ def run
27
+ @opts = args['ARGS'].args_to_hash
28
+ @outdir = args['--save']
29
+ @infile = args['INFILE']
30
+ run!
31
+ end
31
32
 
32
- def run!
33
- template = Kojo::FrontMatterTemplate.new infile
34
- outdir ? write(template) : show(template)
35
- end
33
+ private
36
34
 
37
- def show(template)
38
- template.render opts do |file, output|
39
- say "\n!txtgrn!# #{file}"
40
- say output
35
+ def run!
36
+ template = FrontMatterTemplate.new infile
37
+ outdir ? write(template) : show(template)
38
+ end
39
+
40
+ def show(template)
41
+ template.render opts do |file, output|
42
+ say "\n!txtgrn!# #{file}"
43
+ say output
44
+ end
41
45
  end
42
- end
43
46
 
44
- def write(template)
45
- template.render opts do |file, output|
46
- save file, output
47
+ def write(template)
48
+ template.render opts do |file, output|
49
+ save file, output
50
+ end
47
51
  end
48
52
  end
49
53
  end
50
- end
54
+ end
data/lib/kojo/config.rb CHANGED
@@ -4,6 +4,8 @@ module Kojo
4
4
  # The Config class handles multiple template generation from a
5
5
  # definitions YAML file.
6
6
  class Config
7
+ using Refinements
8
+
7
9
  attr_reader :config_file, :outdir
8
10
  attr_accessor :import_base
9
11
 
@@ -4,6 +4,8 @@ module Kojo
4
4
  # The FrontMatterTemplate class handles a single template file, that
5
5
  # contains a YAML front matter.
6
6
  class FrontMatterTemplate
7
+ using Refinements
8
+
7
9
  attr_reader :file, :args, :template
8
10
 
9
11
  def initialize(file)
@@ -0,0 +1,15 @@
1
+ require 'kojo/refinements/hash'
2
+
3
+ module Kojo
4
+ module Refinements
5
+ refine Array do
6
+ # Convert an array of +["key=value", "key=value"]+ pairs to a hash
7
+ def args_to_hash
8
+ collect { |a| k, v = a.split '=' }
9
+ .to_h
10
+ .symbolize_keys
11
+ .typecast_values
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'kojo/refinements/string'
2
+
3
+ module Kojo
4
+ module Refinements
5
+ refine Hash do
6
+ def symbolize_keys
7
+ transform_keys &:to_sym
8
+ end
9
+
10
+ def typecast_values
11
+ transform_values &:to_typed
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,66 @@
1
+ require 'erb'
2
+ require 'ostruct'
3
+ require 'kojo/refinements/hash'
4
+
5
+ module Kojo
6
+ module Refinements
7
+ refine String do
8
+ # Convert a string to the most appropriate type
9
+ def to_typed
10
+ if self =~ /\A[+-]?\d+\Z/
11
+ self.to_i
12
+
13
+ elsif self =~ /\A[+-]?\d+\.\d+\Z/
14
+ self.to_f
15
+
16
+ elsif %w[yes no true false].include? downcase
17
+ %w[yes true].include? downcase
18
+
19
+ else
20
+ self
21
+
22
+ end
23
+ end
24
+
25
+ def resolve(vars)
26
+ self % vars.symbolize_keys
27
+
28
+ rescue KeyError => e
29
+ raise unless Kojo.interactive?
30
+
31
+ print "> #{e.key}: "
32
+ vars[e.key] = get_user_input
33
+ retry
34
+ end
35
+
36
+ def eval_vars(args, filename)
37
+ resolve args.symbolize_keys
38
+ rescue ArgumentError => e
39
+ raise Kojo::TemplateError, "#{e.message}\nin: #{filename}"
40
+ end
41
+
42
+ def eval_erb(args, filename)
43
+ erb self, args
44
+ rescue RuntimeError => e
45
+ raise Kojo::TemplateError, "Invalid Ruby code #{e.message}\nin: #{filename}"
46
+ rescue SyntaxError => e
47
+ raise Kojo::TemplateError, "#{e.message}\nin: #{filename}"
48
+ end
49
+
50
+ private
51
+
52
+ def get_user_input
53
+ response = $stdin.gets
54
+ raise Kojo::Interrupt unless response # Ctrl+D
55
+ response.chomp
56
+ rescue ::Interrupt # Ctrl+C
57
+ raise Kojo::Interrupt
58
+ end
59
+
60
+ def erb(template, vars)
61
+ ERB.new(template, nil, '-').result(OpenStruct.new(vars).instance_eval { binding })
62
+ end
63
+
64
+ end
65
+ end
66
+ end
data/lib/kojo/template.rb CHANGED
@@ -4,6 +4,8 @@ module Kojo
4
4
  # - ERB
5
5
  # - +@import+ statements
6
6
  class Template
7
+ using Refinements
8
+
7
9
  attr_reader :file, :extension, :dir, :args
8
10
  attr_accessor :import_base
9
11
 
data/lib/kojo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kojo
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
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.0
4
+ version: 0.3.1
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: 2019-01-19 00:00:00.000000000 Z
11
+ date: 2020-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mister_bin
@@ -72,10 +72,10 @@ files:
72
72
  - lib/kojo/commands/single.rb
73
73
  - lib/kojo/config.rb
74
74
  - lib/kojo/exceptions.rb
75
- - lib/kojo/extensions/array.rb
76
- - lib/kojo/extensions/hash.rb
77
- - lib/kojo/extensions/string.rb
78
75
  - lib/kojo/front_matter_template.rb
76
+ - lib/kojo/refinements/array.rb
77
+ - lib/kojo/refinements/hash.rb
78
+ - lib/kojo/refinements/string.rb
79
79
  - lib/kojo/template.rb
80
80
  - lib/kojo/version.rb
81
81
  homepage: https://github.com/dannyben/kojo
@@ -97,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  - !ruby/object:Gem::Version
98
98
  version: '0'
99
99
  requirements: []
100
- rubyforge_project:
101
- rubygems_version: 2.7.8
100
+ rubygems_version: 3.0.3
102
101
  signing_key:
103
102
  specification_version: 4
104
103
  summary: Configuration Ninja
@@ -1,11 +0,0 @@
1
- require 'kojo/extensions/hash'
2
-
3
- class Array
4
- # Convert an array of +["key=value", "key=value"]+ pairs to a hash
5
- def args_to_hash
6
- collect { |a| k, v = a.split '=' }
7
- .to_h
8
- .symbolize_keys
9
- .typecast_values
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- require 'kojo/extensions/string'
2
-
3
- class Hash
4
- def symbolize_keys
5
- transform_keys &:to_sym
6
- end
7
-
8
- def typecast_values
9
- transform_values &:to_typed
10
- end
11
- end
@@ -1,59 +0,0 @@
1
- require 'erb'
2
- require 'ostruct'
3
-
4
- class String
5
- # Convert a string to the most appropriate type
6
- def to_typed
7
- if self =~ /\A[+-]?\d+\Z/
8
- self.to_i
9
-
10
- elsif self =~ /\A[+-]?\d+\.\d+\Z/
11
- self.to_f
12
-
13
- elsif %w[yes no true false].include? downcase
14
- %w[yes true].include? downcase
15
-
16
- else
17
- self
18
-
19
- end
20
- end
21
-
22
- def resolve(vars)
23
- self % vars.symbolize_keys
24
-
25
- rescue KeyError => e
26
- print "> #{e.key}: "
27
- vars[e.key] = get_user_input
28
- retry
29
- end
30
-
31
- def eval_vars(args, filename)
32
- resolve args.symbolize_keys
33
- rescue ArgumentError => e
34
- raise Kojo::TemplateError, "#{e.message}\nin: #{filename}"
35
- end
36
-
37
- def eval_erb(args, filename)
38
- erb self, args
39
- rescue RuntimeError => e
40
- raise Kojo::TemplateError, "Invalid Ruby code #{e.message}\nin: #{filename}"
41
- rescue SyntaxError => e
42
- raise Kojo::TemplateError, "#{e.message}\nin: #{filename}"
43
- end
44
-
45
- private
46
-
47
- def get_user_input
48
- response = $stdin.gets
49
- raise Kojo::Interrupt unless response # Ctrl+D
50
- response.chomp
51
- rescue Interrupt # Ctrl+C
52
- raise Kojo::Interrupt
53
- end
54
-
55
- def erb(template, vars)
56
- ERB.new(template, nil, '-').result(OpenStruct.new(vars).instance_eval { binding })
57
- end
58
-
59
- end