cri 2.10.1 → 2.11.0

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
- SHA1:
3
- metadata.gz: f6c63bf18c481c1f172a325ebba098b530bf687c
4
- data.tar.gz: 0a82eb5bcfa077de4f3df0b6d62a315b5af10803
2
+ SHA256:
3
+ metadata.gz: cc4daab3e3ba10d21d0545fab6a7ab99dc8ad125b3ca3acd3691326b164ba4ca
4
+ data.tar.gz: 686ac2c2324893fbaabc650fe42858355f643eea90af8b6acff986207fb183ca
5
5
  SHA512:
6
- metadata.gz: 412df43765fd893929df701fcaea57d44f80d04ef29203e7f578d877b53cd9f090961c7718e2fdc8df9c210ec00e3f31f4006dfa6b688bbff55bdcfeadc5658b
7
- data.tar.gz: d2358da6e375295b76cb5bfc8a68114665710c6e191ec616b5946dcc2d186518622723ede0143117265e23a757e32ba546fc88f5b7ae5da66c805d73f77f77f5
6
+ metadata.gz: 0cc8b4aadbde4cae477feb33d2578287d23dc77aea4700dae5115ee06d19e1234ba5625db2f3cd053bfa941e425cc50d0ac0c6836ffcb1b807b92f3aa3055470
7
+ data.tar.gz: 55c6c0dd76ab840f11f73568de6fa5105dfd934b4602d1fb55bc9f506d4bd001b9bb890110fee0b68bc23ca6824547f33b757855fda126bca27dd72f656d6164
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
@@ -1,50 +1,51 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cri (2.10.1)
4
+ cri (2.11.0)
5
5
  colored (~> 1.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- asciidoctor (1.5.6.1)
11
- ast (2.3.0)
10
+ asciidoctor (1.5.7.1)
11
+ ast (2.4.0)
12
12
  colored (1.2)
13
- coveralls (0.8.21)
13
+ coveralls (0.8.22)
14
14
  json (>= 1.8, < 3)
15
- simplecov (~> 0.14.1)
15
+ simplecov (~> 0.16.1)
16
16
  term-ansicolor (~> 1.3)
17
17
  thor (~> 0.19.4)
18
18
  tins (~> 1.6)
19
- docile (1.1.5)
19
+ docile (1.3.1)
20
+ jaro_winkler (1.5.1)
20
21
  json (2.1.0)
21
- minitest (5.10.3)
22
- parallel (1.12.0)
23
- parser (2.4.0.0)
24
- ast (~> 2.2)
25
- powerpack (0.1.1)
26
- rainbow (2.2.2)
27
- rake
28
- rake (12.2.1)
29
- rubocop (0.51.0)
22
+ minitest (5.11.3)
23
+ parallel (1.12.1)
24
+ parser (2.5.1.2)
25
+ ast (~> 2.4.0)
26
+ powerpack (0.1.2)
27
+ rainbow (3.0.0)
28
+ rake (12.3.1)
29
+ rubocop (0.58.2)
30
+ jaro_winkler (~> 1.5.1)
30
31
  parallel (~> 1.10)
31
- parser (>= 2.3.3.1, < 3.0)
32
+ parser (>= 2.5, != 2.5.1.1)
32
33
  powerpack (~> 0.1)
33
- rainbow (>= 2.2.2, < 3.0)
34
+ rainbow (>= 2.2.2, < 4.0)
34
35
  ruby-progressbar (~> 1.7)
35
36
  unicode-display_width (~> 1.0, >= 1.0.1)
36
37
  ruby-progressbar (1.9.0)
37
- simplecov (0.14.1)
38
- docile (~> 1.1.0)
38
+ simplecov (0.16.1)
39
+ docile (~> 1.1)
39
40
  json (>= 1.8, < 3)
40
41
  simplecov-html (~> 0.10.0)
41
42
  simplecov-html (0.10.2)
42
43
  term-ansicolor (1.6.0)
43
44
  tins (~> 1.0)
44
45
  thor (0.19.4)
45
- tins (1.15.0)
46
- unicode-display_width (1.3.0)
47
- yard (0.9.9)
46
+ tins (1.16.3)
47
+ unicode-display_width (1.4.0)
48
+ yard (0.9.15)
48
49
 
49
50
  PLATFORMS
50
51
  ruby
@@ -60,4 +61,4 @@ DEPENDENCIES
60
61
  yard
61
62
 
62
63
  BUNDLED WITH
63
- 1.15.4
64
+ 1.16.3
data/NEWS.md CHANGED
@@ -1,6 +1,12 @@
1
1
  Cri News
2
2
  ========
3
3
 
4
+ ## 2.11.0
5
+
6
+ Features:
7
+
8
+ * Added support for transforming option values (#68)
9
+
4
10
  ## 2.10.1
5
11
 
6
12
  Fixes:
@@ -1,19 +1,19 @@
1
- = Cri =
1
+ # Cri
2
2
 
3
- link:http://rubygems.org/gems/cri[image:http://img.shields.io/gem/v/cri.svg[]]
4
- link:https://travis-ci.org/ddfreyne/cri[image:http://img.shields.io/travis/ddfreyne/cri.svg[]]
5
- link:https://coveralls.io/r/ddfreyne/cri[image:http://img.shields.io/coveralls/ddfreyne/cri.svg[]]
6
- link:https://codeclimate.com/github/ddfreyne/cri[image:http://img.shields.io/codeclimate/github/ddfreyne/cri.svg[]]
7
- link:http://inch-ci.org/github/ddfreyne/cri/[image:http://inch-ci.org/github/ddfreyne/cri.svg[]]
3
+ [![Gem](http://img.shields.io/gem/v/cri.svg)](http://rubygems.org/gems/cri)
4
+ [![Travis](http://img.shields.io/travis/ddfreyne/cri.svg)](https://travis-ci.org/ddfreyne/cri)
5
+ [![Coveralls](http://img.shields.io/coveralls/ddfreyne/cri.svg)](https://coveralls.io/r/ddfreyne/cri)
6
+ [![Codeclimate](http://img.shields.io/codeclimate/github/ddfreyne/cri.svg)](https://codeclimate.com/github/ddfreyne/cri)
7
+ [![Inch](http://inch-ci.org/github/ddfreyne/cri.svg)](http://inch-ci.org/github/ddfreyne/cri/)
8
8
 
9
9
  Cri is a library for building easy-to-use command-line tools with support for
10
10
  nested commands.
11
11
 
12
- == Requirements ==
12
+ ## Requirements
13
13
 
14
- Cri requires Ruby 2.1 or newer.
14
+ Cri requires Ruby 2.3 or newer.
15
15
 
16
- == Usage ==
16
+ ## Usage
17
17
 
18
18
  The central concept in Cri is the _command_, which has option definitions as
19
19
  well as code for actually executing itself. In Cri, the command-line tool
@@ -21,8 +21,7 @@ itself is a command as well.
21
21
 
22
22
  Here’s a sample command definition:
23
23
 
24
- [source,ruby]
25
- --------------------------------------------------------------------------------
24
+ ```ruby
26
25
  command = Cri::Command.define do
27
26
  name 'dostuff'
28
27
  usage 'dostuff [options]'
@@ -46,21 +45,20 @@ command = Cri::Command.define do
46
45
  end
47
46
  end
48
47
  end
49
- --------------------------------------------------------------------------------
48
+ ```
50
49
 
51
50
  To run this command, invoke the `#run` method with the raw arguments. For
52
51
  example, for a root command (the command-line tool itself), the command could
53
52
  be called like this:
54
53
 
55
- [source,ruby]
56
- --------------------------------------------------------------------------------
54
+ ```ruby
57
55
  command.run(ARGV)
58
- --------------------------------------------------------------------------------
56
+ ```
59
57
 
60
58
  Each command has automatically generated help. This help can be printed using
61
59
  `Cri::Command#help`; something like this will be shown:
62
60
 
63
- --------------------------------------------------------------------------------
61
+ ```
64
62
  usage: dostuff [options]
65
63
 
66
64
  does stuff
@@ -72,20 +70,19 @@ options:
72
70
  -h --help show help for this command
73
71
  --more do even more stuff
74
72
  -s --stuff specify stuff to do
75
- --------------------------------------------------------------------------------
73
+ ```
76
74
 
77
- === General command metadata ===
75
+ ### General command metadata
78
76
 
79
77
  Let’s disect the command definition and start with the first five lines:
80
78
 
81
- [source,ruby]
82
- --------------------------------------------------------------------------------
79
+ ```ruby
83
80
  name 'dostuff'
84
81
  usage 'dostuff [options]'
85
82
  aliases :ds, :stuff
86
83
  summary 'does stuff'
87
84
  description 'This command does a lot of stuff. I really mean a lot.'
88
- --------------------------------------------------------------------------------
85
+ ```
89
86
 
90
87
  These lines of the command definition specify the name of the command (or the
91
88
  command-line tool, if the command is the root command), the usage, a list of
@@ -95,31 +92,33 @@ the supercommand, because the latter will be automatically prepended.
95
92
 
96
93
  Aliases don’t make sense for root commands, but for subcommands they do.
97
94
 
98
- === Command-line options ===
95
+ ### Command-line options
99
96
 
100
97
  The next few lines contain the command’s option definitions:
101
98
 
102
- [source,ruby]
103
- --------------------------------------------------------------------------------
99
+ ```ruby
104
100
  flag :h, :help, 'show help for this command' do |value, cmd|
105
101
  puts cmd.help
106
102
  exit 0
107
103
  end
108
104
  flag nil, :more, 'do even more stuff'
109
105
  option :s, :stuff, 'specify stuff to do', argument: :required
110
- --------------------------------------------------------------------------------
106
+ ```
111
107
 
112
108
  Options can be defined using the following methods:
113
109
 
114
- * `Cri::CommandDSL#option` or `Cri::CommandDSL#opt`
110
+ * `Cri::CommandDSL#option` or `Cri::CommandDSL#opt` (include an `argument` parameter: `:required` or `:optional` that specifies if the option requires or allows an argument)
115
111
  * `Cri::CommandDSL#flag` (implies no arguments passed to option)
116
- * `Cri::CommandDSL#required` (implies required argument)
117
- * `Cri::CommandDSL#optional` (implies optional argument)
112
+
113
+ The following _deprecated_ methods can also be used to define options:
114
+
115
+ * `Cri::CommandDSL#required` (implies an option that requires an argument -- deprecated because `#required` suggests that the option is required, wich is incorrect; the _argument_ is required.)
116
+ * `Cri::CommandDSL#optional` (implies an option that can optionally include an argument -- deprecated because `#optional` looks too similar to `#option`.)
118
117
 
119
118
  All these methods take these arguments:
120
119
 
121
- 1. a short option
122
- 2. a long option
120
+ 1. a short option name
121
+ 2. a long option name
123
122
  3. a description
124
123
  4. optional extra parameters
125
124
 
@@ -128,27 +127,62 @@ would not make any sense). In the example above, the `--more` option has no
128
127
  short form.
129
128
 
130
129
  Each of the above methods also take a block, which will be executed when the
131
- option is found. The argument to the block are the option value (`true` in
130
+ option is found. The arguments to the block are the option value (`true` in
132
131
  case the option does not have an argument) and the command.
133
132
 
134
- ==== Options with default values ====
133
+ #### Transforming options
134
+
135
+ The `:transform` parameter specifies how the value should be transformed. It takes any object that responds to `#call`:
136
+
137
+ ```ruby
138
+ option :p, :port, 'set port', argument: :required,
139
+ transform: -> (x) { Integer(x) }
140
+ ```
141
+
142
+ The following example uses `#Integer` to transform a string into an integer:
143
+
144
+ ```ruby
145
+ option :p, :port, 'set port', argument: :required, transform: method(:Integer)
146
+ ```
147
+
148
+ The following example uses a custom object to perform transformation, as well as validation:
149
+
150
+ ```ruby
151
+ class PortTransformer
152
+ def call(str)
153
+ raise ArgumentError unless str.is_a?(String)
154
+ Integer(str).tap do |int|
155
+ raise unless (0x0001..0xffff).include?(int)
156
+ end
157
+ end
158
+ end
159
+
160
+ option :p, :port, 'set port', argument: :required, transform: PortTransformer.new
161
+ ```
162
+
163
+ Default values are not transformed:
164
+
165
+ ```ruby
166
+ option :p, :port, 'set port', argument: :required, default: 8080, transform: PortTransformer.new
167
+ ```
168
+
169
+ #### Options with default values
135
170
 
136
- The `:default` parameter sets the option value that will be used if no explicit value is provided:
171
+ The `:default` parameter sets the option value that will be used if the option is passed without an argument or isn't passed at all:
137
172
 
138
- [source,ruby]
139
- --------------------------------------------------------------------------------
140
- optional :a, :animal, 'add animal', default: 'giraffe'
141
- --------------------------------------------------------------------------------
173
+ ```ruby
174
+ option :a, :animal, 'add animal', default: 'giraffe', argument: :optional
175
+ ```
142
176
 
143
177
  In the example above, the value for the `--animal` option will be the string
144
178
  `"giraffe"`, unless otherwise specified:
145
179
 
146
- --------------------------------------------------------------------------------
180
+ ```
147
181
  OPTIONS
148
182
  -a --animal[=<value>] add animal (default: giraffe)
149
- --------------------------------------------------------------------------------
183
+ ```
150
184
 
151
- ==== Multivalued options ====
185
+ #### Multivalued options
152
186
 
153
187
  Each of these four methods take a `:multiple` parameter. When set to true, multiple
154
188
  option valus are accepted, and the option values will be stored in an array.
@@ -157,10 +191,9 @@ For example, to parse the command line options string `-o foo.txt -o bar.txt`
157
191
  into an array, so that `options[:output]` contains `[ 'foo.txt', 'bar.txt' ]`,
158
192
  you can use an option definition like this:
159
193
 
160
- [source,ruby]
161
- --------------------------------------------------------------------------------
194
+ ```ruby
162
195
  option :o, :output, 'specify output paths', argument: :required, multiple: true
163
- --------------------------------------------------------------------------------
196
+ ```
164
197
 
165
198
  This can also be used for flags (options without arguments). In this case, the
166
199
  length of the options array is relevant.
@@ -169,19 +202,17 @@ For example, you can allow setting the verbosity level using `-v -v -v`. The
169
202
  value of `options[:verbose].size` would then be the verbosity level (three in
170
203
  this example). The option definition would then look like this:
171
204
 
172
- [source,ruby]
173
- --------------------------------------------------------------------------------
205
+ ```ruby
174
206
  flag :v, :verbose, 'be verbose (use up to three times)', multiple: true
175
- --------------------------------------------------------------------------------
207
+ ```
176
208
 
177
- ==== Skipping option parsing ====
209
+ #### Skipping option parsing
178
210
 
179
211
  If you want to skip option parsing for your command or subcommand, you can add
180
212
  the `skip_option_parsing` method to your command definition and everything on your
181
213
  command line after the command name will be passed to your command as arguments.
182
214
 
183
- [source,ruby]
184
- -------------------------------------------------------------------------------
215
+ ```ruby
185
216
  command = Cri::Command.define do
186
217
  name 'dostuff'
187
218
  usage 'dostuff [args]'
@@ -195,18 +226,17 @@ command = Cri::Command.define do
195
226
  puts args.inspect
196
227
  end
197
228
  end
198
- -------------------------------------------------------------------------------
229
+ ```
199
230
 
200
231
  When executing this command with `dostuff --some=value -f yes`, the `opts` hash
201
232
  that is passed to your `run` block will be empty and the `args` array will be
202
233
  `["--some=value", "-f", "yes"]`.
203
234
 
204
- === The run block ===
235
+ ### The run block
205
236
 
206
237
  The last part of the command defines the execution itself:
207
238
 
208
- [source,ruby]
209
- --------------------------------------------------------------------------------
239
+ ```ruby
210
240
  run do |opts, args, cmd|
211
241
  stuff = opts.fetch(:stuff, 'generic stuff')
212
242
  puts "Doing #{stuff}!"
@@ -215,7 +245,7 @@ run do |opts, args, cmd|
215
245
  puts 'Doing it even more!'
216
246
  end
217
247
  end
218
- --------------------------------------------------------------------------------
248
+ ```
219
249
 
220
250
  The +Cri::CommandDSL#run+ method takes a block with the actual code to
221
251
  execute. This block takes three arguments: the options, any arguments passed
@@ -226,7 +256,7 @@ _command runner_ class (`Cri::CommandRunner`) that will perform the actual
226
256
  execution of the command. This makes it easier to break up large run blocks
227
257
  into manageable pieces.
228
258
 
229
- === Subcommands ===
259
+ ### Subcommands
230
260
 
231
261
  Commands can have subcommands. For example, the `git` command-line tool would be
232
262
  represented by a command that has subcommands named `commit`, `add`, and so on.
@@ -236,27 +266,38 @@ dispatched to a subcommand (or none, if no subcommand is found).
236
266
  To add a command as a subcommand to another command, use the
237
267
  `Cri::Command#add_command` method, like this:
238
268
 
239
- [source,ruby]
240
- --------------------------------------------------------------------------------
269
+ ```ruby
241
270
  root_cmd.add_command(cmd_add)
242
271
  root_cmd.add_command(cmd_commit)
243
- root.cmd.add_command(cmd_init)
244
- --------------------------------------------------------------------------------
272
+ root_cmd.add_command(cmd_init)
273
+ ```
274
+
275
+ You can also define a subcommand on the fly without creating a class first
276
+ using `Cri::Command#define_command` (name can be skipped if you set it inside
277
+ the block instead):
278
+
279
+ ```ruby
280
+ root_cmd.define_command('add') do
281
+ # option ...
282
+ run do |opts, args, cmd|
283
+ # ...
284
+ end
285
+ end
286
+ ```
245
287
 
246
288
  You can specify a default subcommand. This subcommand will be executed when the
247
289
  command has subcommands, and no subcommands are otherwise explicitly specified:
248
290
 
249
- [source,ruby]
250
- --------------------------------------------------------------------------------
291
+ ```ruby
251
292
  default_subcommand 'compile'
252
- --------------------------------------------------------------------------------
293
+ ```
253
294
 
254
- == Contributors ==
295
+ ## Contributors
255
296
 
256
297
  * Bart Mesuere
257
298
  * Ken Coar
258
299
  * Tim Sharpe
259
300
  * Toon Willems
260
301
 
261
- Thanks for Lee “injekt” Jarvis for link:https://github.com/injekt/slop[Slop],
302
+ Thanks for Lee “injekt” Jarvis for [Slop](https://github.com/injekt/slop),
262
303
  which has inspired the design of Cri 2.0.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # encoing: utf-8
2
4
 
3
5
  require 'rake/testtask'
@@ -1,5 +1,6 @@
1
- $LOAD_PATH.unshift(File.expand_path('../lib/', __FILE__))
2
- require 'cri/version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/cri/version'
3
4
 
4
5
  Gem::Specification.new do |s|
5
6
  s.name = 'cri'
@@ -15,12 +16,12 @@ Gem::Specification.new do |s|
15
16
  s.files = Dir['[A-Z]*'] + Dir['{lib,test}/**/*'] + ['cri.gemspec']
16
17
  s.require_paths = ['lib']
17
18
 
18
- s.required_ruby_version = '~> 2.1'
19
+ s.required_ruby_version = '~> 2.3'
19
20
 
20
21
  s.add_dependency('colored', '~> 1.2')
21
22
 
22
23
  s.add_development_dependency('bundler', '~> 1.6')
23
24
 
24
- s.rdoc_options = ['--main', 'README.adoc']
25
- s.extra_rdoc_files = ['LICENSE', 'README.adoc', 'NEWS.md']
25
+ s.rdoc_options = ['--main', 'README.md']
26
+ s.extra_rdoc_files = ['LICENSE', 'README.md', 'NEWS.md']
26
27
  end