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
data/core-docs/toys/dsl/tool.rb
CHANGED
@@ -3,7 +3,7 @@ module Toys
|
|
3
3
|
##
|
4
4
|
# **_Defined in the toys-core gem_**
|
5
5
|
#
|
6
|
-
# This
|
6
|
+
# This module defines the DSL for a Toys configuration file.
|
7
7
|
#
|
8
8
|
# A Toys configuration defines one or more named tools. It provides syntax
|
9
9
|
# for setting the description, defining flags and arguments, specifying
|
@@ -25,6 +25,9 @@ module Toys
|
|
25
25
|
# end
|
26
26
|
# end
|
27
27
|
#
|
28
|
+
# The DSL directives `tool`, `desc`, `optional_arg`, and others are defined
|
29
|
+
# in this module.
|
30
|
+
#
|
28
31
|
# Now you can execute it using:
|
29
32
|
#
|
30
33
|
# toys greet
|
@@ -81,8 +84,8 @@ module Toys
|
|
81
84
|
# ### Example
|
82
85
|
#
|
83
86
|
# The following example creates an acceptor named "hex" that is defined
|
84
|
-
# via a regular expression. It
|
85
|
-
# a flag.
|
87
|
+
# via a regular expression. It uses the acceptor to validate values
|
88
|
+
# passed to a flag.
|
86
89
|
#
|
87
90
|
# tool "example" do
|
88
91
|
# acceptor "hex", /[0-9a-fA-F]+/, type_desc: "hex numbers"
|
@@ -151,16 +154,21 @@ module Toys
|
|
151
154
|
#
|
152
155
|
# A template is an object that generates DSL directives. You can use it
|
153
156
|
# to build "prefabricated" tools, and then instantiate them in your Toys
|
154
|
-
# files.
|
155
|
-
#
|
156
|
-
#
|
157
|
-
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
#
|
161
|
-
#
|
162
|
-
#
|
163
|
-
#
|
157
|
+
# files.
|
158
|
+
#
|
159
|
+
# A template is an object that defines an `expansion` procedure. This
|
160
|
+
# procedure generates the DSL directives implemented by the template. The
|
161
|
+
# template object typically also includes attributes that are used to
|
162
|
+
# configure the expansion.
|
163
|
+
#
|
164
|
+
# The simplest way to define a template is to pass a block to the
|
165
|
+
# {#template} directive. In the block, define an `initialize` method that
|
166
|
+
# accepts any arguments that may be passed to the template when it is
|
167
|
+
# instantiated and are used to configure the template. Define
|
168
|
+
# `attr_reader`s or other methods to make this configuration accessible
|
169
|
+
# from the object. Then define an `on_expand` block that implements the
|
170
|
+
# template's expansion. The template object is passed as an object to the
|
171
|
+
# `on_expand` block.
|
164
172
|
#
|
165
173
|
# Alternately, you can create a template class separately and pass it
|
166
174
|
# directly. See {Toys::Template} for details on creating a template
|
@@ -168,7 +176,9 @@ module Toys
|
|
168
176
|
#
|
169
177
|
# ### Example
|
170
178
|
#
|
171
|
-
# The following example creates and uses a simple template.
|
179
|
+
# The following example creates and uses a simple template. The template
|
180
|
+
# defines a tool, with a configurable name, that simply prints out a
|
181
|
+
# configurable message.
|
172
182
|
#
|
173
183
|
# template "hello-generator" do
|
174
184
|
# def initialize(name, message)
|
@@ -176,7 +186,7 @@ module Toys
|
|
176
186
|
# @message = message
|
177
187
|
# end
|
178
188
|
# attr_reader :name, :message
|
179
|
-
#
|
189
|
+
# on_expand do |template|
|
180
190
|
# tool template.name do
|
181
191
|
# to_run do
|
182
192
|
# puts template.message
|
@@ -875,6 +885,12 @@ module Toys
|
|
875
885
|
# arguments.) Defaults to the empty array.
|
876
886
|
# @param display_name [String] A display name for this flag, used in help
|
877
887
|
# text and error messages.
|
888
|
+
# @param add_method [true,false,nil] Whether to add a method for this
|
889
|
+
# flag. If omitted or set to nil, uses the default behavior, which
|
890
|
+
# adds the method if the key is a symbol representing a legal method
|
891
|
+
# name that starts with a letter and does not override any public
|
892
|
+
# method in the Ruby Object class or collide with any method directly
|
893
|
+
# defined in the tool class.
|
878
894
|
# @param block [Proc] Configures the flag. See {Toys::DSL::Flag} for the
|
879
895
|
# directives that can be called in this block.
|
880
896
|
# @return [self]
|
@@ -883,7 +899,7 @@ module Toys
|
|
883
899
|
accept: nil, default: nil, handler: nil,
|
884
900
|
complete_flags: nil, complete_values: nil,
|
885
901
|
report_collisions: true, group: nil,
|
886
|
-
desc: nil, long_desc: nil, display_name: nil,
|
902
|
+
desc: nil, long_desc: nil, display_name: nil, add_method: nil,
|
887
903
|
&block)
|
888
904
|
# Source available in the toys-core gem
|
889
905
|
end
|
@@ -936,6 +952,12 @@ module Toys
|
|
936
952
|
# a description of the allowed formats. (But note that this param
|
937
953
|
# takes an Array of description lines, rather than a series of
|
938
954
|
# arguments.) Defaults to the empty array.
|
955
|
+
# @param add_method [true,false,nil] Whether to add a method for this
|
956
|
+
# argument. If omitted or set to nil, uses the default behavior,
|
957
|
+
# which adds the method if the key is a symbol representing a legal
|
958
|
+
# method name that starts with a letter and does not override any
|
959
|
+
# public method in the Ruby Object class or collide with any method
|
960
|
+
# directly defined in the tool class.
|
939
961
|
# @param block [Proc] Configures the positional argument. See
|
940
962
|
# {Toys::DSL::PositionalArg} for the directives that can be called in
|
941
963
|
# this block.
|
@@ -943,7 +965,7 @@ module Toys
|
|
943
965
|
#
|
944
966
|
def required_arg(key,
|
945
967
|
accept: nil, complete: nil, display_name: nil,
|
946
|
-
desc: nil, long_desc: nil,
|
968
|
+
desc: nil, long_desc: nil, add_method: nil,
|
947
969
|
&block)
|
948
970
|
# Source available in the toys-core gem
|
949
971
|
end
|
@@ -1002,6 +1024,12 @@ module Toys
|
|
1002
1024
|
# a description of the allowed formats. (But note that this param
|
1003
1025
|
# takes an Array of description lines, rather than a series of
|
1004
1026
|
# arguments.) Defaults to the empty array.
|
1027
|
+
# @param add_method [true,false,nil] Whether to add a method for this
|
1028
|
+
# argument. If omitted or set to nil, uses the default behavior,
|
1029
|
+
# which adds the method if the key is a symbol representing a legal
|
1030
|
+
# method name that starts with a letter and does not override any
|
1031
|
+
# public method in the Ruby Object class or collide with any method
|
1032
|
+
# directly defined in the tool class.
|
1005
1033
|
# @param block [Proc] Configures the positional argument. See
|
1006
1034
|
# {Toys::DSL::PositionalArg} for the directives that can be called in
|
1007
1035
|
# this block.
|
@@ -1009,7 +1037,7 @@ module Toys
|
|
1009
1037
|
#
|
1010
1038
|
def optional_arg(key,
|
1011
1039
|
default: nil, accept: nil, complete: nil, display_name: nil,
|
1012
|
-
desc: nil, long_desc: nil,
|
1040
|
+
desc: nil, long_desc: nil, add_method: nil,
|
1013
1041
|
&block)
|
1014
1042
|
# Source available in the toys-core gem
|
1015
1043
|
end
|
@@ -1068,6 +1096,12 @@ module Toys
|
|
1068
1096
|
# a description of the allowed formats. (But note that this param
|
1069
1097
|
# takes an Array of description lines, rather than a series of
|
1070
1098
|
# arguments.) Defaults to the empty array.
|
1099
|
+
# @param add_method [true,false,nil] Whether to add a method for these
|
1100
|
+
# arguments. If omitted or set to nil, uses the default behavior,
|
1101
|
+
# which adds the method if the key is a symbol representing a legal
|
1102
|
+
# method name that starts with a letter and does not override any
|
1103
|
+
# public method in the Ruby Object class or collide with any method
|
1104
|
+
# directly defined in the tool class.
|
1071
1105
|
# @param block [Proc] Configures the positional argument. See
|
1072
1106
|
# {Toys::DSL::PositionalArg} for the directives that can be called in
|
1073
1107
|
# this block.
|
@@ -1075,14 +1109,14 @@ module Toys
|
|
1075
1109
|
#
|
1076
1110
|
def remaining_args(key,
|
1077
1111
|
default: [], accept: nil, complete: nil, display_name: nil,
|
1078
|
-
desc: nil, long_desc: nil,
|
1112
|
+
desc: nil, long_desc: nil, add_method: nil,
|
1079
1113
|
&block)
|
1080
1114
|
# Source available in the toys-core gem
|
1081
1115
|
end
|
1082
1116
|
alias remaining remaining_args
|
1083
1117
|
|
1084
1118
|
##
|
1085
|
-
# Set
|
1119
|
+
# Set option values statically and create helper methods.
|
1086
1120
|
#
|
1087
1121
|
# If any given key is a symbol representing a valid method name, then a
|
1088
1122
|
# helper method is automatically added to retrieve the value. Otherwise,
|
@@ -1115,7 +1149,7 @@ module Toys
|
|
1115
1149
|
end
|
1116
1150
|
|
1117
1151
|
##
|
1118
|
-
# Set
|
1152
|
+
# Set option values statically without creating helper methods.
|
1119
1153
|
#
|
1120
1154
|
# ### Example
|
1121
1155
|
#
|
@@ -1180,6 +1214,15 @@ module Toys
|
|
1180
1214
|
# This directive is mutually exclusive with any of the directives that
|
1181
1215
|
# declare arguments or flags.
|
1182
1216
|
#
|
1217
|
+
# ### Example
|
1218
|
+
#
|
1219
|
+
# tool "mytool" do
|
1220
|
+
# disable_argument_parsing
|
1221
|
+
# def run
|
1222
|
+
# puts "Arguments passed: #{args}"
|
1223
|
+
# end
|
1224
|
+
# end
|
1225
|
+
#
|
1183
1226
|
# @return [self]
|
1184
1227
|
#
|
1185
1228
|
def disable_argument_parsing
|
@@ -1249,27 +1292,53 @@ module Toys
|
|
1249
1292
|
end
|
1250
1293
|
|
1251
1294
|
##
|
1252
|
-
# Specify how to run this tool.
|
1253
|
-
# method namd `run`. Alternatively, however, you can pass a block to the
|
1254
|
-
# `to_run` method.
|
1295
|
+
# Specify how to run this tool.
|
1255
1296
|
#
|
1256
|
-
#
|
1257
|
-
#
|
1258
|
-
# {#
|
1297
|
+
# Typically the entrypoint for a tool is a method named `run`. However,
|
1298
|
+
# you can change this by passing a different method name, as a symbol, to
|
1299
|
+
# {#to_run}.
|
1259
1300
|
#
|
1260
|
-
#
|
1301
|
+
# You can also alternatively pass a block to {#to_run}. You might do this
|
1302
|
+
# if your method needs access to local variables in the lexical scope.
|
1303
|
+
# However, it is often more convenient to use {#static} to set those
|
1304
|
+
# values in the context.
|
1305
|
+
#
|
1306
|
+
# ### Examples
|
1307
|
+
#
|
1308
|
+
# # Set a different method name as the entrypoint:
|
1261
1309
|
#
|
1262
1310
|
# tool "foo" do
|
1263
|
-
#
|
1311
|
+
# to_run :foo
|
1312
|
+
# def foo
|
1313
|
+
# puts "The fool tool ran!"
|
1314
|
+
# end
|
1315
|
+
# end
|
1316
|
+
#
|
1317
|
+
# # Use a block to retain access to the enclosing lexical scope from
|
1318
|
+
# # the run method:
|
1319
|
+
#
|
1320
|
+
# tool "foo" do
|
1321
|
+
# cur_time = Time.now
|
1264
1322
|
# to_run do
|
1265
1323
|
# puts "The time at tool definition was #{cur_time}"
|
1266
1324
|
# end
|
1267
1325
|
# end
|
1268
1326
|
#
|
1269
|
-
#
|
1327
|
+
# # But the following is approximately equivalent:
|
1328
|
+
#
|
1329
|
+
# tool "foo" do
|
1330
|
+
# static :cur_time, Time.now
|
1331
|
+
# def run
|
1332
|
+
# puts "The time at tool definition was #{cur_time}"
|
1333
|
+
# end
|
1334
|
+
# end
|
1335
|
+
#
|
1336
|
+
# @param handler [Proc,Symbol,nil] The run handler as a method name
|
1337
|
+
# symbol or a proc, or nil to explicitly set as non-runnable.
|
1338
|
+
# @param block [Proc] The run handler as a block.
|
1270
1339
|
# @return [self]
|
1271
1340
|
#
|
1272
|
-
def to_run(&block)
|
1341
|
+
def to_run(handler = nil, &block)
|
1273
1342
|
# Source available in the toys-core gem
|
1274
1343
|
end
|
1275
1344
|
alias on_run to_run
|
@@ -1277,9 +1346,12 @@ module Toys
|
|
1277
1346
|
##
|
1278
1347
|
# Specify how to handle interrupts.
|
1279
1348
|
#
|
1280
|
-
# You
|
1281
|
-
#
|
1282
|
-
# Interrupt exception that
|
1349
|
+
# You can provide either a block to be called, a Proc to be called, or
|
1350
|
+
# the name of a method to be called. In each case, the block, Proc, or
|
1351
|
+
# method can optionally take one argument, the Interrupt exception that
|
1352
|
+
# was raised.
|
1353
|
+
#
|
1354
|
+
# Note: this is equivalent to `on_signal("SIGINT")`.
|
1283
1355
|
#
|
1284
1356
|
# ### Example
|
1285
1357
|
#
|
@@ -1287,7 +1359,7 @@ module Toys
|
|
1287
1359
|
# def run
|
1288
1360
|
# sleep 10
|
1289
1361
|
# end
|
1290
|
-
# on_interrupt do
|
1362
|
+
# on_interrupt do
|
1291
1363
|
# puts "I was interrupted."
|
1292
1364
|
# end
|
1293
1365
|
# end
|
@@ -1301,18 +1373,47 @@ module Toys
|
|
1301
1373
|
# Source available in the toys-core gem
|
1302
1374
|
end
|
1303
1375
|
|
1376
|
+
##
|
1377
|
+
# Specify how to handle the given signal.
|
1378
|
+
#
|
1379
|
+
# You can provide either a block to be called, a Proc to be called, or
|
1380
|
+
# the name of a method to be called. In each case, the block, Proc, or
|
1381
|
+
# method can optionally take one argument, the SignalException that was
|
1382
|
+
# raised.
|
1383
|
+
#
|
1384
|
+
# ### Example
|
1385
|
+
#
|
1386
|
+
# tool "foo" do
|
1387
|
+
# def run
|
1388
|
+
# sleep 10
|
1389
|
+
# end
|
1390
|
+
# on_signal("QUIT") do |e|
|
1391
|
+
# puts "Signal caught: #{e.signm}."
|
1392
|
+
# end
|
1393
|
+
# end
|
1394
|
+
#
|
1395
|
+
# @param signal [Integer,String,Symbol] The signal name or number
|
1396
|
+
# @param handler [Proc,Symbol,nil] The signal callback proc or method
|
1397
|
+
# name. Pass nil to disable signal handling.
|
1398
|
+
# @param block [Proc] The signal callback as a block.
|
1399
|
+
# @return [self]
|
1400
|
+
#
|
1401
|
+
def on_signal(signal, handler = nil, &block)
|
1402
|
+
# Source available in the toys-core gem
|
1403
|
+
end
|
1404
|
+
|
1304
1405
|
##
|
1305
1406
|
# Specify how to handle usage errors.
|
1306
1407
|
#
|
1307
|
-
# You
|
1308
|
-
#
|
1309
|
-
# usage errors
|
1408
|
+
# You can provide either a block to be called, a Proc to be called, or
|
1409
|
+
# the name of a method to be called. In each case, the block, Proc, or
|
1410
|
+
# method can optionally take one argument, the array of usage errors
|
1411
|
+
# reported.
|
1310
1412
|
#
|
1311
1413
|
# ### Example
|
1312
1414
|
#
|
1313
|
-
# This tool runs even if a usage error is encountered
|
1314
|
-
#
|
1315
|
-
# {Toys::Context::Key::UNMATCHED_ARGS}, and similar keys.
|
1415
|
+
# This tool runs even if a usage error is encountered, by setting the
|
1416
|
+
# `run` method as the usage error handler.
|
1316
1417
|
#
|
1317
1418
|
# tool "foo" do
|
1318
1419
|
# def run
|
@@ -1334,7 +1435,7 @@ module Toys
|
|
1334
1435
|
# Specify that the given module should be mixed into this tool, and its
|
1335
1436
|
# methods made available when running the tool.
|
1336
1437
|
#
|
1337
|
-
# You
|
1438
|
+
# You can provide either a module, the string name of a mixin that you
|
1338
1439
|
# have defined in this tool or one of its ancestors, or the symbol name
|
1339
1440
|
# of a well-known mixin.
|
1340
1441
|
#
|
@@ -1365,7 +1466,7 @@ module Toys
|
|
1365
1466
|
##
|
1366
1467
|
# Determine if the given module/mixin has already been included.
|
1367
1468
|
#
|
1368
|
-
# You
|
1469
|
+
# You can provide either a module, the string name of a mixin that you
|
1369
1470
|
# have defined in this tool or one of its ancestors, or the symbol name
|
1370
1471
|
# of a well-known mixin.
|
1371
1472
|
#
|
@@ -21,8 +21,9 @@ module Toys
|
|
21
21
|
# Generally, a middleware is a class that implements one or more of the
|
22
22
|
# methods defined in this module: {Toys::Middleware#config}, and
|
23
23
|
# {Toys::Middleware#run}. This module provides default implementations that
|
24
|
-
# do nothing, but
|
25
|
-
# only to methods they
|
24
|
+
# do nothing, but it is not required to include this module, or even to
|
25
|
+
# define both methods. Middleware objects need respond only to methods they
|
26
|
+
# care about.
|
26
27
|
#
|
27
28
|
module Middleware
|
28
29
|
##
|
data/core-docs/toys/settings.rb
CHANGED
@@ -221,7 +221,7 @@ module Toys
|
|
221
221
|
# has a parent, the parent is queried. If that parent also does not have
|
222
222
|
# a value for the field, it may query its parent in turn, and so forth.
|
223
223
|
# * If we encounter a root settings with no parent, and still no value is
|
224
|
-
# set for the field, the default is returned.
|
224
|
+
# set for the field, the default for the *original* setting is returned.
|
225
225
|
#
|
226
226
|
# Example:
|
227
227
|
#
|
@@ -5,6 +5,21 @@ module Toys
|
|
5
5
|
#
|
6
6
|
# Ensures that a bundle is installed and set up when this tool is run.
|
7
7
|
#
|
8
|
+
# This is the normal recommended way to use [bundler](https://bundler.io)
|
9
|
+
# with Toys. Including this mixin in a tool will cause Toys to ensure that
|
10
|
+
# the bundle is installed and available during tool execution. For example:
|
11
|
+
#
|
12
|
+
# tool "run-rails" do
|
13
|
+
# include :bundler
|
14
|
+
# def run
|
15
|
+
# # Note: no "bundle exec" required because Toys has already
|
16
|
+
# # installed and loaded the bundle.
|
17
|
+
# exec "rails s"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# ### Customization
|
22
|
+
#
|
8
23
|
# The following parameters can be passed when including this mixin:
|
9
24
|
#
|
10
25
|
# * `:static` (Boolean) If `true`, installs the bundle immediately, when
|
@@ -39,7 +54,7 @@ module Toys
|
|
39
54
|
# Defaults to {Toys::Utils::Gems::DEFAULT_GEMFILE_NAMES}.
|
40
55
|
#
|
41
56
|
# * `:toys_gemfile_names` (Array\<String\>) File names that are
|
42
|
-
# recognized as Gemfiles when
|
57
|
+
# recognized as Gemfiles when searching in Toys directories.
|
43
58
|
# Defaults to {DEFAULT_TOYS_GEMFILE_NAMES}.
|
44
59
|
#
|
45
60
|
# * `:on_missing` (Symbol) What to do if a needed gem is not installed.
|
@@ -3,10 +3,10 @@ module Toys
|
|
3
3
|
##
|
4
4
|
# **_Defined in the toys-core gem_**
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# in a
|
9
|
-
# process's streams.
|
6
|
+
# The `:exec` mixin provides set of helper methods for executing processes
|
7
|
+
# and subcommands. It provides shortcuts for common cases such as invoking
|
8
|
+
# a Ruby script in a subprocess or capturing output in a string. It also
|
9
|
+
# provides an interface for controlling a spawned process's streams.
|
10
10
|
#
|
11
11
|
# You can make these methods available to your tool by including the
|
12
12
|
# following directive in your tool configuration:
|
@@ -16,6 +16,25 @@ module Toys
|
|
16
16
|
# This is a frontend for {Toys::Utils::Exec}. More information is
|
17
17
|
# available in that class's documentation.
|
18
18
|
#
|
19
|
+
# ### Mixin overview
|
20
|
+
#
|
21
|
+
# The mixin provides a number of methods for spawning processes. The most
|
22
|
+
# basic are {#exec} and {#exec_proc}. The {#exec} method spawns an
|
23
|
+
# operating system process specified by an executable and a set of
|
24
|
+
# arguments. The {#exec_proc} method takes a `Proc` and forks a Ruby
|
25
|
+
# process. Both of these can be heavily configured with stream handling,
|
26
|
+
# result handling, and numerous other options described below. The mixin
|
27
|
+
# also provides convenience methods for common cases such as spawning a
|
28
|
+
# Ruby process, spawning a shell script, or capturing output.
|
29
|
+
#
|
30
|
+
# The mixin also stores default configuration that it applies to processes
|
31
|
+
# it spawns. You can change these defaults by calling {#configure_exec}.
|
32
|
+
#
|
33
|
+
# Underlying the mixin is a service object of type {Toys::Utils::Exec}.
|
34
|
+
# Normally you would use the mixin methods to access this functionality,
|
35
|
+
# but you can also retrieve the service object itself by calling
|
36
|
+
# {Toys::Context#get} with the key {Toys::StandardMixins::Exec::KEY}.
|
37
|
+
#
|
19
38
|
# ### Controlling processes
|
20
39
|
#
|
21
40
|
# A process can be started in the *foreground* or the *background*. If you
|
@@ -24,7 +43,7 @@ module Toys
|
|
24
43
|
# If you start a background process, its streams will be redirected to null
|
25
44
|
# by default, and control will be returned to you immediately.
|
26
45
|
#
|
27
|
-
#
|
46
|
+
# While a process is running, you can control it using a
|
28
47
|
# {Toys::Utils::Exec::Controller} object. Use a controller to interact with
|
29
48
|
# the process's input and output streams, send it signals, or wait for it
|
30
49
|
# to complete.
|
@@ -44,7 +63,7 @@ module Toys
|
|
44
63
|
# When running a process in the background, the controller is returned from
|
45
64
|
# the method that starts the process:
|
46
65
|
#
|
47
|
-
# controller =
|
66
|
+
# controller = exec(["git", "init"], background: true)
|
48
67
|
#
|
49
68
|
# ### Stream handling
|
50
69
|
#
|
@@ -10,11 +10,24 @@ module Toys
|
|
10
10
|
# tool DSL itself, so you can also ensure a gem is present when defining a
|
11
11
|
# tool.
|
12
12
|
#
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# ### Usage
|
14
|
+
#
|
15
|
+
# Make these methods available to your tool by including this mixin in your
|
16
|
+
# tool:
|
15
17
|
#
|
16
18
|
# include :gems
|
17
19
|
#
|
20
|
+
# You can then call the mixin method {#gem} to ensure that a gem is
|
21
|
+
# installed and in the load path. For example:
|
22
|
+
#
|
23
|
+
# tool "my_tool" do
|
24
|
+
# include :gems
|
25
|
+
# gem "nokogiri", "~> 1.15"
|
26
|
+
# def run
|
27
|
+
# # Do stuff with Nokogiri
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
#
|
18
31
|
# If you pass additional options to the include directive, those are used
|
19
32
|
# to initialize settings for the gem install process. For example:
|
20
33
|
#
|
@@ -34,7 +47,8 @@ module Toys
|
|
34
47
|
end
|
35
48
|
|
36
49
|
##
|
37
|
-
# Activate the given gem.
|
50
|
+
# Activate the given gem. If it is not present, attempt to install it (or
|
51
|
+
# inform the user to update the bundle).
|
38
52
|
#
|
39
53
|
# @param name [String] Name of the gem
|
40
54
|
# @param requirements [String...] Version requirements
|