kojo 0.3.5 → 0.3.6

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: 25c101bd252d7f7193d4d7eddad538945e7d0baaec2e3ee979c68f02616e661f
4
- data.tar.gz: 6183debd6556f157f5995f408e61d7634b6474263d54094fce7d9f6a3b440106
3
+ metadata.gz: 39cdf289cbe0c64d4344cbe494922c1b377f940da377b74367227de926679c62
4
+ data.tar.gz: 062efc5aaa4e6bae3dbc3bc9adefd3e8b8a2f6b76e088a8b6ca5ba4c536a131e
5
5
  SHA512:
6
- metadata.gz: 7c914b9e6cb19e274e23b8dd59b37b06315a8790949cd0f91c09967275381a5dd1305892ed5afdc9d0d51868db284567fe8e6504f0675b6ab7162beb3fec9fc0
7
- data.tar.gz: bdb59bc7cf7cd74fedbf791fc4fb297f72e7a9f7bc2b6285f6853ac0d21eed5e32378873ab21935e280e6df2cabaf4993f5f6ccb4d0a8a9f102260012d99346d
6
+ metadata.gz: 2c88d0578808aff72c649bdcfc9a0919fcfd29179793d08ae617d10f44b61d82df8dff86d2745defe6b079ebce958210158d89aa4d62a27ff495e42c7ef2c834
7
+ data.tar.gz: 39392b24f84d4e62df6e2b4278b2363e41eb61fb453a651b15ecbc23af96a72e78feef478b628e184ffc3068374db5ed64917a1c47f2560b784e9404dda72b0c
data/README.md CHANGED
@@ -2,8 +2,7 @@
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
8
  [![Build Status](https://github.com/DannyBen/kojo/workflows/Test/badge.svg)](https://github.com/DannyBen/kojo/actions?query=workflow%3ATest)
@@ -18,8 +17,7 @@ It is a command line utility, and it works on any text file format.
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
 
@@ -249,6 +255,10 @@ params = { version: '0.1.1' }
249
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
data/lib/kojo.rb CHANGED
@@ -9,6 +9,7 @@ require 'kojo/template'
9
9
  require 'kojo/collection'
10
10
  require 'kojo/config'
11
11
  require 'kojo/front_matter_template'
12
+ require 'kojo/form'
12
13
 
13
14
  module Kojo
14
15
  class << self
data/lib/kojo/cli.rb CHANGED
@@ -15,6 +15,7 @@ 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
18
19
 
19
20
  runner
20
21
  end
@@ -0,0 +1,36 @@
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
+ File.deep_write outfile, template.render
28
+ say "Saved #{outfile}"
29
+ else
30
+ puts template.render
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
data/lib/kojo/form.rb ADDED
@@ -0,0 +1,61 @@
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, &block)
37
+ if respond_to? method_name
38
+ prompt.send method_name, *args, *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
+
60
+ end
61
+ end
data/lib/kojo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Kojo
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.6"
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.5
4
+ version: 0.3.6
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-02-13 00:00:00.000000000 Z
11
+ date: 2020-04-24 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,12 @@ 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
73
102
  - lib/kojo/config.rb
74
103
  - lib/kojo/exceptions.rb
75
104
  - lib/kojo/extensions/file.rb
105
+ - lib/kojo/form.rb
76
106
  - lib/kojo/front_matter_template.rb
77
107
  - lib/kojo/refinements/array.rb
78
108
  - lib/kojo/refinements/hash.rb