cl 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/NOTES.md +4 -0
  5. data/README.md +131 -74
  6. data/examples/README.md +22 -0
  7. data/examples/{src → _src}/args/cast.erb.rb +0 -0
  8. data/examples/{src → _src}/args/opts.erb.rb +0 -0
  9. data/examples/{src → _src}/args/required.erb.rb +0 -0
  10. data/examples/{src → _src}/args/splat.erb.rb +0 -0
  11. data/examples/{src → _src}/gem.erb.rb +0 -0
  12. data/examples/{src → _src}/heroku.erb.rb +0 -0
  13. data/examples/{src → _src}/rakeish.erb.rb +0 -0
  14. data/examples/{src → _src}/readme/abstract.erb.rb +0 -0
  15. data/examples/{src → _src}/readme/alias.erb.rb +0 -0
  16. data/examples/{src → _src}/readme/arg.erb.rb +0 -0
  17. data/examples/{src → _src}/readme/arg_array.erb.rb +0 -0
  18. data/examples/{src → _src}/readme/arg_type.erb.rb +0 -0
  19. data/examples/{src → _src}/readme/args_splat.erb.rb +0 -0
  20. data/examples/{src → _src}/readme/array.erb.rb +0 -0
  21. data/examples/_src/readme/basic.erb.rb +70 -0
  22. data/examples/{src → _src}/readme/default.erb.rb +0 -0
  23. data/examples/{src → _src}/readme/deprecated.erb.rb +0 -0
  24. data/examples/{src → _src}/readme/deprecated_alias.erb.rb +0 -0
  25. data/examples/_src/readme/description.erb.rb +58 -0
  26. data/examples/{src → _src}/readme/downcase.erb.rb +0 -0
  27. data/examples/{src → _src}/readme/enum.erb.rb +0 -0
  28. data/examples/{src → _src}/readme/example.erb.rb +0 -0
  29. data/examples/{src → _src}/readme/format.erb.rb +0 -0
  30. data/examples/{src → _src}/readme/internal.erb.rb +0 -0
  31. data/examples/{src → _src}/readme/negate.erb.rb +0 -0
  32. data/examples/{src/readme/node.erb.rb → _src/readme/note.erb.rb} +0 -0
  33. data/examples/{src → _src}/readme/opts.erb.rb +0 -0
  34. data/examples/{src → _src}/readme/opts_block.erb.rb +0 -0
  35. data/examples/{src → _src}/readme/range.erb.rb +0 -0
  36. data/examples/_src/readme/registry.erb.rb +16 -0
  37. data/examples/{src → _src}/readme/required.erb.rb +0 -0
  38. data/examples/{src → _src}/readme/requireds.erb.rb +0 -0
  39. data/examples/{src → _src}/readme/requires.erb.rb +0 -0
  40. data/examples/_src/readme/runner.erb.rb +27 -0
  41. data/examples/_src/readme/runner_custom.erb.rb +25 -0
  42. data/examples/{src → _src}/readme/secret.erb.rb +0 -0
  43. data/examples/{src → _src}/readme/see.erb.rb +0 -0
  44. data/examples/{src → _src}/readme/type.erb.rb +0 -0
  45. data/examples/readme/basic +65 -0
  46. data/examples/readme/description +54 -0
  47. data/examples/readme/note +6 -4
  48. data/examples/readme/registry +13 -0
  49. data/examples/readme/runner +28 -0
  50. data/examples/readme/runner_custom +22 -0
  51. data/lib/cl/args.rb +10 -18
  52. data/lib/cl/cast.rb +46 -24
  53. data/lib/cl/help/cmd.rb +3 -55
  54. data/lib/cl/help/format.rb +69 -0
  55. data/lib/cl/help/table.rb +5 -2
  56. data/lib/cl/opt.rb +4 -0
  57. data/lib/cl/opts/validate.rb +117 -0
  58. data/lib/cl/opts.rb +11 -101
  59. data/lib/cl/version.rb +1 -1
  60. metadata +49 -36
  61. data/examples/readme/node +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 8e6ef1ee5a1de5a6db0abe39ce38d2e2cce9acd93ea525b456fdb3a06b80022f
4
- data.tar.gz: 7fb5f6eaf119649982149be1ac54a367ed85188e63acfb85d4ed422e72620e3b
2
+ SHA1:
3
+ metadata.gz: d68ba1674ee398202a474abb83387fb296847aad
4
+ data.tar.gz: 3f410b5991158c25bc3ec7688fd9a86c56b7e11f
5
5
  SHA512:
6
- metadata.gz: d8e3e6454c83f588383b713af70cf43d69f7914349eabcb07586045e45aa2ee44cae7f7be7ad86438800213270791fdae8047e52f7ec971fa36217956a093cf7
7
- data.tar.gz: ebbdafe93266703989144983f919fa79325c5797c1cfe831a83b5a8e3c7a04d5042e7b2c3ab1ea5553319c105d1d916e6b8e2ab70ef711000be2e861d95fbd2d
6
+ metadata.gz: 26fac7251c6eead9ed449d3f5c1dfb61794eb1f6c7e008f069ac973afd912d84d93b75abaa84ca20f6f69d6642cc00694be28469b36ce8ce0a1f3d044ecb9c3d
7
+ data.tar.gz: 993d729a5b9fd4ae131d257601a93b57483ac6f6ba12e46409cffeda230e2a8573b1b9c22edc93392e6c7224de94f979962479fdb23d4b27df32796d84e2b685
data/CHANGELOG.md CHANGED
@@ -19,6 +19,7 @@
19
19
  * Add `opt '--one STR', format: /.+/`
20
20
  * Add `opt '--one STR', enum: ['one', /\w+/]`
21
21
  * Add `opt '--one STR', downcase: true`
22
+ * Add `opt '--one STR', upcase: true`
22
23
  * Add `opt '--one STR', internal: true`, hide internal options from help output
23
24
  * Add `opt '--one STR', example: 'foo'`
24
25
  * Add `opt '--one STR', negate: %w(skip)`
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cl (0.1.28)
4
+ cl (1.0.0)
5
5
  regstry (~> 1.0.3)
6
6
 
7
7
  GEM
data/NOTES.md CHANGED
@@ -13,3 +13,7 @@ x add yard docs
13
13
  - refactor Help::Cmd and Table so that everything goes into one big table
14
14
  - Ui classes really need to write error messages to stderr, not stdout
15
15
  - make sure option aliases define accessors and predicates (see examples/readme/alias)
16
+
17
+
18
+ - validate and normalize type
19
+ - validate that there can only be one arg splat
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Cl [![Build Status](https://travis-ci.org/svenfuchs/cl.svg?branch=master)](https://travis-ci.com/svenfuchs/cl) [![Code Climate](https://codeclimate.com/github/svenfuchs/cl.png)](https://codeclimate.com/github/svenfuchs/cl) [![Coverage Status](https://coveralls.io/repos/github/svenfuchs/cl/badge.svg?branch=master)](https://coveralls.io/github/svenfuchs/cl?branch=master) [![Rubydocs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/svenfuchs/cl) [![Gem Version](https://img.shields.io/gem/v/cl)](http://rubygems.org/gems/cl)
1
+ # Cl [![Build Status](https://travis-ci.org/svenfuchs/cl.svg?branch=master)](https://travis-ci.org/svenfuchs/cl) [![Code Climate](https://api.codeclimate.com/v1/badges/870e448eb8162d3e1ed7/maintainability)](https://codeclimate.com/github/svenfuchs/cl) [![Code Coverage](https://coveralls.io/repos/github/svenfuchs/cl/badge.svg?branch=master)](https://coveralls.io/github/svenfuchs/cl?branch=master) [![Gem Version](https://img.shields.io/gem/v/cl?cache=2019-08-10)](http://rubygems.org/gems/cl) [![Rubydocs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/svenfuchs/cl)
2
2
 
3
3
  OptionParser based CLI support for rapid CLI development in an object-oriented
4
4
  context.
@@ -12,6 +12,11 @@ after `gem --help`).
12
12
 
13
13
  Further documentation is available on [rubydoc.info](https://www.rubydoc.info/github/svenfuchs/cl)
14
14
 
15
+ Examples in this README are included from [examples/readme](https://github.com/svenfuchs/cl/tree/master/examples/readme).
16
+ More examples can be found in [examples](https://github.com/svenfuchs/cl/tree/master/examples).
17
+ All examples are guaranteed to be up to date by the way of being [verified](https://github.com/svenfuchs/cl/blob/master/.travis.yml#L14)
18
+ on CI.
19
+
15
20
  ## Table of Contents
16
21
 
17
22
  * [Basic Usage](#basic-usage)
@@ -46,7 +51,6 @@ Further documentation is available on [rubydoc.info](https://www.rubydoc.info/gi
46
51
  ## Basic Usage
47
52
 
48
53
  ```ruby
49
- # lib/cli/owners/add.rb
50
54
  module Owners
51
55
  class Add < Cl::Cmd
52
56
  summary 'Add one or more owners to an existing owner group'
@@ -58,48 +62,58 @@ module Owners
58
62
  [...]
59
63
  str
60
64
 
61
- args :owners
65
+ args :owner
62
66
 
63
67
  opt '-t', '--to TO', 'An existing owner group'
64
68
 
65
69
  def run
66
- # add owners as listed in `owners` to the group given in
67
- # `to`, as well as `opts[:to]`.
70
+ # implement adding the owner as given in `owner` (as well as `args`)
71
+ # to the group given in `to` (as well as `opts[:to]`).
72
+ p owner: owner, to: to, to?: to?, args: args, opts: opts
68
73
  end
69
74
  end
70
75
  end
71
76
 
72
- # bin/owners
73
- Cl.new('owners').run(ARGV)
74
- ```
75
-
76
- Running this, e.g. using `bin/owners add one,two --to group` will instantiate the
77
- class `Owners::Add`, and call the method `run` on it.
78
-
79
- Help output:
80
-
81
- ```txt
82
- Usage: owners add [owners] [options]
83
-
84
- Summary:
77
+ # Running this, e.g. using `bin/owners add one,two --to group` will instantiate the
78
+ # class `Owners::Add`, and call the method `run` on it.
85
79
 
86
- Add one or more owners to an existing owner group
87
-
88
- Description:
89
-
90
- Use this command to add one or more owners to an existing
91
- owner group.
80
+ # e.g. bin/owners
81
+ #
82
+ # args normally would be ARGV
83
+ args = %w(add one --to group)
92
84
 
93
- These will be visible in [...]
85
+ Cl.new('owners').run(args)
94
86
 
95
- Arguments:
87
+ # Output:
88
+ #
89
+ # {:owner=>"one", :to=>"group", :to?=>true, :args=>["one"], :opts=>{:to=>"group"}}
96
90
 
97
- owners type: string
91
+ Cl.new('owners').run(%w(add --help))
98
92
 
99
- Options:
93
+ # Output:
94
+ #
95
+ # Usage: owners add [owner] [options]
96
+ #
97
+ # Summary:
98
+ #
99
+ # Add one or more owners to an existing owner group
100
+ #
101
+ # Description:
102
+ #
103
+ # Use this command to add one or more owners to an existing
104
+ # owner group.
105
+ #
106
+ # [...]
107
+ #
108
+ # Arguments:
109
+ #
110
+ # owner type: string
111
+ #
112
+ # Options:
113
+ #
114
+ # -t --to TO An existing owner group (type: string)
115
+ # --help Get help on this command
100
116
 
101
- -t --to TO An existing owner group (type: string, required: true)
102
- --help Get help on this command (type: flag)
103
117
  ```
104
118
 
105
119
  ### Command Registry
@@ -112,20 +126,17 @@ to decouple looking up command classes from their Ruby namespace.
112
126
  For example:
113
127
 
114
128
  ```ruby
115
- module One
116
- class Cmd < Cl::Cmd
117
- register :one
129
+ module Cmd
130
+ class One < Cl::Cmd
118
131
  end
119
- end
120
132
 
121
- module Two
122
- class Cmd < Cl::Cmd
123
- register :two
133
+ class Two < Cl::Cmd
124
134
  end
125
135
  end
126
136
 
127
- Cl::Cmd[:one] # => One::Cmd
128
- Cl::Cmd[:two] # => Two::Cmd
137
+ p Cl::Cmd[:one] # => Cmd::One
138
+ p Cl::Cmd[:two] # => Cmd::Two
139
+
129
140
  ```
130
141
 
131
142
  Commands auto register themselves with the underscored name of the last part of
@@ -158,10 +169,10 @@ would recognize and run the following commands:
158
169
 
159
170
  ```
160
171
  $ bin/run one something else
161
- # instantiates One, passing the args array `["something", "else"]`, and calls `run`
172
+ # instantiates One, passing the args array `["something", "else"]`, and calls the instance method `run`
162
173
 
163
- $ bin/run two something else
164
- # instantiates One, passing an empty args arry `[]`, and calls `run`
174
+ $ bin/run two
175
+ # instantiates Two, passing an empty args arry `[]`, and calls the instance method `run`
165
176
  ```
166
177
 
167
178
  The default runner also supports nested namespaces, and checks for command classes
@@ -171,47 +182,61 @@ with keys separated by colons. For instance:
171
182
  module Git
172
183
  class Pull < Cl::Cmd
173
184
  register :'git:pull'
174
- end
175
- end
176
185
 
177
- module Git
178
- class Push < Cl::Cmd
179
- register :'git:push'
186
+ def run
187
+ p cmd: registry_key, args: args
188
+ end
180
189
  end
181
190
  end
182
- ```
183
191
 
184
- With these classes registered (and assuming the executable that calls `Cl` is
185
- `bin/git`) the default runner would recognize and run the following commands:
192
+ # With this class registered (and assuming the executable that calls `Cl` is
193
+ # `bin/run`) the default runner would recognize and run it:
194
+ #
195
+ # $ bin/run git:pull master # instantiates Git::Pull, and passes ["master"] as args
196
+ # $ bin/run git pull master # does the same
186
197
 
187
- ```
188
- $ bin/git pull:master # instantiates Git::Pull, and passes ["master"] as args
189
- $ bin/git pull master # does the same
198
+ Cl.new('run').run(%w(git:pull master))
199
+ # Output:
200
+ #
201
+ # {:cmd=>:"git:pull", :args=>["master"]}
202
+
203
+ Cl.new('run').run(%w(git pull master))
204
+ # Output:
205
+ #
206
+ # {:cmd=>:"git:pull", :args=>["master"]}
190
207
 
191
- $ bin/git push:master # instantiates Git::Push, and passes ["master"] as args
192
- $ bin/git push master # does the same
193
208
  ```
194
209
 
195
210
  Runners are registered on the module `Cl::Runner`. It is possible to register custom
196
211
  runners, and use them by passing the option `runner` to `Cl.new`:
197
212
 
198
- ```
199
- # in bin/run
200
- Cli.new('run', runner: :custom).run(ARGV)
201
-
202
- # anywhere in your library
203
- class Runner
204
- Cl::Runner.register :custom, self
205
-
206
- def initialize(ctx, args)
207
- # ...
208
- end
213
+ ```ruby
214
+ module Git
215
+ class Pull < Cl::Cmd
216
+ register :'git:pull'
209
217
 
210
- def run
211
- const = identify_cmd_class_from_args
212
- const.new(ctx, args).run
218
+ def run
219
+ p cmd: registry_key, args: args
220
+ end
213
221
  end
214
222
  end
223
+
224
+ # With this class registered (and assuming the executable that calls `Cl` is
225
+ # `bin/run`) the default runner would recognize and run it:
226
+ #
227
+ # $ bin/run git:pull master # instantiates Git::Pull, and passes ["master"] as args
228
+ # $ bin/run git pull master # does the same
229
+
230
+ Cl.new('run').run(%w(git:pull master))
231
+ # Output:
232
+ #
233
+ # {:cmd=>:"git:pull", :args=>["master"]}
234
+
235
+ Cl.new('run').run(%w(git pull master))
236
+ # Output:
237
+ #
238
+ # {:cmd=>:"git:pull", :args=>["master"]}
239
+
215
240
  ```
216
241
 
217
242
  See `Cl::Runner::Default` for more details.
@@ -237,7 +262,7 @@ Commands are classes that are derived from the base class `Cl::Cmd`.
237
262
 
238
263
  The description, summary, and examples are used in the help output.
239
264
 
240
- ```
265
+ ```ruby
241
266
  module Owners
242
267
  class Add < Cl::Cmd
243
268
  summary 'Add one or more owners to an existing owner group'
@@ -258,6 +283,36 @@ module Owners
258
283
  str
259
284
  end
260
285
  end
286
+
287
+ Cl.new('owners').run(%w(add --help))
288
+
289
+ # Output:
290
+ #
291
+ # Usage: owners add [options]
292
+ #
293
+ # Summary:
294
+ #
295
+ # Add one or more owners to an existing owner group
296
+ #
297
+ # Description:
298
+ #
299
+ # Use this command to add one or more owners to an existing
300
+ # owner group.
301
+ #
302
+ # Options:
303
+ #
304
+ # --help Get help on this command
305
+ #
306
+ # Examples:
307
+ #
308
+ # Adding a single user to the group admins:
309
+ #
310
+ # owners add user --to admins
311
+ #
312
+ # Adding a several users at once:
313
+ #
314
+ # owners add one two three --to admins
315
+
261
316
  ```
262
317
 
263
318
  #### Abstract
@@ -831,12 +886,14 @@ end
831
886
 
832
887
  Cl.new('owners').run(%w(add --help))
833
888
 
834
- # Usage: owners add [options]
889
+ # Output:
835
890
  #
836
- # Options:
891
+ # Usage: owners add [options]
837
892
  #
838
- # --to GROUP type: string, note: needs to be a group
839
- # --help Get help on this command
893
+ # Options:
894
+ #
895
+ # --to GROUP type: string, note: needs to be a group
896
+ # --help Get help on this command
840
897
 
841
898
  ```
842
899
 
@@ -0,0 +1,22 @@
1
+ # Cl Examples
2
+
3
+ This directory contains examples for using `cl`.
4
+
5
+ Examples are executable, so you can try them out and experiment with them. E.g.:
6
+
7
+ ```
8
+ git clone https://github.com/svenfuchs/cl.git /tmp/cl
9
+ cd /tmp/cl
10
+ examples/gem
11
+ ```
12
+
13
+ Examples are generated and verified by running:
14
+
15
+ ```
16
+ bundle exec bin/examples
17
+ ```
18
+
19
+ This command runs on [on Travis CI](https://github.com/svenfuchs/cl/blob/master/.travis.yml#L14)
20
+ in order to guarantee that all examples are up to date,
21
+ but also can be run in order to add or update examples.
22
+
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,70 @@
1
+ <%= run sq(<<-'rb')
2
+ require 'cl'
3
+
4
+ # e.g. lib/owners/add.rb
5
+ module Owners
6
+ class Add < Cl::Cmd
7
+ summary 'Add one or more owners to an existing owner group'
8
+
9
+ description <<~str
10
+ Use this command to add one or more owners to an existing
11
+ owner group.
12
+
13
+ [...]
14
+ str
15
+
16
+ args :owner
17
+
18
+ opt '-t', '--to TO', 'An existing owner group'
19
+
20
+ def run
21
+ # implement adding the owner as given in `owner` (as well as `args`)
22
+ # to the group given in `to` (as well as `opts[:to]`).
23
+ p owner: owner, to: to, to?: to?, args: args, opts: opts
24
+ end
25
+ end
26
+ end
27
+ rb
28
+ -%>
29
+
30
+ # Running this, e.g. using `bin/owners add one,two --to group` will instantiate the
31
+ # class `Owners::Add`, and call the method `run` on it.
32
+
33
+ <%= run sq(<<-'rb')
34
+ # e.g. bin/owners
35
+ #
36
+ # args normally would be ARGV
37
+ args = %w(add one --to group)
38
+
39
+ Cl.new('owners').run(args)
40
+ rb
41
+ -%>
42
+
43
+ <%= out '{:owner=>"one", :to=>"group", :to?=>true, :args=>["one"], :opts=>{:to=>"group"}}' %>
44
+
45
+ <%= run "Cl.new('owners').run(%w(add --help))" %>
46
+
47
+ <%= out sq(<<-'str')
48
+ Usage: owners add [owner] [options]
49
+
50
+ Summary:
51
+
52
+ Add one or more owners to an existing owner group
53
+
54
+ Description:
55
+
56
+ Use this command to add one or more owners to an existing
57
+ owner group.
58
+
59
+ [...]
60
+
61
+ Arguments:
62
+
63
+ owner type: string
64
+
65
+ Options:
66
+
67
+ -t --to TO An existing owner group (type: string)
68
+ --help Get help on this command
69
+ str
70
+ %>
File without changes
File without changes
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path('lib')
3
+
4
+ <%= run sq(<<-'rb')
5
+ require 'cl'
6
+
7
+ module Owners
8
+ class Add < Cl::Cmd
9
+ summary 'Add one or more owners to an existing owner group'
10
+
11
+ description <<~str
12
+ Use this command to add one or more owners to an existing
13
+ owner group.
14
+ str
15
+
16
+ examples <<~str
17
+ Adding a single user to the group admins:
18
+
19
+ owners add user --to admins
20
+
21
+ Adding a several users at once:
22
+
23
+ owners add one two three --to admins
24
+ str
25
+ end
26
+ end
27
+ rb
28
+ -%>
29
+
30
+ <%= run "Cl.new('owners').run(%w(add --help))" %>
31
+
32
+ <%= out sq(<<-'str')
33
+ Usage: owners add [options]
34
+
35
+ Summary:
36
+
37
+ Add one or more owners to an existing owner group
38
+
39
+ Description:
40
+
41
+ Use this command to add one or more owners to an existing
42
+ owner group.
43
+
44
+ Options:
45
+
46
+ --help Get help on this command
47
+
48
+ Examples:
49
+
50
+ Adding a single user to the group admins:
51
+
52
+ owners add user --to admins
53
+
54
+ Adding a several users at once:
55
+
56
+ owners add one two three --to admins
57
+ str
58
+ %>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path('lib')
3
+
4
+ <%= run sq(<<-'rb')
5
+ module Cmd
6
+ class One < Cl::Cmd
7
+ end
8
+
9
+ class Two < Cl::Cmd
10
+ end
11
+ end
12
+ rb
13
+ -%>
14
+
15
+ <%= run 'p Cl::Cmd[:one]' %> <%= out 'Cmd::One', short: true %>
16
+ <%= run 'p Cl::Cmd[:two]' %> <%= out 'Cmd::Two', short: true %>
File without changes
File without changes
File without changes
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.expand_path('lib')
3
+
4
+ <%= run sq(<<-'rb')
5
+ module Git
6
+ class Pull < Cl::Cmd
7
+ register :'git:pull'
8
+
9
+ def run
10
+ p cmd: registry_key, args: args
11
+ end
12
+ end
13
+ end
14
+ rb
15
+ -%>
16
+
17
+ # With this class registered (and assuming the executable that calls `Cl` is
18
+ # `bin/run`) the default runner would recognize and run it:
19
+ #
20
+ # $ bin/run git:pull master # instantiates Git::Pull, and passes ["master"] as args
21
+ # $ bin/run git pull master # does the same
22
+
23
+ <%= run "Cl.new('run').run(%w(git:pull master))" %>
24
+ <%= out '{:cmd=>:"git:pull", :args=>["master"]}' %>
25
+
26
+ <%= run "Cl.new('run').run(%w(git pull master))" %>
27
+ <%= out '{:cmd=>:"git:pull", :args=>["master"]}' %>
@@ -0,0 +1,25 @@
1
+ <%= run sq(<<-'rb')
2
+ # anywhere in your library
3
+
4
+ require 'cl'
5
+
6
+ class Runner
7
+ Cl::Runner.register :custom, self
8
+
9
+ def initialize(ctx, args)
10
+ # ...
11
+ end
12
+
13
+ def run
14
+ const = identify_cmd_class_from_args
15
+ const.new(ctx, args).run
16
+ end
17
+ end
18
+ rb
19
+ -%>
20
+
21
+ # in bin/run
22
+ Cl.new('run', runner: :custom).run(ARGV)
23
+
24
+ <% run "p Cl.new('run', runner: :custom).runner([]).class" %>
25
+ <% out 'Runner' %>
File without changes
File without changes
File without changes