cl 0.1.28 → 1.0.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.
Files changed (73) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +19 -1
  4. data/NOTES.md +2 -0
  5. data/README.md +210 -142
  6. data/examples/args/cast +53 -41
  7. data/examples/args/opts +72 -14
  8. data/examples/args/required +28 -14
  9. data/examples/args/splat +29 -32
  10. data/examples/gem +26 -37
  11. data/examples/heroku +15 -16
  12. data/examples/rakeish +13 -15
  13. data/examples/readme/abstract +6 -5
  14. data/examples/readme/alias +4 -7
  15. data/examples/readme/arg +4 -2
  16. data/examples/readme/arg_array +4 -2
  17. data/examples/readme/arg_type +3 -1
  18. data/examples/readme/args_splat +13 -4
  19. data/examples/readme/default +2 -2
  20. data/examples/readme/deprecated +3 -6
  21. data/examples/readme/deprecated_alias +2 -4
  22. data/examples/readme/downcase +2 -2
  23. data/examples/readme/enum +10 -5
  24. data/examples/readme/example +6 -4
  25. data/examples/readme/format +9 -7
  26. data/examples/readme/internal +8 -4
  27. data/examples/readme/negate +20 -5
  28. data/examples/readme/node +19 -0
  29. data/examples/readme/opts +8 -8
  30. data/examples/readme/opts_block +4 -3
  31. data/examples/readme/range +9 -7
  32. data/examples/readme/required +9 -7
  33. data/examples/readme/requireds +26 -18
  34. data/examples/readme/requires +13 -14
  35. data/examples/readme/secret +7 -9
  36. data/examples/readme/see +6 -8
  37. data/examples/readme/type +2 -6
  38. data/examples/src/args/cast.erb.rb +96 -0
  39. data/examples/src/args/opts.erb.rb +96 -0
  40. data/examples/src/args/required.erb.rb +61 -0
  41. data/examples/src/args/splat.erb.rb +55 -0
  42. data/examples/src/gem.erb.rb +95 -0
  43. data/examples/src/heroku.erb.rb +47 -0
  44. data/examples/src/rakeish.erb.rb +54 -0
  45. data/examples/src/readme/abstract.erb.rb +25 -0
  46. data/examples/src/readme/alias.erb.rb +20 -0
  47. data/examples/src/readme/arg.erb.rb +19 -0
  48. data/examples/src/readme/arg_array.erb.rb +19 -0
  49. data/examples/src/readme/arg_type.erb.rb +21 -0
  50. data/examples/src/readme/args_splat.erb.rb +49 -0
  51. data/examples/src/readme/array.erb.rb +19 -0
  52. data/examples/src/readme/default.erb.rb +19 -0
  53. data/examples/src/readme/deprecated.erb.rb +19 -0
  54. data/examples/src/readme/deprecated_alias.erb.rb +19 -0
  55. data/examples/src/readme/downcase.erb.rb +19 -0
  56. data/examples/src/readme/enum.erb.rb +33 -0
  57. data/examples/src/readme/example.erb.rb +23 -0
  58. data/examples/src/readme/format.erb.rb +33 -0
  59. data/examples/src/readme/internal.erb.rb +26 -0
  60. data/examples/src/readme/negate.erb.rb +35 -0
  61. data/examples/src/readme/node.erb.rb +23 -0
  62. data/examples/src/readme/opts.erb.rb +31 -0
  63. data/examples/src/readme/opts_block.erb.rb +28 -0
  64. data/examples/src/readme/range.erb.rb +33 -0
  65. data/examples/src/readme/required.erb.rb +33 -0
  66. data/examples/src/readme/requireds.erb.rb +44 -0
  67. data/examples/src/readme/requires.erb.rb +33 -0
  68. data/examples/src/readme/secret.erb.rb +20 -0
  69. data/examples/src/readme/see.erb.rb +23 -0
  70. data/examples/src/readme/type.erb.rb +19 -0
  71. data/lib/cl/ui.rb +2 -2
  72. data/lib/cl/version.rb +1 -1
  73. metadata +40 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7150374312ff76cb84a5acc1d245a69419693cbb
4
- data.tar.gz: 8a20781654b4cdafa18dfb43963601cc00096002
2
+ SHA256:
3
+ metadata.gz: 8e6ef1ee5a1de5a6db0abe39ce38d2e2cce9acd93ea525b456fdb3a06b80022f
4
+ data.tar.gz: 7fb5f6eaf119649982149be1ac54a367ed85188e63acfb85d4ed422e72620e3b
5
5
  SHA512:
6
- metadata.gz: f96eb7d20a7d985ac5f63f6e897b3753a6f4ac3322429be40f2edbb542df4fb840477054113b698356ad541849eb2bc4b8c0b4d8c28a004687858006e24698d5
7
- data.tar.gz: b0e2e480a7852eb3dd2b5e54fabdcffaa2164ddcfd25722d27d12422378145c8f3ace1d423f3dc777c59892f23a546526c654e6c18d11fd9b5caf6d2df176ba9
6
+ metadata.gz: d8e3e6454c83f588383b713af70cf43d69f7914349eabcb07586045e45aa2ee44cae7f7be7ad86438800213270791fdae8047e52f7ec971fa36217956a093cf7
7
+ data.tar.gz: ebbdafe93266703989144983f919fa79325c5797c1cfe831a83b5a8e3c7a04d5042e7b2c3ab1ea5553319c105d1d916e6b8e2ab70ef711000be2e861d95fbd2d
data/Gemfile CHANGED
@@ -5,4 +5,5 @@ gemspec
5
5
  group :test do
6
6
  gem 'memfs'
7
7
  gem 'rspec'
8
+ gem 'coveralls', require: false
8
9
  end
@@ -1,13 +1,21 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cl (0.1.26)
4
+ cl (0.1.28)
5
5
  regstry (~> 1.0.3)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ coveralls (0.8.23)
11
+ json (>= 1.8, < 3)
12
+ simplecov (~> 0.16.1)
13
+ term-ansicolor (~> 1.3)
14
+ thor (>= 0.19.4, < 2.0)
15
+ tins (~> 1.6)
10
16
  diff-lcs (1.3)
17
+ docile (1.3.2)
18
+ json (2.2.0)
11
19
  memfs (1.0.0)
12
20
  regstry (1.0.14)
13
21
  rspec (3.8.0)
@@ -23,12 +31,22 @@ GEM
23
31
  diff-lcs (>= 1.2.0, < 2.0)
24
32
  rspec-support (~> 3.8.0)
25
33
  rspec-support (3.8.0)
34
+ simplecov (0.16.1)
35
+ docile (~> 1.1)
36
+ json (>= 1.8, < 3)
37
+ simplecov-html (~> 0.10.0)
38
+ simplecov-html (0.10.2)
39
+ term-ansicolor (1.7.1)
40
+ tins (~> 1.0)
41
+ thor (0.20.3)
42
+ tins (1.21.1)
26
43
 
27
44
  PLATFORMS
28
45
  ruby
29
46
 
30
47
  DEPENDENCIES
31
48
  cl!
49
+ coveralls
32
50
  memfs
33
51
  rspec
34
52
 
data/NOTES.md CHANGED
@@ -11,3 +11,5 @@ x add toc
11
11
  x add yard docs
12
12
 
13
13
  - refactor Help::Cmd and Table so that everything goes into one big table
14
+ - Ui classes really need to write error messages to stderr, not stdout
15
+ - make sure option aliases define accessors and predicates (see examples/readme/alias)
data/README.md CHANGED
@@ -1,15 +1,12 @@
1
- # Cl [![Build Status](https://travis-ci.org/svenfuchs/cl.svg?branch=master)](https://travis-ci.org/svenfuchs/cl)
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)
2
2
 
3
3
  OptionParser based CLI support for rapid CLI development in an object-oriented
4
4
  context.
5
5
 
6
- This library wraps Ruby's OptionParser in order to make it easier to use it in
7
- an object oriented context.
6
+ This library wraps Ruby's OptionParser for parsing your options under the hood,
7
+ so you get all the goodness that the Ruby standard library provides.
8
8
 
9
- It uses OptionParser for parsing your options under the hood, so you get all
10
- the goodness that this library provides.
11
-
12
- But on top of that it also provides a rich DSL for defining, validating, and
9
+ On top of that it adds a rich and powerful DSL for defining, validating, and
13
10
  normalizing options, as well as automatic and gorgeous help output (modeled
14
11
  after `gem --help`).
15
12
 
@@ -277,19 +274,20 @@ class Base < Cl::Cmd
277
274
  end
278
275
 
279
276
  class Add < Base
277
+ def run
278
+ puts 'Success'
279
+ end
280
280
  end
281
281
 
282
- Cl.new('owners').help
282
+ Cl.new('owners').run(%w(add))
283
283
 
284
284
  # Output:
285
285
  #
286
- # Type "owners help COMMAND [SUBCOMMAND]" for more details:
287
- #
288
- # owners add [options]
286
+ # Success
289
287
 
290
288
  Cl.new('owners').run(%w(base))
291
289
 
292
- # Error output:
290
+ # Output:
293
291
  #
294
292
  # Unknown command: base
295
293
 
@@ -311,13 +309,15 @@ class Add < Cl::Cmd
311
309
  arg :owner
312
310
 
313
311
  def run
314
- p owner
312
+ p owner: owner
315
313
  end
316
314
  end
317
315
 
318
316
  Cl.new('owners').run(%w(add one))
319
317
 
320
- # => "one"
318
+ # Output:
319
+ #
320
+ # {:owner=>"one"}
321
321
 
322
322
  ```
323
323
 
@@ -337,13 +337,15 @@ class Add < Cl::Cmd
337
337
  arg :owners, type: :array, sep: ','
338
338
 
339
339
  def run
340
- p owners
340
+ p owners: owners
341
341
  end
342
342
  end
343
343
 
344
344
  Cl.new('owners').run(%w(add one,two))
345
345
 
346
- # => ["one", "two"]
346
+ # Output:
347
+ #
348
+ # {:owners=>["one", "two"]}
347
349
 
348
350
  ```
349
351
 
@@ -362,7 +364,9 @@ end
362
364
 
363
365
  Cl.new('owners').run(%w(cmd 1 2.1 yes))
364
366
 
365
- # => [Integer, Float, TrueClass]
367
+ # Output:
368
+ #
369
+ # [Integer, Float, TrueClass]
366
370
 
367
371
  ```
368
372
 
@@ -373,19 +377,53 @@ Array arguments support splats, modeled after Ruby argument splats.
373
377
  For example:
374
378
 
375
379
  ```ruby
376
- class Cmd < Cl::Cmd
377
- arg :one, type: :integer
378
- arg :two, type: :float
379
- arg :three, type: :boolean
380
+ class Lft < Cl::Cmd
381
+ arg :a, type: :array, splat: true
382
+ arg :b
383
+ arg :c
380
384
 
381
385
  def run
382
- p [one.class, two.class, three.class]
386
+ p [a, b, c]
383
387
  end
384
388
  end
385
389
 
386
- Cl.new('owners').run(%w(cmd 1 2.1 yes))
390
+ class Mid < Cl::Cmd
391
+ arg :a
392
+ arg :b, type: :array, splat: true
393
+ arg :c
394
+
395
+ def run
396
+ p [a, b, c]
397
+ end
398
+ end
399
+
400
+ class Rgt < Cl::Cmd
401
+ arg :a
402
+ arg :b
403
+ arg :c, type: :array, splat: true
404
+
405
+ def run
406
+ p [a, b, c]
407
+ end
408
+ end
409
+
410
+ Cl.new('splat').run(%w(lft 1 2 3 4 5))
411
+
412
+ # Output:
413
+ #
414
+ # [["1", "2", "3"], "4", "5"]
415
+
416
+ Cl.new('splat').run(%w(mid 1 2 3 4 5))
417
+
418
+ # Output:
419
+ #
420
+ # ["1", ["2", "3", "4"], "5"]
387
421
 
388
- # => [Integer, Float, TrueClass]
422
+ Cl.new('splat').run(%w(rgt 1 2 3 4 5))
423
+
424
+ # Output:
425
+ #
426
+ # ["1", "2", ["3", "4", "5"]]
389
427
 
390
428
  ```
391
429
 
@@ -404,7 +442,7 @@ class Add < Cl::Cmd
404
442
  opt '--to GROUP', 'Target group to add owners to'
405
443
 
406
444
  def run
407
- p opts, to, to?
445
+ p opts: opts, to: to, to?: to?
408
446
  end
409
447
  end
410
448
 
@@ -412,18 +450,18 @@ Cl.new('owners').run(%w(add --to one))
412
450
 
413
451
  # Output:
414
452
  #
415
- # {"to" => "one"}
416
- # "one"
417
- # true
453
+ # {:opts=>{:to=>"one"}, :to=>"one", :to?=>true}
418
454
 
419
455
  Cl.new('owners').run(%w(add --help))
420
456
 
421
- # Usage: opts add [options]
457
+ # Output:
422
458
  #
423
- # Options:
459
+ # Usage: owners add [options]
424
460
  #
425
- # --to GROUP Target group to add owners to (type: string)
426
- # --help Get help on this command
461
+ # Options:
462
+ #
463
+ # --to GROUP Target group to add owners to (type: string)
464
+ # --help Get help on this command
427
465
 
428
466
  ```
429
467
 
@@ -442,11 +480,11 @@ class Add < Cl::Cmd
442
480
  # * value, name, type
443
481
  # * value, name, type, opts
444
482
  opt '--to GROUP' do |value|
445
- opts[:to] = "#{value.upcase}!"
483
+ opts[:to] = "group-#{value}"
446
484
  end
447
485
 
448
486
  def run
449
- p to
487
+ p to: to
450
488
  end
451
489
  end
452
490
 
@@ -454,7 +492,8 @@ Cl.new('owners').run(%w(add --to one))
454
492
 
455
493
  # Output:
456
494
  #
457
- # "ONE!"
495
+ # {:to=>"group-one"}
496
+
458
497
 
459
498
  ```
460
499
 
@@ -467,19 +506,16 @@ class Add < Cl::Cmd
467
506
  opt '--to GROUP', alias: :group
468
507
 
469
508
  def run
470
- p opts, to, to?, group, group?
509
+ # p opts: opts, to: to, to?: to?, group: group, group?: group?
510
+ p opts: opts, to: to, to?: to?
471
511
  end
472
512
  end
473
513
 
474
- Cl.new('owners').run(%w(add --to one))
514
+ Cl.new('owners').run(%w(add --group one))
475
515
 
476
516
  # Output:
477
517
  #
478
- # {"to" => "one"}
479
- # "one"
480
- # true
481
- # "one"
482
- # true
518
+ # {:opts=>{:to=>"one", :group=>"one"}, :to=>"one", :to?=>true}
483
519
 
484
520
  ```
485
521
 
@@ -494,7 +530,7 @@ class Add < Cl::Cmd
494
530
  opt '--to GROUP', default: 'default'
495
531
 
496
532
  def run
497
- p to
533
+ p to: to
498
534
  end
499
535
  end
500
536
 
@@ -502,7 +538,7 @@ Cl.new('owners').run(%w(add))
502
538
 
503
539
  # Output:
504
540
  #
505
- # "default"
541
+ # {:to=>"default"}
506
542
 
507
543
  ```
508
544
 
@@ -514,11 +550,10 @@ For a deprecated option:
514
550
 
515
551
  ```ruby
516
552
  class Add < Cl::Cmd
517
- opt '--to GROUP'
518
- opt '--target GROUP', deprecated: 'Deprecated: --target'
553
+ opt '--target GROUP', deprecated: 'Deprecated.'
519
554
 
520
555
  def run
521
- p to, deprecated_opts
556
+ p target: target, deprecations: deprecations
522
557
  end
523
558
  end
524
559
 
@@ -526,9 +561,7 @@ Cl.new('owners').run(%w(add --target one))
526
561
 
527
562
  # Output:
528
563
  #
529
- # "one"
530
- # {:target=>'Deprecated: --target'}
531
-
564
+ # {:target=>"one", :deprecations=>{:target=>"Deprecated."}}
532
565
 
533
566
  ```
534
567
 
@@ -539,7 +572,7 @@ class Add < Cl::Cmd
539
572
  opt '--to GROUP', alias: :target, deprecated: :target
540
573
 
541
574
  def run
542
- p to, deprecated_opts
575
+ p to: to, deprecations: deprecations
543
576
  end
544
577
  end
545
578
 
@@ -547,9 +580,7 @@ Cl.new('owners').run(%w(add --target one))
547
580
 
548
581
  # Output:
549
582
  #
550
- # "one"
551
- # {:target=>:to}
552
-
583
+ # {:to=>"one", :deprecations=>{:target=>:to}}
553
584
 
554
585
  ```
555
586
 
@@ -564,7 +595,7 @@ class Add < Cl::Cmd
564
595
  opt '--to GROUP', downcase: true
565
596
 
566
597
  def run
567
- p to
598
+ p to: to
568
599
  end
569
600
  end
570
601
 
@@ -572,7 +603,7 @@ Cl.new('owners').run(%w(add --to ONE))
572
603
 
573
604
  # Output:
574
605
  #
575
- # "one"
606
+ # {:to=>"one"}
576
607
 
577
608
  ```
578
609
 
@@ -590,7 +621,7 @@ class Add < Cl::Cmd
590
621
  opt '--to GROUP', enum: %w(one two)
591
622
 
592
623
  def run
593
- p to
624
+ p to: to
594
625
  end
595
626
  end
596
627
 
@@ -598,15 +629,20 @@ Cl.new('owners').run(%w(add --to one))
598
629
 
599
630
  # Output:
600
631
  #
601
- # "one"
632
+ # {:to=>"one"}
602
633
 
603
634
  Cl.new('owners').run(%w(add --to unknown))
604
635
 
605
- # Unknown value: to=unknown (known values: one, two)
636
+ # Output:
606
637
  #
607
- # Usage: enum add [options]
638
+ # Unknown value: to=unknown (known values: one, two)
608
639
  #
609
- # Options: ...
640
+ # Usage: owners add [options]
641
+ #
642
+ # Options:
643
+ #
644
+ # --to GROUP type: string, known values: one, two
645
+ # --help Get help on this command
610
646
 
611
647
  ```
612
648
 
@@ -621,12 +657,14 @@ end
621
657
 
622
658
  Cl.new('owners').run(%w(add --help))
623
659
 
624
- # Usage: example add [options]
660
+ # Output:
625
661
  #
626
- # Options:
662
+ # Usage: owners add [options]
627
663
  #
628
- # --to GROUP type: string, e.g.: group-one
629
- # --help Get help on this command
664
+ # Options:
665
+ #
666
+ # --to GROUP type: string, e.g.: group-one
667
+ # --help Get help on this command
630
668
 
631
669
  ```
632
670
 
@@ -644,7 +682,7 @@ class Add < Cl::Cmd
644
682
  opt '--to GROUP', format: /^\w+$/
645
683
 
646
684
  def run
647
- p to
685
+ p to: to
648
686
  end
649
687
  end
650
688
 
@@ -652,18 +690,20 @@ Cl.new('owners').run(%w(add --to one))
652
690
 
653
691
  # Output:
654
692
  #
655
- # "one"
693
+ # {:to=>"one"}
656
694
 
657
695
  Cl.new('owners').run(['add', '--to', 'does not match!'])
658
696
 
659
- # Invalid format: to (format: /^\w+$/)
697
+ # Output:
660
698
  #
661
- # Usage: format add [options]
699
+ # Invalid format: to (format: /^\w+$/)
662
700
  #
663
- # Options:
701
+ # Usage: owners add [options]
664
702
  #
665
- # --to GROUP type: string, format: /^\w+$/
666
- # --help Get help on this command
703
+ # Options:
704
+ #
705
+ # --to GROUP type: string, format: /^\w+$/
706
+ # --help Get help on this command
667
707
 
668
708
  ```
669
709
 
@@ -681,12 +721,14 @@ end
681
721
 
682
722
  Cl.new('owners').run(%w(add --help))
683
723
 
684
- # Usage: example add [options]
724
+ # Output:
685
725
  #
686
- # Options:
726
+ # Usage: owners add [options]
687
727
  #
688
- # --to GROUP type: string, e.g.: group-one
689
- # --help Get help on this command
728
+ # Options:
729
+ #
730
+ # --to GROUP type: string
731
+ # --help Get help on this command
690
732
 
691
733
  ```
692
734
 
@@ -705,7 +747,7 @@ class Add < Cl::Cmd
705
747
  opt '--retries COUNT', type: :integer, min: 1, max: 5
706
748
 
707
749
  def run
708
- p retries
750
+ p retries: retries
709
751
  end
710
752
  end
711
753
 
@@ -713,18 +755,20 @@ Cl.new('owners').run(%w(add --retries 1))
713
755
 
714
756
  # Output:
715
757
  #
716
- # 1
758
+ # {:retries=>1}
717
759
 
718
760
  Cl.new('owners').run(%w(add --retries 10))
719
761
 
720
- # Out of range: retries (max: 5)
762
+ # Output:
721
763
  #
722
- # Usage: max add [options]
764
+ # Out of range: retries (min: 1, max: 5)
723
765
  #
724
- # Options:
766
+ # Usage: owners add [options]
767
+ #
768
+ # Options:
725
769
  #
726
- # --retries COUNT type: integer, min: 1, max: 5
727
- # --help Get help on this command
770
+ # --retries COUNT type: integer, min: 1, max: 5
771
+ # --help Get help on this command
728
772
 
729
773
  ```
730
774
 
@@ -745,19 +789,34 @@ class Add < Cl::Cmd
745
789
  end
746
790
 
747
791
  Cl.new('owners').run(%w(add --notifications))
748
- # => true
792
+
793
+ # Output:
794
+ #
795
+ # true
749
796
 
750
797
  Cl.new('owners').run(%w(add --no_notifications))
751
- # => false
798
+
799
+ # Output:
800
+ #
801
+ # false
752
802
 
753
803
  Cl.new('owners').run(%w(add --no-notifications))
754
- # => false
804
+
805
+ # Output:
806
+ #
807
+ # false
755
808
 
756
809
  Cl.new('owners').run(%w(add --skip_notifications))
757
- # => false
810
+
811
+ # Output:
812
+ #
813
+ # false
758
814
 
759
815
  Cl.new('owners').run(%w(add --skip-notifications))
760
- # => false
816
+
817
+ # Output:
818
+ #
819
+ # false
761
820
 
762
821
  ```
763
822
 
@@ -791,21 +850,21 @@ on this in order to, for example, obfuscate values from log output.
791
850
 
792
851
  ```ruby
793
852
  class Add < Cl::Cmd
794
- opt '--to GROUP'
795
- opt '--password PASS', secret: true
853
+ opt '--pass PASS', secret: true
796
854
 
797
855
  def run
798
- puts [:secret?, self.class.opts[:password].secret?].join(' ')
799
- puts [:tainted?, password.tainted?].join(' ')
856
+ p(
857
+ secret?: self.class.opts[:pass].secret?,
858
+ tainted?: pass.tainted?
859
+ )
800
860
  end
801
861
  end
802
862
 
803
- Cl.new('owners').run(%w(add --password pass))
863
+ Cl.new('owners').run(%w(add --pass pass))
804
864
 
805
865
  # Output:
806
866
  #
807
- # secret? true
808
- # tainted? true
867
+ # {:secret?=>true, :tainted?=>true}
809
868
 
810
869
  ```
811
870
 
@@ -819,20 +878,18 @@ For example:
819
878
  ```ruby
820
879
  class Add < Cl::Cmd
821
880
  opt '--to GROUP', see: 'https://docs.io/cli/owners/add'
822
-
823
- def run
824
- p retries
825
- end
826
881
  end
827
882
 
828
883
  Cl.new('owners').run(%w(add --help))
829
884
 
830
- # Usage: see add [options]
885
+ # Output:
831
886
  #
832
- # Options:
887
+ # Usage: owners add [options]
833
888
  #
834
- # --to GROUP type: string, see: https://docs.io/cli/owners/add
835
- # --help Get help on this command
889
+ # Options:
890
+ #
891
+ # --to GROUP type: string, see: https://docs.io/cli/owners/add
892
+ # --help Get help on this command
836
893
 
837
894
  ```
838
895
 
@@ -871,7 +928,7 @@ class Add < Cl::Cmd
871
928
  opt '--sleep FLOAT', type: :float
872
929
 
873
930
  def run
874
- p active.class, retries.class, sleep.class
931
+ p active: active.class, retries: retries.class, sleep: sleep.class
875
932
  end
876
933
  end
877
934
 
@@ -879,9 +936,7 @@ Cl.new('owners').run(%w(add --active yes --retries 1 --sleep 0.1))
879
936
 
880
937
  # Output:
881
938
  #
882
- # TrueClass
883
- # Integer
884
- # Float
939
+ # {:active=>TrueClass, :retries=>Integer, :sleep=>Float}
885
940
 
886
941
  ```
887
942
 
@@ -900,7 +955,7 @@ class Add < Cl::Cmd
900
955
  opt '--to GROUP', required: true
901
956
 
902
957
  def run
903
- p to
958
+ p to: to
904
959
  end
905
960
  end
906
961
 
@@ -908,18 +963,20 @@ Cl.new('owners').run(%w(add --to one))
908
963
 
909
964
  # Output:
910
965
  #
911
- # "one"
966
+ # {:to=>"one"}
912
967
 
913
968
  Cl.new('owners').run(%w(add))
914
969
 
915
- # Missing required option: to
970
+ # Output:
916
971
  #
917
- # Usage: required add [options]
972
+ # Missing required option: to
918
973
  #
919
- # Options:
974
+ # Usage: owners add [options]
920
975
  #
921
- # --to GROUP type: string, required: true
922
- # --help Get help on this command
976
+ # Options:
977
+ #
978
+ # --to GROUP type: string, required: true
979
+ # --help Get help on this command
923
980
 
924
981
  ```
925
982
 
@@ -928,31 +985,32 @@ This will make the option `--retries` depend on the option `--to`:
928
985
  ```ruby
929
986
  class Add < Cl::Cmd
930
987
  opt '--to GROUP'
931
- opt '--retries INT', requires: :to
988
+ opt '--other GROUP', requires: :to
932
989
 
933
990
  def run
934
- p to, retries
991
+ p to: to, other: other
935
992
  end
936
993
  end
937
994
 
938
- Cl.new('owners').run(%w(add --to one --retries 1))
995
+ Cl.new('owners').run(%w(add --to one --other two))
939
996
 
940
997
  # Output:
941
998
  #
942
- # "one"
943
- # 1
999
+ # {:to=>"one", :other=>"two"}
944
1000
 
945
- Cl.new('owners').run(%w(add --retries 1))
1001
+ Cl.new('owners').run(%w(add --other two))
946
1002
 
947
- # Missing option: to (required by retries)
1003
+ # Output:
948
1004
  #
949
- # Usage: requires add [options]
1005
+ # Missing option: to (required by other)
950
1006
  #
951
- # Options:
1007
+ # Usage: owners add [options]
1008
+ #
1009
+ # Options:
952
1010
  #
953
- # --to GROUP type: string
954
- # --retries INT type: string, requires: to
955
- # --help Get help on this command
1011
+ # --to GROUP type: string
1012
+ # --other GROUP type: string, requires: to
1013
+ # --help Get help on this command
956
1014
 
957
1015
  ```
958
1016
 
@@ -961,36 +1019,46 @@ This requires either the option `--api_key` or both options `--username` and
961
1019
 
962
1020
  ```ruby
963
1021
  class Add < Cl::Cmd
964
- # read DNF, i.e. "apikey OR username AND password
965
- required :api_key, [:username, :password]
1022
+ # read DNF, i.e. "token OR user AND pass
1023
+ required :token, [:user, :pass]
966
1024
 
967
- opt '--api_key KEY'
968
- opt '--username NAME'
969
- opt '--password PASS'
1025
+ opt '--token TOKEN'
1026
+ opt '--user NAME'
1027
+ opt '--pass PASS'
970
1028
 
971
1029
  def run
972
- p to, retries
1030
+ p token: token, user: user, pass: pass
973
1031
  end
974
1032
  end
975
1033
 
976
- Cl.new('owners').run(%w(add --to one --retries 1))
1034
+ Cl.new('owners').run(%w(add --token token))
977
1035
 
978
1036
  # Output:
979
1037
  #
980
- # "one"
981
- # 1
1038
+ # {:token=>"token", :user=>nil, :pass=>nil}
982
1039
 
983
- Cl.new('owners').run(%w(add --retries 1))
1040
+ Cl.new('owners').run(%w(add --user user --pass pass))
1041
+
1042
+ # Output:
1043
+ #
1044
+ # {:token=>nil, :user=>"user", :pass=>"pass"}
1045
+
1046
+ Cl.new('owners').run(%w(add))
984
1047
 
985
- # Missing option: to (required by retries)
1048
+ # Output:
986
1049
  #
987
- # Usage: requires add [options]
1050
+ # Missing options: token, or user and pass
988
1051
  #
989
- # Options:
1052
+ # Usage: owners add [options]
1053
+ #
1054
+ # Options:
1055
+ #
1056
+ # Either token, or user and pass are required.
990
1057
  #
991
- # --to GROUP type: string
992
- # --retries INT type: string, requires: to
993
- # --help Get help on this command
1058
+ # --token TOKEN type: string
1059
+ # --user NAME type: string
1060
+ # --pass PASS type: string
1061
+ # --help Get help on this command
994
1062
 
995
1063
  ```
996
1064