toys 0.14.6 → 0.15.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 +4 -4
- data/CHANGELOG.md +28 -0
- data/LICENSE.md +1 -1
- data/README.md +5 -2
- data/builtins/system/test.rb +53 -35
- data/core-docs/toys/cli.rb +37 -64
- data/core-docs/toys/context.rb +51 -0
- data/core-docs/toys/core.rb +1 -1
- data/core-docs/toys/dsl/flag.rb +24 -1
- data/core-docs/toys/dsl/flag_group.rb +10 -2
- data/core-docs/toys/dsl/positional_arg.rb +16 -0
- data/core-docs/toys/dsl/tool.rb +144 -43
- data/core-docs/toys/middleware.rb +3 -2
- data/core-docs/toys/settings.rb +1 -1
- data/core-docs/toys/standard_mixins/bundler.rb +16 -1
- data/core-docs/toys/standard_mixins/exec.rb +25 -6
- data/core-docs/toys/standard_mixins/gems.rb +17 -3
- data/core-docs/toys/tool_definition.rb +125 -41
- data/core-docs/toys/utils/exec.rb +22 -1
- data/core-docs/toys/utils/standard_ui.rb +184 -0
- data/core-docs/toys-core.rb +51 -3
- data/docs/guide.md +152 -63
- data/lib/toys/standard_cli.rb +17 -2
- data/lib/toys/templates/gem_build.rb +13 -7
- data/lib/toys/templates/minitest.rb +47 -17
- data/lib/toys/templates/rake.rb +18 -6
- data/lib/toys/templates/rdoc.rb +28 -17
- data/lib/toys/templates/rspec.rb +18 -11
- data/lib/toys/templates/rubocop.rb +14 -8
- data/lib/toys/templates/yardoc.rb +46 -29
- data/lib/toys/testing.rb +1 -1
- data/lib/toys/version.rb +1 -1
- data/lib/toys.rb +22 -0
- metadata +8 -7
@@ -18,12 +18,12 @@ module Toys
|
|
18
18
|
##
|
19
19
|
# Create a completion given configuration options.
|
20
20
|
#
|
21
|
-
# @param complete_subtools [
|
22
|
-
# @param include_hidden_subtools [
|
21
|
+
# @param complete_subtools [true,false] Whether to complete subtool names
|
22
|
+
# @param include_hidden_subtools [true,false] Whether to include hidden
|
23
23
|
# subtools (i.e. those beginning with an underscore)
|
24
|
-
# @param complete_args [
|
25
|
-
# @param complete_flags [
|
26
|
-
# @param complete_flag_values [
|
24
|
+
# @param complete_args [true,false] Whether to complete positional args
|
25
|
+
# @param complete_flags [true,false] Whether to complete flag names
|
26
|
+
# @param complete_flag_values [true,false] Whether to complete flag values
|
27
27
|
# @param delegation_target [Array<String>,nil] Delegation target, or
|
28
28
|
# `nil` if none.
|
29
29
|
#
|
@@ -35,7 +35,7 @@ module Toys
|
|
35
35
|
|
36
36
|
##
|
37
37
|
# Whether to complete subtool names
|
38
|
-
# @return [
|
38
|
+
# @return [true,false]
|
39
39
|
#
|
40
40
|
def complete_subtools?
|
41
41
|
# Source available in the toys-core gem
|
@@ -43,7 +43,7 @@ module Toys
|
|
43
43
|
|
44
44
|
##
|
45
45
|
# Whether to include hidden subtools
|
46
|
-
# @return [
|
46
|
+
# @return [true,false]
|
47
47
|
#
|
48
48
|
def include_hidden_subtools?
|
49
49
|
# Source available in the toys-core gem
|
@@ -51,7 +51,7 @@ module Toys
|
|
51
51
|
|
52
52
|
##
|
53
53
|
# Whether to complete flags
|
54
|
-
# @return [
|
54
|
+
# @return [true,false]
|
55
55
|
#
|
56
56
|
def complete_flags?
|
57
57
|
# Source available in the toys-core gem
|
@@ -59,7 +59,7 @@ module Toys
|
|
59
59
|
|
60
60
|
##
|
61
61
|
# Whether to complete positional args
|
62
|
-
# @return [
|
62
|
+
# @return [true,false]
|
63
63
|
#
|
64
64
|
def complete_args?
|
65
65
|
# Source available in the toys-core gem
|
@@ -67,7 +67,7 @@ module Toys
|
|
67
67
|
|
68
68
|
##
|
69
69
|
# Whether to complete flag values
|
70
|
-
# @return [
|
70
|
+
# @return [true,false]
|
71
71
|
#
|
72
72
|
def complete_flag_values?
|
73
73
|
# Source available in the toys-core gem
|
@@ -99,7 +99,7 @@ module Toys
|
|
99
99
|
#
|
100
100
|
# The following settings are supported:
|
101
101
|
#
|
102
|
-
# * `propagate_helper_methods` (
|
102
|
+
# * `propagate_helper_methods` (_boolean_) - Whether subtools should
|
103
103
|
# inherit methods defined by parent tools. Defaults to `false`.
|
104
104
|
#
|
105
105
|
class Settings < ::Toys::Settings
|
@@ -302,19 +302,33 @@ module Toys
|
|
302
302
|
attr_reader :completion
|
303
303
|
|
304
304
|
##
|
305
|
-
# The
|
305
|
+
# The run handler.
|
306
306
|
#
|
307
|
-
#
|
308
|
-
#
|
309
|
-
#
|
307
|
+
# This handler is called to run the tool. Normally it is a method name,
|
308
|
+
# represented by a symbol. (The default is `:run`.) It can be set to a
|
309
|
+
# different method name, or to a proc that will be called with `self` set
|
310
|
+
# to the tool context. Either way, it takes no arguments. The run handler
|
311
|
+
# can also be explicitly set to `nil` indicating a non-runnable tool;
|
312
|
+
# however, typically a tool is made non-runnable simply by leaving the run
|
313
|
+
# handler set to `:run` and not defining the method.
|
310
314
|
#
|
311
|
-
|
315
|
+
# @return [Proc] if the run handler is defined as a Proc
|
316
|
+
# @return [Symbol] if the run handler is defined as a method
|
317
|
+
# @return [nil] if the tool is explicitly made non-runnable
|
318
|
+
#
|
319
|
+
attr_reader :run_handler
|
312
320
|
|
313
321
|
##
|
314
322
|
# The usage error handler.
|
315
323
|
#
|
316
|
-
#
|
317
|
-
#
|
324
|
+
# This handler is called when at least one usage error is detected during
|
325
|
+
# argument parsing, and is called instead of the `run` method. It can be
|
326
|
+
# specified as a Proc, or a Symbol indicating a method to call. It
|
327
|
+
# optionally takes an array of {Toys::ArgParser::UsageError} as the sole
|
328
|
+
# argument.
|
329
|
+
#
|
330
|
+
# @return [Proc] if the usage error handler is defined as a Proc
|
331
|
+
# @return [Symbol] if the user error handler is defined as a method
|
318
332
|
# @return [nil] if there is no usage error handler
|
319
333
|
#
|
320
334
|
attr_reader :usage_error_handler
|
@@ -346,9 +360,37 @@ module Toys
|
|
346
360
|
# Source available in the toys-core gem
|
347
361
|
end
|
348
362
|
|
363
|
+
##
|
364
|
+
# Return the signal handler for the given signal.
|
365
|
+
#
|
366
|
+
# This handler is called when the given signal is received, immediately
|
367
|
+
# taking over the execution as if it were the new run handler. The signal
|
368
|
+
# handler can be specified as a Proc, or a Symbol indicating a method to
|
369
|
+
# call. It optionally takes the `SignalException` as the sole argument.
|
370
|
+
#
|
371
|
+
# @param signal [Integer,String,Symbol] The signal number or name
|
372
|
+
# @return [Proc] if the signal handler is defined as a Proc
|
373
|
+
# @return [Symbol] if the signal handler is defined as a method
|
374
|
+
# @return [nil] if there is no handler for the given signal
|
375
|
+
#
|
376
|
+
def signal_handler(signal)
|
377
|
+
# Source available in the toys-core gem
|
378
|
+
end
|
379
|
+
|
380
|
+
##
|
381
|
+
# Return the interrupt handler. This is equivalent to `signal_handler(2)`.
|
382
|
+
#
|
383
|
+
# @return [Proc] if the interrupt signal handler is defined as a Proc
|
384
|
+
# @return [Symbol] if the interrupt signal handler is defined as a method
|
385
|
+
# @return [nil] if there is no handler for the interrupt signals
|
386
|
+
#
|
387
|
+
def interrupt_handler
|
388
|
+
# Source available in the toys-core gem
|
389
|
+
end
|
390
|
+
|
349
391
|
##
|
350
392
|
# Returns true if this tool is a root tool.
|
351
|
-
# @return [
|
393
|
+
# @return [true,false]
|
352
394
|
#
|
353
395
|
def root?
|
354
396
|
# Source available in the toys-core gem
|
@@ -356,23 +398,35 @@ module Toys
|
|
356
398
|
|
357
399
|
##
|
358
400
|
# Returns true if this tool is marked as runnable.
|
359
|
-
# @return [
|
401
|
+
# @return [true,false]
|
360
402
|
#
|
361
403
|
def runnable?
|
362
404
|
# Source available in the toys-core gem
|
363
405
|
end
|
364
406
|
|
365
407
|
##
|
366
|
-
# Returns true if this tool handles interrupts.
|
367
|
-
#
|
408
|
+
# Returns true if this tool handles interrupts. This is equivalent to
|
409
|
+
# `handles_signal?(2)`.
|
410
|
+
#
|
411
|
+
# @return [true,false]
|
368
412
|
#
|
369
413
|
def handles_interrupts?
|
370
414
|
# Source available in the toys-core gem
|
371
415
|
end
|
372
416
|
|
417
|
+
##
|
418
|
+
# Returns true if this tool handles the given signal.
|
419
|
+
#
|
420
|
+
# @param signal [Integer,String,Symbol] The signal number or name
|
421
|
+
# @return [true,false]
|
422
|
+
#
|
423
|
+
def handles_signal?(signal)
|
424
|
+
# Source available in the toys-core gem
|
425
|
+
end
|
426
|
+
|
373
427
|
##
|
374
428
|
# Returns true if this tool handles usage errors.
|
375
|
-
# @return [
|
429
|
+
# @return [true,false]
|
376
430
|
#
|
377
431
|
def handles_usage_errors?
|
378
432
|
# Source available in the toys-core gem
|
@@ -380,7 +434,7 @@ module Toys
|
|
380
434
|
|
381
435
|
##
|
382
436
|
# Returns true if this tool has at least one included module.
|
383
|
-
# @return [
|
437
|
+
# @return [true,false]
|
384
438
|
#
|
385
439
|
def includes_modules?
|
386
440
|
# Source available in the toys-core gem
|
@@ -388,7 +442,7 @@ module Toys
|
|
388
442
|
|
389
443
|
##
|
390
444
|
# Returns true if there is a specific description set for this tool.
|
391
|
-
# @return [
|
445
|
+
# @return [true,false]
|
392
446
|
#
|
393
447
|
def includes_description?
|
394
448
|
# Source available in the toys-core gem
|
@@ -397,7 +451,7 @@ module Toys
|
|
397
451
|
##
|
398
452
|
# Returns true if at least one flag or positional argument is defined
|
399
453
|
# for this tool.
|
400
|
-
# @return [
|
454
|
+
# @return [true,false]
|
401
455
|
#
|
402
456
|
def includes_arguments?
|
403
457
|
# Source available in the toys-core gem
|
@@ -405,7 +459,7 @@ module Toys
|
|
405
459
|
|
406
460
|
##
|
407
461
|
# Returns true if this tool has any definition information.
|
408
|
-
# @return [
|
462
|
+
# @return [true,false]
|
409
463
|
#
|
410
464
|
def includes_definition?
|
411
465
|
# Source available in the toys-core gem
|
@@ -413,7 +467,7 @@ module Toys
|
|
413
467
|
|
414
468
|
##
|
415
469
|
# Returns true if this tool's definition has been finished and is locked.
|
416
|
-
# @return [
|
470
|
+
# @return [true,false]
|
417
471
|
#
|
418
472
|
def definition_finished?
|
419
473
|
# Source available in the toys-core gem
|
@@ -421,7 +475,7 @@ module Toys
|
|
421
475
|
|
422
476
|
##
|
423
477
|
# Returns true if this tool has disabled argument parsing.
|
424
|
-
# @return [
|
478
|
+
# @return [true,false]
|
425
479
|
#
|
426
480
|
def argument_parsing_disabled?
|
427
481
|
# Source available in the toys-core gem
|
@@ -429,7 +483,7 @@ module Toys
|
|
429
483
|
|
430
484
|
##
|
431
485
|
# Returns true if this tool enforces flags before args.
|
432
|
-
# @return [
|
486
|
+
# @return [true,false]
|
433
487
|
#
|
434
488
|
def flags_before_args_enforced?
|
435
489
|
# Source available in the toys-core gem
|
@@ -437,7 +491,7 @@ module Toys
|
|
437
491
|
|
438
492
|
##
|
439
493
|
# Returns true if this tool requires exact flag matches.
|
440
|
-
# @return [
|
494
|
+
# @return [true,false]
|
441
495
|
#
|
442
496
|
def exact_flag_match_required?
|
443
497
|
# Source available in the toys-core gem
|
@@ -648,7 +702,7 @@ module Toys
|
|
648
702
|
# Enforce that flags must come before args for this tool.
|
649
703
|
# You may disable enforcement by passoing `false` for the state.
|
650
704
|
#
|
651
|
-
# @param state [
|
705
|
+
# @param state [true,false]
|
652
706
|
# @return [self]
|
653
707
|
#
|
654
708
|
def enforce_flags_before_args(state = true)
|
@@ -659,7 +713,7 @@ module Toys
|
|
659
713
|
# Require that flags must match exactly. (If false, flags can match an
|
660
714
|
# unambiguous substring.)
|
661
715
|
#
|
662
|
-
# @param state [
|
716
|
+
# @param state [true,false]
|
663
717
|
# @return [self]
|
664
718
|
#
|
665
719
|
def require_exact_flag_match(state = true)
|
@@ -686,10 +740,10 @@ module Toys
|
|
686
740
|
# formats. Defaults to the empty array.
|
687
741
|
# @param name [String,Symbol,nil] The name of the group, or nil for no
|
688
742
|
# name.
|
689
|
-
# @param report_collisions [
|
743
|
+
# @param report_collisions [true,false] If `true`, raise an exception if a
|
690
744
|
# the given name is already taken. If `false`, ignore. Default is
|
691
745
|
# `true`.
|
692
|
-
# @param prepend [
|
746
|
+
# @param prepend [true,false] If `true`, prepend rather than append the
|
693
747
|
# group to the list. Default is `false`.
|
694
748
|
# @return [self]
|
695
749
|
#
|
@@ -733,7 +787,7 @@ module Toys
|
|
733
787
|
# @param complete_values [Object] A specifier for shell tab completion
|
734
788
|
# for flag values associated with this flag. Pass any spec
|
735
789
|
# recognized by {Toys::Completion.create}.
|
736
|
-
# @param report_collisions [
|
790
|
+
# @param report_collisions [true,false] Raise an exception if a flag is
|
737
791
|
# requested that is already in use or marked as disabled. Default is
|
738
792
|
# true.
|
739
793
|
# @param group [Toys::FlagGroup,String,Symbol,nil] Group for
|
@@ -860,26 +914,56 @@ module Toys
|
|
860
914
|
end
|
861
915
|
|
862
916
|
##
|
863
|
-
# Set the run handler
|
917
|
+
# Set the run handler.
|
864
918
|
#
|
865
|
-
#
|
919
|
+
# This handler is called to run the tool. Normally it is a method name,
|
920
|
+
# represented by a symbol. (The default is `:run`.) It can be set to a
|
921
|
+
# different method name, or to a proc that will be called with `self` set
|
922
|
+
# to the tool context. Either way, it takes no arguments. The run handler
|
923
|
+
# can also be explicitly set to `nil` indicating a non-runnable tool;
|
924
|
+
# however, typically a tool is made non-runnable simply by leaving the run
|
925
|
+
# handler set to `:run` and not defining the method.
|
866
926
|
#
|
867
|
-
|
927
|
+
# @param handler [Proc,Symbol,nil] the run handler
|
928
|
+
#
|
929
|
+
def run_handler=(handler)
|
868
930
|
# Source available in the toys-core gem
|
869
931
|
end
|
870
932
|
|
871
933
|
##
|
872
|
-
# Set the interrupt handler.
|
934
|
+
# Set the interrupt handler. This is equivalent to calling
|
935
|
+
# {#set_signal_handler} for the `SIGINT` signal.
|
873
936
|
#
|
874
|
-
# @param handler [Proc,Symbol] The interrupt handler
|
937
|
+
# @param handler [Proc,Symbol] The interrupt signal handler
|
875
938
|
#
|
876
939
|
def interrupt_handler=(handler)
|
877
940
|
# Source available in the toys-core gem
|
878
941
|
end
|
879
942
|
|
943
|
+
##
|
944
|
+
# Set the handler for the given signal.
|
945
|
+
#
|
946
|
+
# This handler is called when the given signal is received, immediately
|
947
|
+
# taking over the execution as if it were the new `run` method. The signal
|
948
|
+
# handler can be specified as a Proc, or a Symbol indicating a method to
|
949
|
+
# call. It optionally takes the `SignalException` as the sole argument.
|
950
|
+
#
|
951
|
+
# @param signal [Integer,String,Symbol] The signal number or name
|
952
|
+
# @param handler [Proc,Symbol] The signal handler
|
953
|
+
#
|
954
|
+
def set_signal_handler(signal, handler)
|
955
|
+
# Source available in the toys-core gem
|
956
|
+
end
|
957
|
+
|
880
958
|
##
|
881
959
|
# Set the usage error handler.
|
882
960
|
#
|
961
|
+
# This handler is called when at least one usage error is detected during
|
962
|
+
# argument parsing, and is called instead of the `run` method. It can be
|
963
|
+
# specified as a Proc, or a Symbol indicating a method to call. It
|
964
|
+
# optionally takes an array of {Toys::ArgParser::UsageError} as the sole
|
965
|
+
# argument.
|
966
|
+
#
|
883
967
|
# @param handler [Proc,Symbol] The usage error handler
|
884
968
|
#
|
885
969
|
def usage_error_handler=(handler)
|
@@ -12,6 +12,27 @@ module Toys
|
|
12
12
|
# This class is not loaded by default. Before using it directly, you should
|
13
13
|
# `require "toys/utils/exec"`
|
14
14
|
#
|
15
|
+
# ### The exec service
|
16
|
+
#
|
17
|
+
# The main entrypoint class is this one, {Toys::Utils::Exec}. It's a
|
18
|
+
# "service" object that provides functionality, primarily methods that
|
19
|
+
# spawn processes. Create it like any object:
|
20
|
+
#
|
21
|
+
# require "toys/utils/exec"
|
22
|
+
# exec_service = Toys::Utils::Exec.new
|
23
|
+
#
|
24
|
+
# There are two "primitive" functions: {#exec} and {#exec_proc}. The {#exec}
|
25
|
+
# method spawns an operating system process specified by an executable and
|
26
|
+
# a set of arguments. The {#exec_proc} method takes a `Proc` and forks a
|
27
|
+
# Ruby process. Both of these can be heavily configured with stream
|
28
|
+
# handling, result handling, and numerous other options described below.
|
29
|
+
# The class also provides convenience methods for common cases such as
|
30
|
+
# spawning a Ruby process, spawning a shell script, or capturing output.
|
31
|
+
#
|
32
|
+
# The exec service class also stores default configuration that it applies
|
33
|
+
# to processes it spawns. You can set these defaults when constructing the
|
34
|
+
# service class, or at any time by calling {#configure_defaults}.
|
35
|
+
#
|
15
36
|
# ### Controlling processes
|
16
37
|
#
|
17
38
|
# A process can be started in the *foreground* or the *background*. If you
|
@@ -20,7 +41,7 @@ module Toys
|
|
20
41
|
# If you start a background process, its streams will be redirected to null
|
21
42
|
# by default, and control will be returned to you immediately.
|
22
43
|
#
|
23
|
-
#
|
44
|
+
# While a process is running, you can control it using a
|
24
45
|
# {Toys::Utils::Exec::Controller} object. Use a controller to interact with
|
25
46
|
# the process's input and output streams, send it signals, or wait for it
|
26
47
|
# to complete.
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module Toys
|
2
|
+
module Utils
|
3
|
+
##
|
4
|
+
# **_Defined in the toys-core gem_**
|
5
|
+
#
|
6
|
+
# An object that implements standard UI elements, such as error reports and
|
7
|
+
# logging, as provided by the `toys` command line. Specifically, it
|
8
|
+
# implements pretty formatting of log entries and stack traces, and renders
|
9
|
+
# using ANSI coloring where available via {Toys::Utils::Terminal}.
|
10
|
+
#
|
11
|
+
# This object can be used to implement `toys`-style behavior when creating
|
12
|
+
# a CLI object. For example:
|
13
|
+
#
|
14
|
+
# require "toys/utils/standard_ui"
|
15
|
+
# ui = Toys::Utils::StandardUI.new
|
16
|
+
# cli = Toys::CLI.new(**ui.cli_args)
|
17
|
+
#
|
18
|
+
class StandardUI
|
19
|
+
##
|
20
|
+
# Create a Standard UI.
|
21
|
+
#
|
22
|
+
# By default, all output is written to `$stderr`, and will share a single
|
23
|
+
# {Toys::Utils::Terminal} object, allowing multiple tools and/or threads
|
24
|
+
# to interleave messages without interrupting one another.
|
25
|
+
#
|
26
|
+
# @param output [IO,Toys::Utils::Terminal] Where to write output. You can
|
27
|
+
# pass a terminal object, or an IO stream that will be wrapped in a
|
28
|
+
# terminal output. Default is `$stderr`.
|
29
|
+
#
|
30
|
+
def initialize(output: nil)
|
31
|
+
# Source available in the toys-core gem
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# The terminal underlying this UI
|
36
|
+
#
|
37
|
+
# @return [Toys::Utils::Terminal]
|
38
|
+
#
|
39
|
+
attr_reader :terminal
|
40
|
+
|
41
|
+
##
|
42
|
+
# A hash that maps severities to styles recognized by
|
43
|
+
# {Toys::Utils::Terminal}. Used to style the header for each log entry.
|
44
|
+
# This hash can be modified in place to adjust the behavior of loggers
|
45
|
+
# created by this UI.
|
46
|
+
#
|
47
|
+
# @return [Hash{String => Array<Symbol>}]
|
48
|
+
#
|
49
|
+
attr_reader :log_header_severity_styles
|
50
|
+
|
51
|
+
##
|
52
|
+
# Convenience method that returns a hash of arguments that can be passed
|
53
|
+
# to the {Toys::CLI} constructor. Includes the `:error_handler` and
|
54
|
+
# `:logger_factory` arguments.
|
55
|
+
#
|
56
|
+
# @return [Hash]
|
57
|
+
#
|
58
|
+
def cli_args
|
59
|
+
# Source available in the toys-core gem
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Returns an error handler conforming to the `:error_handler` argument to
|
64
|
+
# the {Toys::CLI} constructor. Specifically, it returns the
|
65
|
+
# {#error_handler_impl} method as a proc.
|
66
|
+
#
|
67
|
+
# @return [Proc]
|
68
|
+
#
|
69
|
+
def error_handler
|
70
|
+
# Source available in the toys-core gem
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Returns a logger factory conforming to the `:logger_factory` argument
|
75
|
+
# to the {Toys::CLI} constructor. Specifically, it returns the
|
76
|
+
# {#logger_factory_impl} method as a proc.
|
77
|
+
#
|
78
|
+
# @return [Proc]
|
79
|
+
#
|
80
|
+
def logger_factory
|
81
|
+
# Source available in the toys-core gem
|
82
|
+
end
|
83
|
+
|
84
|
+
##
|
85
|
+
# Implementation of the error handler. As dictated by the error handler
|
86
|
+
# specification in {Toys::CLI}, this must take a {Toys::ContextualError}
|
87
|
+
# as an argument, and return an exit code.
|
88
|
+
#
|
89
|
+
# The base implementation uses {#display_error_notice} and
|
90
|
+
# {#display_signal_notice} to print an appropriate message to the UI's
|
91
|
+
# terminal, and uses {#exit_code_for} to determine the correct exit code.
|
92
|
+
# Any of those methods can be overridden by a subclass to alter their
|
93
|
+
# behavior, or this main implementation method can be overridden to
|
94
|
+
# change the overall behavior.
|
95
|
+
#
|
96
|
+
# @param error [Toys::ContextualError] The error received
|
97
|
+
# @return [Integer] The exit code
|
98
|
+
#
|
99
|
+
def error_handler_impl(error)
|
100
|
+
# Source available in the toys-core gem
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# Implementation of the logger factory. As dictated by the logger factory
|
105
|
+
# specification in {Toys::CLI}, this must take a {Toys::ToolDefinition}
|
106
|
+
# as an argument, and return a `Logger`.
|
107
|
+
#
|
108
|
+
# The base implementation returns a logger that writes to the UI's
|
109
|
+
# terminal, using {#logger_formatter_impl} as the formatter. It sets the
|
110
|
+
# level to `Logger::WARN` by default. Either this method or the helper
|
111
|
+
# methods can be overridden to change this behavior.
|
112
|
+
#
|
113
|
+
# @param _tool {Toys::ToolDefinition} The tool definition of the tool to
|
114
|
+
# be executed
|
115
|
+
# @return [Logger]
|
116
|
+
#
|
117
|
+
def logger_factory_impl(_tool)
|
118
|
+
# Source available in the toys-core gem
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Returns an exit code appropriate for the given exception. Currently,
|
123
|
+
# the logic interprets signals (returning the convention of 128 + signo),
|
124
|
+
# usage errors (returning the conventional value of 2), and tool not
|
125
|
+
# runnable errors (returning the conventional value of 126), and defaults
|
126
|
+
# to 1 for all other error types.
|
127
|
+
#
|
128
|
+
# This method is used by {#error_handler_impl} and can be overridden to
|
129
|
+
# change its behavior.
|
130
|
+
#
|
131
|
+
# @param error [Exception] The exception raised. This method expects the
|
132
|
+
# original exception, rather than a ContextualError.
|
133
|
+
# @return [Integer] The appropriate exit code
|
134
|
+
#
|
135
|
+
def exit_code_for(error)
|
136
|
+
# Source available in the toys-core gem
|
137
|
+
end
|
138
|
+
|
139
|
+
##
|
140
|
+
# Displays a default output for a signal received.
|
141
|
+
#
|
142
|
+
# This method is used by {#error_handler_impl} and can be overridden to
|
143
|
+
# change its behavior.
|
144
|
+
#
|
145
|
+
# @param error [SignalException]
|
146
|
+
#
|
147
|
+
def display_signal_notice(error)
|
148
|
+
# Source available in the toys-core gem
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Displays a default output for an error. Displays the error, the
|
153
|
+
# backtrace, and contextual information regarding what tool was run and
|
154
|
+
# where in its code the error occurred.
|
155
|
+
#
|
156
|
+
# This method is used by {#error_handler_impl} and can be overridden to
|
157
|
+
# change its behavior.
|
158
|
+
#
|
159
|
+
# @param error [Toys::ContextualError]
|
160
|
+
#
|
161
|
+
def display_error_notice(error)
|
162
|
+
# Source available in the toys-core gem
|
163
|
+
end
|
164
|
+
|
165
|
+
##
|
166
|
+
# Implementation of the formatter used by loggers created by this UI's
|
167
|
+
# logger factory. This interface is defined by the standard `Logger`
|
168
|
+
# class.
|
169
|
+
#
|
170
|
+
# This method can be overridden to change the behavior of loggers created
|
171
|
+
# by this UI.
|
172
|
+
#
|
173
|
+
# @param severity [String]
|
174
|
+
# @param time [Time]
|
175
|
+
# @param _progname [String]
|
176
|
+
# @param msg [Object]
|
177
|
+
# @return [String]
|
178
|
+
#
|
179
|
+
def logger_formatter_impl(severity, time, _progname, msg)
|
180
|
+
# Source available in the toys-core gem
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
data/core-docs/toys-core.rb
CHANGED
@@ -12,12 +12,53 @@
|
|
12
12
|
# This module contains the command line framework underlying Toys. It can be
|
13
13
|
# used to create command line executables using the Toys DSL and classes.
|
14
14
|
#
|
15
|
+
# ## Common starting points
|
16
|
+
#
|
17
|
+
# Some of the most commonly needed class documentation is listed below:
|
18
|
+
#
|
19
|
+
# * For information on the DSL used to write tools, start with
|
20
|
+
# {Toys::DSL::Tool}.
|
21
|
+
# * The base class for tool runtime (i.e. that defines the basic methods
|
22
|
+
# available to a tool's implementation) is {Toys::Context}.
|
23
|
+
# * For information on writing mixins, see {Toys::Mixin}.
|
24
|
+
# * For information on writing templates, see {Toys::Template}.
|
25
|
+
# * For information on writing acceptors, see {Toys::Acceptor}.
|
26
|
+
# * For information on writing custom shell completions, see {Toys::Completion}.
|
27
|
+
# * Standard mixins are defined under the {Toys::StandardMixins} module.
|
28
|
+
# * Various utilities are defined under {Toys::Utils}. Some of these serve as
|
29
|
+
# the implementations of corresponding mixins.
|
30
|
+
# * The main entrypoint for the command line framework is {Toys::CLI}.
|
31
|
+
#
|
32
|
+
# Other important internal classes are listed below.
|
33
|
+
#
|
34
|
+
# * The definition of a tool is represented by {Toys::ToolDefinition} along
|
35
|
+
# the helpers {Toys::Flag}, {Toys::PositionalArg}, and {Toys::FlagGroup}.
|
36
|
+
# * Argument parsing is implemented by {Toys::ArgParser}.
|
37
|
+
# * The process of finding and loading a tool definition given a tool name, is
|
38
|
+
# implemented by {Toys::Loader}.
|
39
|
+
# * Text wrapping is handled by {Toys::WrappableString}.
|
40
|
+
# * The settings system is implemented by {Toys::Settings}.
|
41
|
+
#
|
15
42
|
module Toys
|
16
43
|
##
|
17
44
|
# **_Defined in the toys-core gem_**
|
18
45
|
#
|
19
46
|
# Namespace for DSL classes. These classes provide the directives that can be
|
20
|
-
# used in configuration files.
|
47
|
+
# used in configuration files.
|
48
|
+
#
|
49
|
+
# DSL directives that can appear at the top level of Toys files and tool
|
50
|
+
# blocks are defined by the {Toys::DSL::Tool} module.
|
51
|
+
#
|
52
|
+
# Directives that can appear within a block passed to {Toys::DSL::Tool#flag}
|
53
|
+
# are defined by the {Toys::DSL::Flag} class.
|
54
|
+
#
|
55
|
+
# Directives that can appear within a {Toys::DSL::Tool#flag_group} block or
|
56
|
+
# any of its related directives, are defined by the {Toys::DSL::FlagGroup}
|
57
|
+
# class.
|
58
|
+
#
|
59
|
+
# Directives that can appear within a {Toys::DSL::Tool#required_arg},
|
60
|
+
# {Toys::DSL::Tool#optional_arg}, or {Toys::DSL::Tool#remaining_args} block,
|
61
|
+
# are defined by the {Toys::DSL::PositionalArg} class.
|
21
62
|
#
|
22
63
|
module DSL
|
23
64
|
end
|
@@ -27,6 +68,9 @@ module Toys
|
|
27
68
|
#
|
28
69
|
# Namespace for standard middleware classes.
|
29
70
|
#
|
71
|
+
# These middleware are provided by Toys-Core and can be referenced by name
|
72
|
+
# when creating a {Toys::CLI}.
|
73
|
+
#
|
30
74
|
module StandardMiddleware
|
31
75
|
end
|
32
76
|
|
@@ -35,6 +79,9 @@ module Toys
|
|
35
79
|
#
|
36
80
|
# Namespace for standard mixin classes.
|
37
81
|
#
|
82
|
+
# These mixins are provided by Toys-Core and can be included by name by
|
83
|
+
# passing a symbol to {Toys::DSL::Tool#include}.
|
84
|
+
#
|
38
85
|
module StandardMixins
|
39
86
|
end
|
40
87
|
|
@@ -44,8 +91,9 @@ module Toys
|
|
44
91
|
# Namespace for common utility classes.
|
45
92
|
#
|
46
93
|
# These classes are not loaded by default, and must be required explicitly.
|
47
|
-
# For example, before using {Toys::Utils::Exec}, you must
|
48
|
-
#
|
94
|
+
# For example, before using {Toys::Utils::Exec}, you must:
|
95
|
+
#
|
96
|
+
# require "toys/utils/exec"
|
49
97
|
#
|
50
98
|
module Utils
|
51
99
|
end
|