toys 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
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