bashly 0.6.1 → 0.6.2

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: 3a6c888335f32b6223149d91ed739e189ffbc6921afec05ff709380c76387338
4
- data.tar.gz: b964b4ac7a5fa86f8766b350a3240ee00882be5cfc574e97f001a832a506e342
3
+ metadata.gz: bd9fb393dfda0c4529dc984e9ee12660e310c014a41e4fac031c3d7b33420bad
4
+ data.tar.gz: 3496cc3d2d8715332fce5d163b4ebe0d6ea9eb5441378c75dae3a070fbf8db18
5
5
  SHA512:
6
- metadata.gz: e1e2757a735e55ffc4d4b27633d6df020184521ed8eb6377c0f26f8edd7442d28fb2a3c56c056de4558aab2204f7d522e15df6374f1962fcbaf26226f590d22b
7
- data.tar.gz: a8aa77fba152f005136ff8ee8aacdc7236f15975042c4066f6d94e7e400133e2ca4137ffbbe9bc6f458c2aae2784aa956721d9179862cd78bf95ec6f99f39bd3
6
+ metadata.gz: 430ac01ae504b3f54e6c812d13729806c494cf5912833bf2b5360645040c368b1f514c538c66d701672f12ae6c1ba77849691c1666f4f6d11a43b44bc79d0f17
7
+ data.tar.gz: 41784e22ff19801e5e6be60be31652ea751f30a21c027d40ba59d9f29a08ed0e5074fa1c87518bb54fd0d41bc94ad475f7f91764bbf3cde85f09868e4ccda46f
data/README.md CHANGED
@@ -15,370 +15,9 @@ Create beautiful bash scripts from simple YAML configuration
15
15
 
16
16
  </div>
17
17
 
18
+ ## Documentation
18
19
 
19
- ## Table of Contents
20
-
21
- - [Table of Contents](#table-of-contents)
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
- ```
46
-
47
- or with Docker:
48
-
49
- ```shell
50
- $ alias bashly='docker run --rm -it --volume "$PWD:/app" dannyben/bashly'
51
- ```
52
-
53
- ## Prerequisites
54
-
55
- The bash scripts generated by bashly require bash 4 or higher due to heavy
56
- use of associative arrays.
57
-
58
-
59
- ## What is Bashly
60
-
61
- Bashly is a command line application (written in Ruby) that lets you generate
62
- feature-rich bash command line tools.
63
-
64
- The design intention is to let you focus on your specific code, without
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:
70
-
71
- - 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).
74
- - Parsing the user's command line and extracting:
75
- - Optional or required **positional arguments**.
76
- - Optional or required **option flags** (with or without flag arguments).
77
- - **Commands** (and subcommands).
78
- - Standard flags (like **--help** and **--version**).
79
- - 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
- your tool performs, and merging it back to the final script.
82
- - Providing you with additional (optional) framework-style, standard
83
- library functions:
84
- - **Color output**.
85
- - **Config file management** (INI format).
86
- - **YAML parsing**.
87
- - **Bash completions**.
88
- - and more.
89
-
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
- file.
353
-
354
- In addition to suggesting subcommands and flags, you can instruct bashly to
355
- also suggest files, directories, users, git branches and more. To do this,
356
- add another option 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:
364
- - <directory>
365
- - <user>
366
- - $(git branch 2> /dev/null)
367
-
368
- ```
369
-
370
- - Anything between `<...>` will be added using the `compgen -A action` flag.
371
- - Anything else, will be appended to the `compgen -W` flag.
372
-
373
- For more information about these custom completions, see the documentation for
374
- the [completely][completely] gem.
375
-
376
-
377
- ## Real World Examples
378
-
379
- - [Rush][rush] - a Personal Package Manager
380
- - [Alf][alf] - a generator for bash aliases and sub-aliases
381
- - [git-changelog][git-changelog] - a change log generator
20
+ Visit the [Bashly Documentation][docs] site.
382
21
 
383
22
 
384
23
  ## Contributing / Support
@@ -389,8 +28,5 @@ to contribute, feel free to [open an issue][issues].
389
28
 
390
29
 
391
30
  [issues]: https://github.com/DannyBen/bashly/issues
392
- [rush]: https://github.com/DannyBen/rush-cli
393
- [alf]: https://github.com/DannyBen/alf
394
- [git-changelog]: https://github.com/DannyBen/git-changelog
395
- [completely]: https://github.com/DannyBen/completely
396
- [compgen]: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
31
+ [docs]: https://bashly.dannyb.co/
32
+
@@ -92,6 +92,11 @@ module Bashly
92
92
  commands.find { |c| c.default }
93
93
  end
94
94
 
95
+ # Returns an array of all the default Environment Variables
96
+ def default_environment_variables
97
+ environment_variables.select &:default
98
+ end
99
+
95
100
  # Returns an array of all the default Flags
96
101
  def default_flags
97
102
  flags.select &:default
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
@@ -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
@@ -1,4 +1,7 @@
1
1
  # :environment_variable.usage
2
2
  echo " <%= usage_string extended: true %>"
3
3
  printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
4
+ <%- if default -%>
5
+ printf " <%= strings[:default] % { value: default } -%>\n"
6
+ <%- end -%>
4
7
  echo
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.1
4
+ version: 0.6.2
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-07-21 00:00:00.000000000 Z
11
+ date: 2021-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole