toys 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20520c07615ed64145bf678f175e4e37835e69fe2b92c88f083b554c1902e969
4
- data.tar.gz: b3e1efd5fc4e05a620d7834361e353840579c5b4c6c555f95da1f350d81737b0
3
+ metadata.gz: 4090b70821f47975fbfd82cd40651b3ee93e43ecf77cb7a820f20322524a3447
4
+ data.tar.gz: 70440b824c11d8c7b14e0cda8bfd57f8a74df0aa084c5f47b63efbd3047a7706
5
5
  SHA512:
6
- metadata.gz: cdd293b0870059e7ff90dfac63844046d435b4150cd32d15fa2e8b8bef39c975db6ba6df87af89bf84f17fa075a57ffd9b6499b7fbcd4206cc7a281701411aed
7
- data.tar.gz: 3e75b09dc3e6df45113bbad6d2dfb9c40601eb35b743d3557455be8821ace82d5bc762c34c07c89d5faf043c9d10de08dd49227346578ab20c675bad8e57a6a3
6
+ metadata.gz: e2a58b4eea98ed65f797dcccdef7bc5abbb3df45aa9771263e9c69bc809b3d15507521cfc012753285dc9464c441db0d08e7a31c15c098e610fffe959888e621
7
+ data.tar.gz: 41a9dbfee92b60d34cb74b07ac8599a8bf01da0203d386dcfd73a3dac8711030d97c6548ff40caa3dd63dc9fb123c14eb590dbb6a5809679978ebc081328141d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Release History
2
2
 
3
+ ### 0.3.6 / 2018-05-21
4
+
5
+ * CHANGED: Removed Context#new_cli and exposed Context#cli instead.
6
+ * CHANGED: Raises ToolDefinitionError if you declare a duplicate flag.
7
+ * IMPROVED: Provide more details in default descriptions.
8
+ * IMPROVED: Optional parameters are now supported for flags.
9
+ * IMPROVED: Support custom acceptors.
10
+ * IMPROVED: Highline helper automatically sets use_color based on the type of stdout.
11
+
3
12
  ### 0.3.5 / 2018-05-15
4
13
 
5
14
  * CHANGED: Flag and arg blocks in the DSL have an interface more similar to the rest of the DSL.
data/README.md CHANGED
@@ -7,15 +7,28 @@ for software developers, IT specialists, and other power users who want to
7
7
  write and organize scripts to automate their workflows.
8
8
 
9
9
  I wrote Toys because I was accumulating dozens of ad hoc Ruby scripts that I
10
- had written to automate everything from refreshing credentials, to displaying
11
- git history in my favorite format, to running builds and tests of complex
12
- multi-component projects. It was becoming difficult to remember which scripts
13
- did what, and what arguments to pass, and I was repeating the same
14
- OptionParser and common tool boilerplate each time I wrote a new one.
15
-
16
- Toys is a powerful tool that makes it easy to write and organize your scripts.
17
- You write your functionality, and Toys takes care of all the details expected
18
- from a good command line tool.
10
+ had written to automate various tasks in my workflow, everything from
11
+ refreshing credentials, to displaying git history in my favorite format, to
12
+ running builds and tests of complex multi-component projects. It was becoming
13
+ difficult to remember which scripts did what, and what arguments each required,
14
+ and I was constantly digging back into their source just to remember how to use
15
+ them. Furthermore, when writing new scripts, I was repeating the same
16
+ OptionParser boilerplate and common functionality.
17
+
18
+ Toys was designed to address those problems by providing a framework for
19
+ writing and organizing command line scripts. You provide the actual script
20
+ functionality, and Toys takes care of all the other details expected from a
21
+ good command line tool. It provides a streamlined interface for defining and
22
+ handling command line flags and positional arguments, and sensible ways to
23
+ organize shared code. It automatically generates help text, so you can see
24
+ usage information at a glance, and it also provides a search feature to help
25
+ you find the script you need.
26
+
27
+ Toys can also be used to share scripts. For example, it can be used instead of
28
+ Rake to provide build and test scripts for a project--- tools that, unlike Rake
29
+ tasks, can be invoked and passed arguments using familiar unix command line
30
+ arguments and flags. The Toys github repo itself comes with Toys configs
31
+ instead of Rakefiles.
19
32
 
20
33
  You can also use the core functionality of Toys to create your own command line
21
34
  binaries, by using the *toys-core* API, which is available as a separate gem.
@@ -24,7 +37,7 @@ For more info on using toys-core, see
24
37
 
25
38
  ## Quick Start
26
39
 
27
- Here's a five-minute tutorial to get the feel of what Toys can do.
40
+ Here's a five-minute tutorial to get a feel of what Toys can do.
28
41
 
29
42
  ### Install toys
30
43
 
@@ -40,8 +53,8 @@ You can run the binary immediately:
40
53
  This displays overall help for the Toys binary. If you have `less` installed,
41
54
  Toys will use it to display the help screen. Press `q` to exit.
42
55
 
43
- You may notice that the help text lists some tools that are preinstalled. Let's
44
- run one of them:
56
+ You may notice that the help screen lists some tools that are preinstalled.
57
+ Let's run one of them:
45
58
 
46
59
  toys system version
47
60
 
@@ -74,8 +87,8 @@ flags. It can also validate arguments. Try this:
74
87
 
75
88
  toys greet --hello
76
89
 
77
- Notice that Toys automatically generated a usage summary for your tool. It also
78
- automatically generates a full help screen, which you can view using the
90
+ Notice that Toys automatically generated a usage summary for your tool. It can
91
+ also automatically generate a full help screen, which you can view using the
79
92
  `--help` flag:
80
93
 
81
94
  toys greet --help
@@ -83,10 +96,10 @@ automatically generates a full help screen, which you can view using the
83
96
  ### Next steps
84
97
 
85
98
  You can add any number of additional tools to your `.toys.rb` file. Note also
86
- that the tools you created in that file are available only in this directory
87
- and its subdirectories; if you move outside the directory tree, they are no
88
- longer present. You can use this to create tools scoped to particular
89
- directories and projects.
99
+ that the tools you create in that file are available only in this directory
100
+ and its subdirectories. If you move outside the directory tree, Toys will not
101
+ use that file. Thus, you can define tools scoped to particular directories and
102
+ projects.
90
103
 
91
104
  Toys also lets you create hierarchies of tools. The "system version" tool you
92
105
  tried earlier is an example. The "system" tool is treated as a namespace, and
@@ -99,7 +112,8 @@ console-based interfaces, and special effects. It also includes a library that
99
112
  makes it easy to control subprocesses.
100
113
 
101
114
  For a more detailed look at Toys, see the
102
- {file:docs/tutorial.md Extended Tutorial} and {file:docs/guide.md User Guide}.
115
+ {file:docs/tutorial.md Extended Tutorial} and the
116
+ {file:docs/guide.md User Guide}.
103
117
 
104
118
  ## Contributing
105
119
 
data/builtins/do.rb CHANGED
@@ -35,12 +35,17 @@ long_desc \
35
35
  " the string \",\" by default). Toys will run them in order, stopping if any tool" \
36
36
  " returns a nonzero exit code.",
37
37
  "",
38
- "Example: Suppose you have a \"rails build\" tool and a \"deploy\" tool, each with some" \
39
- " flags. You could run them in order, with their flags, like this:",
40
- [" toys do rails build --staging , deploy --migrate"],
38
+ "Example: Suppose you have a \"rails build\" tool and a \"deploy\" tool. You could run them" \
39
+ " in order like this:",
40
+ [" toys do rails build , deploy"],
41
+ "",
42
+ "However, if you want to pass flags to the tools to run, you need to preface the arguments" \
43
+ " with \"--\" in order to prevent \"do\" from trying to use them as its own flags. That" \
44
+ " might look something like this:",
45
+ [" toys do -- rails build --staging , deploy --migrate"],
41
46
  "",
42
47
  "You may change the delimiter using the --delim flag. For example:",
43
- [" toys do --delim=/ rails build --staging / deploy --migrate"]
48
+ [" toys do --delim=/ -- rails build --staging / deploy --migrate"]
44
49
 
45
50
  flag :delim, "-d", "--delim=VALUE",
46
51
  default: ",",
data/docs/guide.md CHANGED
@@ -21,9 +21,9 @@ Toys is a multi-command binary. You may define a collection of commands, called
21
21
  `toys` binary. Tools are arranged in a hierarchy; a tool may be a *namespace*
22
22
  that has *subtools*.
23
23
 
24
- Each tool defines the command line arguments, in the form of *flags* and
25
- *positional arguments*, that it recognizes. Flags can optionally take *values*,
26
- and positional arguments may be *required* or *optional*.
24
+ Tools may recognize command line arguments in the form of *flags* and
25
+ *positional arguments*. Flags can optionally take *values*, while positional
26
+ arguments may be *required* or *optional*.
27
27
 
28
28
  The configuration of a tool may define *descriptions*, for the tool itself, and
29
29
  for each command line argument. These descriptions are displayed in the tool's
@@ -42,18 +42,198 @@ configuration.
42
42
  Finally, Toys provides certain *built-in behavior*, including automatically
43
43
  providing flags to display help screens and set verbosity. It also includes a
44
44
  built-in namespace of *system tools* that let you inspect and configure the
45
- Toys system.
45
+ Toys system itself.
46
46
 
47
47
  ## The Toys Command Line
48
48
 
49
- ## Config Syntax
49
+ In this section, you will learn how Toys parses its command line, identifies a
50
+ tool to run, and interprets flags and other command line arguments.
50
51
 
51
- ## Config Search Path
52
+ The general form of the `toys` command line is:
52
53
 
53
- ## Defining Helpers
54
+ toys [TOOL...] [FLAGS...] [ARGS...]
55
+
56
+ ### Tools
57
+
58
+ The *tool name* consists of all the command line arguments until the first
59
+ argument that begins with a hyphen (which is interpreted as a *flag*), until
60
+ no tool with that name exists (in which case the argument is treated as the
61
+ first *positional argument*), or until there are no more arguments.
62
+
63
+ For example, in the following command:
64
+
65
+ |----TOOL----|
66
+ toys system version
67
+
68
+ The tool name is `system version`. Notice that the tool name may have multiple
69
+ words. Tools are arranged hierarchically. In this case, `system` is a
70
+ *namespace* for tools related to the Toys system, and `version` is one of its
71
+ *subtools*. It prints the current Toys version.
72
+
73
+ In the following command:
74
+
75
+ |TOOL| |ARG|
76
+ toys system blah
77
+
78
+ There is no subtool `blah` under the `system` namespace, so Toys works backward
79
+ until it finds a legitimate tool. In this case, the `system` namespace itself
80
+ does exist, so it is interpreted as the tool, and `blah` is interpreted as an
81
+ argument passed to it.
82
+
83
+ Namespaces such as `system` are themselves tools and can be executed like any
84
+ other tool. In the above case, its function is to take the argument `blah`,
85
+ note that it has no subtool of that name, and print an error message. Most
86
+ commonly, though, you might execute a namespace without arguments:
87
+
88
+ toys system
89
+
90
+ This displays the *online help screen* for the `system` namespace, which
91
+ includes a list of all its subtools and what they do.
92
+
93
+ It is also legitimate for the tool name to be empty. This invokes the "root"
94
+ tool, the toplevel namespace:
95
+
96
+ toys
97
+
98
+ Like any namespace, the root tool displays its help screen, including the list
99
+ of its subtools.
100
+
101
+ One last example:
102
+
103
+ toys blah
104
+
105
+ If there is no tool called `blah` in the toplevel namespace, then once again,
106
+ `blah` is interpreted as an argument to the root tool. The root tool responds
107
+ by printing an error message that the `blah` tool does not exist.
108
+
109
+ ### Flags
110
+
111
+ Flags are generally arguments that begin with a hyphen, and are used to set
112
+ options for a tool.
113
+
114
+ Each tool recognizes a specific set of flags. If you pass an unknown flag to a
115
+ tool, the tool will generally display an error message.
116
+
117
+ Toys follows the typical unix conventions for flags: you can provide short
118
+ (single-character) flags with a single hyphen, or long flags with a double
119
+ hyphen. You can also provide optional values for flags. Following are a few
120
+ examples.
121
+
122
+ Pass a single short flag (for verbose output).
123
+
124
+ toys -v
125
+
126
+ Pass multiple long flags (verbose output, and recursive subtool search).
127
+
128
+ toys --verbose --recursive
129
+
130
+ You can combine short flags. This does the same as the previous example.
131
+
132
+ toys -rv
133
+
134
+ Pass a value using a long flag. This searches subtools for the keyword `build`.
135
+
136
+ toys --search=build
137
+ toys --search build
138
+
139
+ Pass a value using a short flag.
140
+
141
+ toys -s build
142
+ toys -sbuild
143
+
144
+ If a double hyphen `--` appears by itself in the arguments, it disables flag
145
+ parsing from that point. Any further arguments are treated as positional
146
+ arguments, even if they begin with hyphens. For example:
147
+
148
+ |--FLAG--| |---ARG---|
149
+ toys --verbose -- --recursive
150
+
151
+ That will cause `--recursive` to be treated as a positional argument. (In this
152
+ case, as we saw earlier, the root tool will respond by printing an error
153
+ message that no subtool named `--recursive` exists.)
154
+
155
+ Note that a single hyphen by itself `-` is not considered a flag and is treated
156
+ as a positional argument.
157
+
158
+ #### Standard Flags
159
+
160
+ For the most part, each tool specifies which flags and arguments it recognizes.
161
+ However, Toys adds a few standard flags globally to every tool. (It is possible
162
+ for individual tools to override these flags, but most tools should support
163
+ them.) These standard flags include:
164
+
165
+ * `--help` (also `-?`) which displays the full help screen for the tool.
166
+ * `--usage` which displays a shorter usage screen for the tool.
167
+ * `--verbose` (also `-v`) which increases the verbosity. This affects the
168
+ tool's logging display, increasing the number of log levels shown. This
169
+ flag may be issued multiple times.
170
+ * `--quiet` (also `-q`) which decreases the verbosity. This affects the
171
+ tool's logging display, decreasing the number of log levels shown. This
172
+ flag may also be issued multiple times.
173
+
174
+ Namespace tools (tools that have subtools but no explicit functionality of
175
+ their own) always behave as though `--help` is invoked. (They do recognize the
176
+ flag, but it has no additional effect.) Namespaces also support the following
177
+ additional flags:
178
+
179
+ * `--[no-]recursive` (also `-r`) which displays all subtools recursively,
180
+ instead of only the immediate subtools.
181
+ * `--search=TERM` which displays only subtools whose name or description
182
+ contain the specified search term.
183
+
184
+ Finally, the root tool also supports:
185
+
186
+ * `--version` which displays the current Toys version.
187
+
188
+ ### Positional Arguments
189
+
190
+ Any arguments not recognized as flags or flag arguments, are interpreted as
191
+ positional arguments. Positional arguments are recognized in order and may be
192
+ required or optional.
193
+
194
+ Each tool recognizes a specific set of positional arguments. If you do not pass
195
+ a value for a required argument, or you pass too many arguments, the tool will
196
+ generally display an error message.
197
+
198
+ For example, the `do` tool runs multiple tools in sequence. It recognizes any
199
+ number of positional arguments. Those arguments specify which tools to run and
200
+ what arguments to pass to them. If, for example, you had a `build` tool and a
201
+ `test` tool, you could run them in sequence with:
202
+
203
+ |---ARGS---|
204
+ toys do build , test
205
+
206
+ The arguments `build`, `,`, and `test` are positional arguments to the `do`
207
+ tool. (The `do` tool splits them using `,` as the delimiter.)
208
+
209
+ Here is a more complex example illustrating the interaction between flags and
210
+ positional arguments. Suppose we want to use `do` to display the help screens
211
+ for the root tool and the system tool in sequence. That is, we want to run
212
+ `toys --help` and `toys system --help` in sequence. We might start by trying:
213
+
214
+ toys do --help , system --help
215
+
216
+ However, this simply displays the help for the `do` tool itself, because the
217
+ first `--help` is interpreted as a flag for `do` instead of a positional
218
+ argument specifying the first tool for `do` to run. We need to force `do` to
219
+ treat all its arguments as positional, and we can do that by starting with `--`
220
+ like so:
221
+
222
+ |--------ARGS--------|
223
+ toys do -- --help , system --help
224
+
225
+ ## Defining Tools
226
+
227
+ ## Understanding Configurations
228
+
229
+ ## Helper Methods and Modules
230
+
231
+ ## The Standard Helpers
232
+
233
+ ## Prefabricated Tools with Templates
54
234
 
55
235
  ## Defining Templates
56
236
 
57
- ## Built-in Flags and Behavior
237
+ ## Advanced Tool Definition Techniques
58
238
 
59
239
  ## Embedding Toys
@@ -29,9 +29,6 @@
29
29
 
30
30
  require "logger"
31
31
 
32
- require "toys/middleware/show_version"
33
- require "toys/utils/wrappable_string"
34
-
35
32
  module Toys
36
33
  ##
37
34
  # Helpers that configure the toys-core CLI with the behavior for the
@@ -86,10 +83,16 @@ module Toys
86
83
  #
87
84
  DEFAULT_ROOT_LONG_DESC =
88
85
  "Toys is your personal command line tool. You can add to the list of commands below by" \
89
- " writing scripts in Ruby using a simple DSL, and toys will organize and document them" \
86
+ " writing scripts in Ruby using a simple DSL, and Toys will organize and document them" \
90
87
  " and make them available globally or scoped to specific directories that you choose." \
91
88
  " For detailed information, see https://www.rubydoc.info/gems/toys".freeze
92
89
 
90
+ ##
91
+ # Short description for the verion flag
92
+ # @return [String]
93
+ #
94
+ DEFAULT_VERSION_FLAG_DESC = "Show the version of Toys.".freeze
95
+
93
96
  ##
94
97
  # Create a standard CLI, configured with the appropriate paths and
95
98
  # middleware.
@@ -160,11 +163,13 @@ module Toys
160
163
  search_flags: true,
161
164
  default_recursive: true,
162
165
  allow_root_args: true,
166
+ show_source_path: true,
163
167
  use_less: true
164
168
  ],
165
169
  [
166
- :show_version,
167
- version_displayer: Middleware::ShowVersion.root_version_displayer(::Toys::VERSION)
170
+ :show_root_version,
171
+ version_string: ::Toys::VERSION,
172
+ version_flag_desc: DEFAULT_VERSION_FLAG_DESC
168
173
  ],
169
174
  [
170
175
  :handle_usage_errors
@@ -175,6 +180,7 @@ module Toys
175
180
  recursive_flags: true,
176
181
  search_flags: true,
177
182
  default_recursive: true,
183
+ show_source_path: true,
178
184
  use_less: true
179
185
  ],
180
186
  [
data/lib/toys/version.rb CHANGED
@@ -32,5 +32,5 @@ module Toys
32
32
  # Current version of the Toys command line binary
33
33
  # @return [String]
34
34
  #
35
- VERSION = "0.3.5".freeze
35
+ VERSION = "0.3.6".freeze
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toys
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-15 00:00:00.000000000 Z
11
+ date: 2018-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: toys-core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.5
19
+ version: 0.3.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.5
26
+ version: 0.3.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement