bashly 0.6.0 → 0.6.4
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/README.md +31 -371
- data/lib/bashly/commands/add.rb +1 -1
- data/lib/bashly/concerns/completions.rb +2 -5
- data/lib/bashly/models/command.rb +18 -2
- data/lib/bashly/templates/lib/config.sh +4 -4
- data/lib/bashly/templates/strings.yml +1 -0
- data/lib/bashly/version.rb +1 -1
- data/lib/bashly/views/command/catch_all_filter.erb +7 -0
- data/lib/bashly/views/command/environment_variables_filter.erb +5 -0
- data/lib/bashly/views/command/fixed_flags_filter.erb +1 -1
- data/lib/bashly/views/command/initialize.erb +6 -1
- data/lib/bashly/views/command/parse_requirements.erb +1 -0
- data/lib/bashly/views/environment_variable/usage.erb +3 -0
- data/lib/bashly.rb +0 -1
- metadata +4 -4
- data/lib/bashly/polyfills/hash.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 650f456561f180e0a39b2e6e0c66f6c5913438ac6301d44bff064470d602daba
|
4
|
+
data.tar.gz: 2f64d00edb50ce738d506568600d8b73b898aad6563990460a80a52d912a6e66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70427709c22c05bcfdfadb1daafaea8c87c5854b03488913c916ffb29861521c853eb5392f22c0c79b7bdc8fe359fc55389c0d6f0540493c250dd6ba1f7d79b5
|
7
|
+
data.tar.gz: 2b2aa5dc0525edc81ce3c023583b0d829907de9e1656a00fdb37d6cd87e0b4ab788e70e71fe51763a661006f8ce8fdf950a7c3e7ffcce095edec5cc799e942ed
|
data/README.md
CHANGED
@@ -3,405 +3,67 @@
|
|
3
3
|
|
4
4
|
# Bashly - Bash CLI Framework and Generator
|
5
5
|
|
6
|
-
Create
|
6
|
+
Create feature-rich bash scripts using simple YAML configuration
|
7
7
|
|
8
8
|
[](https://badge.fury.io/rb/bashly)
|
9
9
|
[](https://github.com/DannyBen/bashly/actions?query=workflow%3ATest)
|
10
10
|
[](https://codeclimate.com/github/DannyBen/bashly/maintainability)
|
11
11
|
|
12
|
+
## [bashly.dannyb.co](https://bashly.dannyb.co)
|
13
|
+
|
12
14
|
---
|
13
15
|
|
14
16
|

|
15
17
|
|
16
18
|
</div>
|
17
19
|
|
20
|
+
Bashly is a command line application (written in Ruby) that lets you
|
21
|
+
generate feature-rich bash command line tools.
|
18
22
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- [Installation](#installation)
|
23
|
-
- [Prerequisites](#prerequisites)
|
24
|
-
- [What is Bashly](#what-is-bashly)
|
25
|
-
- [Usage](#usage)
|
26
|
-
- [Using the input arguments in your code](#using-the-input-arguments-in-your-code)
|
27
|
-
- [Examples](#examples)
|
28
|
-
- [Configuration Reference](#configuration-reference)
|
29
|
-
- [Command options](#command-options)
|
30
|
-
- [Argument options](#argument-options)
|
31
|
-
- [Flag options](#flag-options)
|
32
|
-
- [Environment Variable options](#environment-variable-options)
|
33
|
-
- [Extensible Scripts](#extensible-scripts)
|
34
|
-
- [Bash Completions](#bash-completions)
|
35
|
-
- [Real World Examples](#real-world-examples)
|
36
|
-
- [Contributing / Support](#contributing--support)
|
37
|
-
|
38
|
-
---
|
39
|
-
|
40
|
-
|
41
|
-
## Installation
|
42
|
-
|
43
|
-
```shell
|
44
|
-
$ gem install bashly
|
45
|
-
```
|
23
|
+
Bashly lets you focus on your specific code, without worrying about command line
|
24
|
+
argument parsing, usage texts, error messages and other functions that are
|
25
|
+
usually handled by a framework in any other programming language.
|
46
26
|
|
47
|
-
|
27
|
+
It is available both as a [ruby gem](https://rubygems.org/gems/bashly) and as
|
28
|
+
a [docker image](https://hub.docker.com/r/dannyben/bashly).
|
48
29
|
|
49
|
-
```shell
|
50
|
-
$ alias bashly='docker run --rm -it --volume "$PWD:/app" dannyben/bashly'
|
51
|
-
```
|
52
30
|
|
53
|
-
##
|
31
|
+
## Documentation
|
54
32
|
|
55
|
-
|
56
|
-
|
33
|
+
- [Bashly Homepage][docs]
|
34
|
+
- [Examples][examples]
|
57
35
|
|
36
|
+
## How it works
|
58
37
|
|
59
|
-
|
38
|
+
1. You provide a YAML configuration file, describing commands, sub-commands,
|
39
|
+
arguments, and flags. Running `bashly init` creates an initial sample YAML
|
40
|
+
file for you ([example](https://github.com/DannyBen/bashly/tree/master/examples/minimal#bashlyyml)).
|
41
|
+
2. Bashly then automatically generates a bash script (when you run
|
42
|
+
`bashly generate`) that can parse and validate user input, provide help
|
43
|
+
messages, and run your code for each command ([example](https://github.com/DannyBen/bashly/blob/master/examples/minimal/download)).
|
44
|
+
3. Your code for each command is kept in a separate file, and can be merged
|
45
|
+
again if you change it ([example](https://github.com/DannyBen/bashly/blob/master/examples/minimal/src/root_command.sh)).
|
60
46
|
|
61
|
-
|
62
|
-
feature-rich bash command line tools.
|
47
|
+
## Features
|
63
48
|
|
64
|
-
|
65
|
-
worrying about command line argument parsing, usage texts, error messages
|
66
|
-
and other functions that are usually handled by a framework in any other
|
67
|
-
programming language.
|
68
|
-
|
69
|
-
Bahsly is responsible for:
|
49
|
+
Bashly is responsible for:
|
70
50
|
|
71
51
|
- Generating a **single, standalone bash script**.
|
72
|
-
- Generating **usage texts** and help screens, showing your tool's arguments,
|
73
|
-
flags and commands (works for subcommands also).
|
52
|
+
- Generating **usage texts** and help screens, showing your tool's arguments, flags and commands (works for sub-commands also).
|
74
53
|
- Parsing the user's command line and extracting:
|
75
54
|
- Optional or required **positional arguments**.
|
76
55
|
- Optional or required **option flags** (with or without flag arguments).
|
77
|
-
- **Commands** (and
|
56
|
+
- **Commands** (and sub-commands).
|
78
57
|
- Standard flags (like **--help** and **--version**).
|
79
58
|
- Preventing your script from running unless the command line is valid.
|
80
|
-
- Providing you with a place to input your code for each of the functions
|
81
|
-
|
82
|
-
- Providing you with additional (optional) framework-style, standard
|
83
|
-
library functions:
|
59
|
+
- Providing you with a place to input your code for each of the functions your tool performs, and merging it back to the final script.
|
60
|
+
- Providing you with additional (optional) framework-style, standard library functions:
|
84
61
|
- **Color output**.
|
85
62
|
- **Config file management** (INI format).
|
86
63
|
- **YAML parsing**.
|
87
64
|
- **Bash completions**.
|
88
65
|
- and more.
|
89
66
|
|
90
|
-
|
91
|
-
## Usage
|
92
|
-
|
93
|
-
The `bashly.yml` file can be set up to generate two types of scripts:
|
94
|
-
|
95
|
-
1. Script with commands (for example, like `docker` or `git`).
|
96
|
-
2. Script without commands (for example, like `ls`)
|
97
|
-
|
98
|
-
This is detected automatically by the contents of the configuration: If it
|
99
|
-
contains a `commands` definition, it will generate a script with commands.
|
100
|
-
|
101
|
-
In an empty directory, create a sample configuration file by running
|
102
|
-
|
103
|
-
```shell
|
104
|
-
$ bashly init
|
105
|
-
# or, to generate a simpler configuration:
|
106
|
-
$ bashly init --minimal
|
107
|
-
```
|
108
|
-
|
109
|
-
This will create a sample `src/bashly.yml` file.
|
110
|
-
You can edit this file to specify which arguments, flags and commands you
|
111
|
-
need in your bash script.
|
112
|
-
|
113
|
-
Then, generate an initial bash script and function placeholder scripts by
|
114
|
-
running
|
115
|
-
|
116
|
-
```shell
|
117
|
-
$ bashly generate
|
118
|
-
```
|
119
|
-
|
120
|
-
This will:
|
121
|
-
|
122
|
-
1. Create the bash executable script.
|
123
|
-
2. Create files for you to edit in the `src` folder.
|
124
|
-
|
125
|
-
Finally, edit the files in the `src` folder. Each of your script's commands
|
126
|
-
get their own file. Once you edit, run `bashly generate` again to merge the
|
127
|
-
content from your functions back into the script.
|
128
|
-
|
129
|
-
### Using the input arguments in your code
|
130
|
-
|
131
|
-
In order to access the parsed arguments in any of your partial scripts, you
|
132
|
-
may simply access the `$args` associative array.
|
133
|
-
|
134
|
-
For example:
|
135
|
-
|
136
|
-
1. Generate a minimal configuration with `bashly init --minimal`
|
137
|
-
2. Generate the bash script with `bashly generate`
|
138
|
-
3. Run the script with `./download hello --force`
|
139
|
-
|
140
|
-
You will notice that all the arguments of the associative array are printed
|
141
|
-
on screen. This is done by the `inspect_args` function that was inserted into
|
142
|
-
the generated partial script `src/root_command.sh`.
|
143
|
-
|
144
|
-
You can now access these variables by modifying `sec/root_command.sh` like
|
145
|
-
this:
|
146
|
-
|
147
|
-
|
148
|
-
```bash
|
149
|
-
# src/root_command.sh
|
150
|
-
source_url=${args[source]}
|
151
|
-
force=${args[--force]}
|
152
|
-
|
153
|
-
if [[ $force ]]; then
|
154
|
-
echo "downloading $source_url with --force"
|
155
|
-
else
|
156
|
-
echo "downloading $source_url"
|
157
|
-
fi
|
158
|
-
```
|
159
|
-
|
160
|
-
After editing the file, run `bashly generate` (or `bashly g` for short) and
|
161
|
-
run:
|
162
|
-
|
163
|
-
```
|
164
|
-
$ ./download a --force
|
165
|
-
downloading a with --force
|
166
|
-
```
|
167
|
-
|
168
|
-
|
169
|
-
## Examples
|
170
|
-
|
171
|
-
The [examples folder](examples#readme) contains many detailed and documented
|
172
|
-
example configuration files, with their output.
|
173
|
-
|
174
|
-
|
175
|
-
## Configuration Reference
|
176
|
-
|
177
|
-
The `bashly.yml` configuration file consists of these types:
|
178
|
-
|
179
|
-
- [Command](#command-options) - defines the root command as well as any
|
180
|
-
subcommand.
|
181
|
-
- [Argument](#argument-options) - defines positional arguments.
|
182
|
-
- [Flag](#flag-options) - defines option flags.
|
183
|
-
- [Environment Variable](#environment-variable-options) - defines
|
184
|
-
environment variables required (or desired) by your script.
|
185
|
-
|
186
|
-
### Command options
|
187
|
-
|
188
|
-
Unless otherwise specified, these definitions can be used for both the root
|
189
|
-
command and subcommands (under the `commands` definition).
|
190
|
-
|
191
|
-
Option | Description
|
192
|
-
-----------|-------------
|
193
|
-
`name` | The name of the script or subcommand.
|
194
|
-
`short` | An additional, optional pattern - usually used to denote a one letter variation of the command name. You can add `*` as a suffix, to denote a "starts with" pattern - for example `short: m*`. *Applicable only in subcommands*.
|
195
|
-
`help` | The header text to display when using `--help`. This option can have multiple lines. In this case, the first line will be used as summary wherever appropriate.
|
196
|
-
`version` | The string to display when using `--version`. *Applicable only in the main command*.
|
197
|
-
`default` | Setting this to `true` on any command, will cause any unrecognized command line to be passed to this command. *Applicable only in subcommands*.
|
198
|
-
`extensible` | Specify that this command can be [externally extended](#extensible-scripts). *Applicable only in the main command*.
|
199
|
-
`examples` | Specify an array of examples to show when using `--help`. Each example can have multiple lines.
|
200
|
-
`environment_variables` | Specify an array of [environment variables](#environment-variable-options) needed by your script.
|
201
|
-
`commands` | Specify the array of [commands](#command-options). Each command will have its own args and flags. Note: if `commands` is provided, you cannot specify flags or args at the same level.
|
202
|
-
`args` | Specify the array of [positional arguments](#argument-options) this script needs.
|
203
|
-
`flags` | Specify the array of option [flags](#flag-options) this script needs.
|
204
|
-
`completions` | Specify an array of additional completion suggestions when used in conjunction with `bashly add comp`. See [Bash Completions](#bash-completions).
|
205
|
-
`catch_all` | Specify that this command should allow for additional arbitrary arguments or flags. It can be set in one of three ways:<br>- Set to `true` to just enable it.<br>- Set to a string, to use this string in the usage help text.<br>- Set to a hash containing `label` and `help` keys, to show a detailed help for it when running with `--help`.
|
206
|
-
`dependencies` | Specify an array of any required external dependencies (commands). The script execution will be halted with a friendly error unless all dependency commands exist.
|
207
|
-
`group` | In case you have many commands, use this option to specify a caption to display before this command. This option is purely for display purposes, and needs to be specified only for the first command in each group.
|
208
|
-
`footer` | Add a custom message that will be displayed at the end of the `--help` text.
|
209
|
-
|
210
|
-
### Argument options
|
211
|
-
|
212
|
-
The argument's value will be available to you as `${args[user]}` in your
|
213
|
-
bash function.
|
214
|
-
|
215
|
-
Option | Description
|
216
|
-
-----------|-------------
|
217
|
-
`name` | The name of the argument.
|
218
|
-
`help` | The message to display when using `--help`. Can have multiple lines.
|
219
|
-
`required` | Specify if this argument is required. Note that once you define an optional argument (without required: true) then you cannot define required arguments after it.
|
220
|
-
`default` | The value to use in case it is not provided by the user. Implies that this argument is optional.
|
221
|
-
`allowed` | Limit the allowed values by providing an array.
|
222
|
-
|
223
|
-
### Flag options
|
224
|
-
|
225
|
-
The flag's value will be available to you as `${args[--output]}` in your
|
226
|
-
bash function (regardless of whether the user provided it with the long or
|
227
|
-
short form).
|
228
|
-
|
229
|
-
Option | Description
|
230
|
-
-----------|-------------
|
231
|
-
`long` | The long form of the flag.
|
232
|
-
`short` | The short form of the flag.
|
233
|
-
`help` | The text to display when using `--help`. Can have multiple lines.
|
234
|
-
`arg` | If the flag requires an argument, specify its name here.
|
235
|
-
`required` | Specify if this flag is required.
|
236
|
-
`default` | The value to use in case it is not provided by the user. Implies that this flag is optional, and only makes sense when the flag has an argument.
|
237
|
-
`allowed` | For flags with an argument, you can limit the allowed values by providing an array.
|
238
|
-
|
239
|
-
#### Special handling for -v and -h
|
240
|
-
|
241
|
-
The `-v` and `-h` flags will be used as the short options for `--version` and
|
242
|
-
`--help` respectively **only if you are not using them in any of your own
|
243
|
-
flags**.
|
244
|
-
|
245
|
-
### Environment variable options
|
246
|
-
|
247
|
-
If an environment variable is defined as required (false by default), the
|
248
|
-
execution of the script will be halted with a friendly error if it is not
|
249
|
-
set.
|
250
|
-
|
251
|
-
Option | Description
|
252
|
-
-----------|-------------
|
253
|
-
`name` | The name of the variable (it will be automatically capitalized).
|
254
|
-
`help` | The message to display when using --help. Can have multiple lines.
|
255
|
-
`required` | Specify if this variable is required.
|
256
|
-
|
257
|
-
|
258
|
-
## Extensible Scripts
|
259
|
-
|
260
|
-
You may configure your generated bash script to delegate any unknown command
|
261
|
-
to an external executable, by setting the `extensible` option to either `true`,
|
262
|
-
or to a different external command.
|
263
|
-
|
264
|
-
This is similar to how `git` works. When you execute `git whatever`, the `git`
|
265
|
-
command will look for a file named `git-whatever` in the path, and execute it.
|
266
|
-
|
267
|
-
Note that this option cannot be specified together with the `default` option,
|
268
|
-
since both specify a handler for unknown commands.
|
269
|
-
|
270
|
-
The `extensible` option supports two operation modes:
|
271
|
-
|
272
|
-
### Extension Mode (`extensible: true`)
|
273
|
-
|
274
|
-
By setting `extensible` to `true`, a specially named executable will be called
|
275
|
-
when an unknown command is called by the user.
|
276
|
-
|
277
|
-
Given this `bashly.yml` configuration:
|
278
|
-
|
279
|
-
```yaml
|
280
|
-
name: myscript
|
281
|
-
help: Example
|
282
|
-
version: 0.1.0
|
283
|
-
extensible: true
|
284
|
-
|
285
|
-
commands:
|
286
|
-
- name: upload
|
287
|
-
help: Upload a file
|
288
|
-
```
|
289
|
-
|
290
|
-
And this user command:
|
291
|
-
|
292
|
-
```
|
293
|
-
$ myscript something
|
294
|
-
|
295
|
-
```
|
296
|
-
|
297
|
-
The generated script will look for an executable named `myscript-something`
|
298
|
-
in the path. If found, it will be called.
|
299
|
-
|
300
|
-
See the [extensible example](examples/extensible).
|
301
|
-
|
302
|
-
|
303
|
-
### Delegate Mode (`extensible: <executable name>`)
|
304
|
-
|
305
|
-
By setting `extensible` to any string, unknown command calls by the user will
|
306
|
-
be delegated to the executable with that name.
|
307
|
-
|
308
|
-
Given this `bashly.yml` configuration:
|
309
|
-
|
310
|
-
```yaml
|
311
|
-
name: mygit
|
312
|
-
help: Example
|
313
|
-
version: 0.1.0
|
314
|
-
extensible: git
|
315
|
-
|
316
|
-
commands:
|
317
|
-
- name: push
|
318
|
-
help: Push to my repository
|
319
|
-
```
|
320
|
-
|
321
|
-
And this user command:
|
322
|
-
|
323
|
-
```
|
324
|
-
$ mygit status
|
325
|
-
|
326
|
-
```
|
327
|
-
|
328
|
-
The generated script will execute `git status`.
|
329
|
-
|
330
|
-
See the [extensible-delegate example](examples/extensible-delegate).
|
331
|
-
|
332
|
-
|
333
|
-
## Bash Completions
|
334
|
-
|
335
|
-
Bashly comes with built-in bash completions generator, provided by the
|
336
|
-
[completely][completely] gem.
|
337
|
-
|
338
|
-
By running any of the `bashly add comp` commands, you can add this
|
339
|
-
functionality to your script in one of three ways:
|
340
|
-
|
341
|
-
- `bashly add comp function` - creates a function in your `./src/lib` directory
|
342
|
-
that echoes a completion script. You can then call this function from any
|
343
|
-
command (for example `yourcli completions`) and your users will be able to
|
344
|
-
install the completions by running `eval "$(yourcli completions)"`.
|
345
|
-
- `bashly add comp script` - creates a standalone completion script that can be
|
346
|
-
sourced or copies to the system's bash completions directory.
|
347
|
-
- `bashly add comp yaml` - creates the "raw data" YAML file. This is intended
|
348
|
-
mainly for development purposes.
|
349
|
-
|
350
|
-
The bash completions generation is completely automatic, and you will have to
|
351
|
-
rerun the `bashly add comp *` command whenever you change your `bashly.yml`
|
352
|
-
script.
|
353
|
-
|
354
|
-
In addition to suggesting subcommands and flags, you can instruct bashly to
|
355
|
-
also suggest files, directories, users and more. To do this, add another option
|
356
|
-
in your `bashly.yml` on the command you wish to alter:
|
357
|
-
|
358
|
-
```yaml
|
359
|
-
# bashly.yml
|
360
|
-
commands:
|
361
|
-
- name: upload
|
362
|
-
help: Upload a file
|
363
|
-
completions: [directory, user]
|
364
|
-
|
365
|
-
```
|
366
|
-
|
367
|
-
Valid completion additions are:
|
368
|
-
|
369
|
-
| Keyword | Meaning
|
370
|
-
|-------------|---------------------
|
371
|
-
| `alias` | Alias names
|
372
|
-
| `arrayvar` | Array variable names
|
373
|
-
| `binding` | Readline key binding names
|
374
|
-
| `builtin` | Names of shell builtin commands
|
375
|
-
| `command` | Command names
|
376
|
-
| `directory` | Directory names
|
377
|
-
| `disabled` | Names of disabled shell builtins
|
378
|
-
| `enabled` | Names of enabled shell builtins
|
379
|
-
| `export` | Names of exported shell variables
|
380
|
-
| `file` | File names
|
381
|
-
| `function` | Names of shell functions
|
382
|
-
| `group` | Group names
|
383
|
-
| `helptopic` | Help topics as accepted by the help builtin
|
384
|
-
| `hostname` | Hostnames, as taken from the file specified by the HOSTFILE shell variable
|
385
|
-
| `job` | Job names
|
386
|
-
| `keyword` | Shell reserved words
|
387
|
-
| `running` | Names of running jobs
|
388
|
-
| `service` | Service names
|
389
|
-
| `signal` | Signal names
|
390
|
-
| `stopped` | Names of stopped jobs
|
391
|
-
| `user` | User names
|
392
|
-
| `variable` | Names of all shell variables
|
393
|
-
|
394
|
-
Note that these are taken from the [Programmable Completion Builtin][compgen],
|
395
|
-
and will simply be added using the `compgen -A action` command.
|
396
|
-
|
397
|
-
|
398
|
-
## Real World Examples
|
399
|
-
|
400
|
-
- [Rush][rush] - a Personal Package Manager
|
401
|
-
- [Alf][alf] - a generator for bash aliases and sub-aliases
|
402
|
-
- [git-changelog][git-changelog] - a change log generator
|
403
|
-
|
404
|
-
|
405
67
|
## Contributing / Support
|
406
68
|
|
407
69
|
If you experience any issue, have a question or a suggestion, or if you wish
|
@@ -410,8 +72,6 @@ to contribute, feel free to [open an issue][issues].
|
|
410
72
|
|
411
73
|
|
412
74
|
[issues]: https://github.com/DannyBen/bashly/issues
|
413
|
-
[
|
414
|
-
[
|
415
|
-
|
416
|
-
[completely]: https://github.com/DannyBen/completely
|
417
|
-
[compgen]: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
|
75
|
+
[docs]: https://bashly.dannyb.co/
|
76
|
+
[examples]: https://github.com/DannyBen/bashly/tree/master/examples#bashly-examples
|
77
|
+
|
data/lib/bashly/commands/add.rb
CHANGED
@@ -13,7 +13,7 @@ module Bashly
|
|
13
13
|
|
14
14
|
option "-f --force", "Overwrite existing files"
|
15
15
|
|
16
|
-
param "FORMAT", "Output format, can be one of:\n function : generate a function file to be included in your script.\n script : generate a standalone bash completions script
|
16
|
+
param "FORMAT", "Output format, can be one of:\n function : generate a function file to be included in your script.\n script : generate a standalone bash completions script.\n yaml : generate a yaml compatible with completely."
|
17
17
|
param "OUTPUT", "For the 'comp function' command: Name of the generated function.\nFor the 'comp script' or 'comp yaml' commands: path to output file.\nIn all cases, this is optional and will have sensible defaults."
|
18
18
|
|
19
19
|
command "strings", "Copy an additional configuration file to your project, allowing you to customize all the tips and error strings."
|
@@ -31,18 +31,15 @@ module Bashly
|
|
31
31
|
flags.map(&:name) + flags.map(&:short)
|
32
32
|
end
|
33
33
|
|
34
|
-
def completion_actions
|
35
|
-
completions ? completions.map { |c| "<#{c}>" } : []
|
36
|
-
end
|
37
|
-
|
38
34
|
def completion_words(with_version: false)
|
39
35
|
trivial_flags = %w[--help -h]
|
40
36
|
trivial_flags += %w[--version -v] if with_version
|
41
37
|
all = (
|
42
38
|
command_names + trivial_flags +
|
43
|
-
completion_flag_names
|
39
|
+
completion_flag_names
|
44
40
|
)
|
45
41
|
|
42
|
+
all += completions if completions
|
46
43
|
all.compact.uniq.sort
|
47
44
|
end
|
48
45
|
|
@@ -5,7 +5,7 @@ module Bashly
|
|
5
5
|
|
6
6
|
# Returns the name to be used as an action.
|
7
7
|
# - If it is the root command, the action is "root"
|
8
|
-
# - Else, it is all the parents, except the first
|
8
|
+
# - Else, it is all the parents, except the first one (root) joined
|
9
9
|
# by space. For example, for a command like "docker container run"
|
10
10
|
# the action name is "container run".
|
11
11
|
def action_name
|
@@ -54,6 +54,17 @@ module Bashly
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
# Returns true if catch_all is required
|
58
|
+
def catch_all_required?
|
59
|
+
catch_all.is_a?(Hash) and catch_all['required']
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns a string suitable for catch_all Usage pattern
|
63
|
+
def catch_all_usage
|
64
|
+
return nil unless catch_all
|
65
|
+
catch_all_required? ? catch_all_label : "[#{catch_all_label}]"
|
66
|
+
end
|
67
|
+
|
57
68
|
# Returns only the names of the Commands
|
58
69
|
def command_names
|
59
70
|
commands.map &:name
|
@@ -92,6 +103,11 @@ module Bashly
|
|
92
103
|
commands.find { |c| c.default }
|
93
104
|
end
|
94
105
|
|
106
|
+
# Returns an array of all the default Environment Variables
|
107
|
+
def default_environment_variables
|
108
|
+
environment_variables.select &:default
|
109
|
+
end
|
110
|
+
|
95
111
|
# Returns an array of all the default Flags
|
96
112
|
def default_flags
|
97
113
|
flags.select &:default
|
@@ -185,7 +201,7 @@ module Bashly
|
|
185
201
|
result << arg.usage_string
|
186
202
|
end
|
187
203
|
result << "[options]" unless flags.empty?
|
188
|
-
result <<
|
204
|
+
result << catch_all_usage if catch_all
|
189
205
|
result.join " "
|
190
206
|
end
|
191
207
|
|
@@ -17,7 +17,7 @@ config_init() {
|
|
17
17
|
[[ -f "$CONFIG_FILE" ]] || touch "$CONFIG_FILE"
|
18
18
|
}
|
19
19
|
|
20
|
-
# Get a value from the config
|
20
|
+
# Get a value from the config.
|
21
21
|
# Usage: result=$(config_get hello)
|
22
22
|
config_get() {
|
23
23
|
key=$1
|
@@ -66,7 +66,7 @@ config_set() {
|
|
66
66
|
printf "%b\n" "$output" > "$CONFIG_FILE"
|
67
67
|
}
|
68
68
|
|
69
|
-
# Delete a key from
|
69
|
+
# Delete a key from the config.
|
70
70
|
# Usage: config_del key
|
71
71
|
config_del() {
|
72
72
|
key=$1
|
@@ -92,7 +92,7 @@ config_show() {
|
|
92
92
|
cat "$CONFIG_FILE"
|
93
93
|
}
|
94
94
|
|
95
|
-
# Return an array of the keys in the config file
|
95
|
+
# Return an array of the keys in the config file.
|
96
96
|
# Usage:
|
97
97
|
#
|
98
98
|
# for k in $(config_keys); do
|
@@ -114,7 +114,7 @@ config_keys() {
|
|
114
114
|
echo "${keys[@]}"
|
115
115
|
}
|
116
116
|
|
117
|
-
# Returns true if the specified key exists in the config file
|
117
|
+
# Returns true if the specified key exists in the config file.
|
118
118
|
# Usage:
|
119
119
|
#
|
120
120
|
# if config_has_key "key" ; then
|
@@ -31,3 +31,4 @@ missing_required_environment_variable: "missing required environment variable: %
|
|
31
31
|
missing_dependency: "missing dependency: %{dependency}"
|
32
32
|
disallowed_flag: "%{name} must be one of: %{allowed}"
|
33
33
|
disallowed_argument: "%{name} must be one of: %{allowed}"
|
34
|
+
unsupported_bash_version: "bash version 4 or higher is required"
|
data/lib/bashly/version.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
# :command.environment_variables_filter
|
2
|
+
<%- if default_environment_variables.any? -%>
|
3
|
+
<%- default_environment_variables.each do |env_var| -%>
|
4
|
+
export <%= env_var.name.upcase %>="${<%= env_var.name.upcase %>:-<%= env_var.default %>}"
|
5
|
+
<%- end -%>
|
6
|
+
<%- end -%>
|
2
7
|
<%- if required_environment_variables.any? -%>
|
3
8
|
<%- required_environment_variables.each do |env_var| -%>
|
4
9
|
if [[ -z "$<%= env_var.name.upcase %>" ]]; then
|
@@ -2,7 +2,12 @@
|
|
2
2
|
initialize() {
|
3
3
|
version="<%= version %>"
|
4
4
|
long_usage=''
|
5
|
-
set -e
|
5
|
+
set -e
|
6
|
+
|
7
|
+
if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then
|
8
|
+
printf "<%= strings[:unsupported_bash_version] -%>\n"
|
9
|
+
exit 1
|
10
|
+
fi
|
6
11
|
|
7
12
|
<%= load_user_file("initialize.sh", placeholder: false).indent 2 %>
|
8
13
|
}
|
@@ -11,6 +11,7 @@ parse_requirements() {
|
|
11
11
|
<%= render(:required_args_filter).indent 2 %>
|
12
12
|
<%= render(:required_flags_filter).indent 2 %>
|
13
13
|
<%= render(:parse_requirements_while).indent 2 %>
|
14
|
+
<%= render(:catch_all_filter).indent 2 %>
|
14
15
|
<%= render(:default_assignments).indent 2 %>
|
15
16
|
<%= render(:whitelist_filter).indent 2 %>
|
16
17
|
}
|
data/lib/bashly.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bashly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colsole
|
@@ -102,7 +102,6 @@ files:
|
|
102
102
|
- lib/bashly/models/environment_variable.rb
|
103
103
|
- lib/bashly/models/flag.rb
|
104
104
|
- lib/bashly/models/script.rb
|
105
|
-
- lib/bashly/polyfills/hash.rb
|
106
105
|
- lib/bashly/settings.rb
|
107
106
|
- lib/bashly/templates/bashly.yml
|
108
107
|
- lib/bashly/templates/lib/colors.sh
|
@@ -113,6 +112,7 @@ files:
|
|
113
112
|
- lib/bashly/templates/strings.yml
|
114
113
|
- lib/bashly/version.rb
|
115
114
|
- lib/bashly/views/argument/usage.erb
|
115
|
+
- lib/bashly/views/command/catch_all_filter.erb
|
116
116
|
- lib/bashly/views/command/command_fallback.erb
|
117
117
|
- lib/bashly/views/command/command_filter.erb
|
118
118
|
- lib/bashly/views/command/command_functions.erb
|
@@ -169,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
169
|
- !ruby/object:Gem::Version
|
170
170
|
version: '0'
|
171
171
|
requirements: []
|
172
|
-
rubygems_version: 3.2.
|
172
|
+
rubygems_version: 3.2.25
|
173
173
|
signing_key:
|
174
174
|
specification_version: 4
|
175
175
|
summary: Bash Command Line Tool Generator
|