bashly 0.6.0 → 0.6.4

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: 7fe733a46c8634cc39b4c792b177ca9ac7610a8d408714fa482b3c0ad15fc10f
4
- data.tar.gz: 908960de1cb2d682ff801630e0f6667a42df171612ed6a92aee72bcc369cc0e2
3
+ metadata.gz: 650f456561f180e0a39b2e6e0c66f6c5913438ac6301d44bff064470d602daba
4
+ data.tar.gz: 2f64d00edb50ce738d506568600d8b73b898aad6563990460a80a52d912a6e66
5
5
  SHA512:
6
- metadata.gz: 9e0dcf39faf63d5d798fac7ed41768994ec6715a58b898e390ec2a6019948497d314c08bc8ce1041fb5f1a105884a04d759e258085fdcf7fbbe87af1c4a7a4e0
7
- data.tar.gz: 83279b0a7df6eb6f3c2a779bbc54221e9cad58e6e08c4a207f1d592aa12329cc488d7169b682191be02474f098dbfda0f3d6ad6cd03e3a91e1bf793bb29fcdc3
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 beautiful bash scripts from simple YAML configuration
6
+ Create feature-rich bash scripts using simple YAML configuration
7
7
 
8
8
  [![Gem Version](https://badge.fury.io/rb/bashly.svg)](https://badge.fury.io/rb/bashly)
9
9
  [![Build Status](https://github.com/DannyBen/bashly/workflows/Test/badge.svg)](https://github.com/DannyBen/bashly/actions?query=workflow%3ATest)
10
10
  [![Maintainability](https://api.codeclimate.com/v1/badges/8cf89047e50ca601e431/maintainability)](https://codeclimate.com/github/DannyBen/bashly/maintainability)
11
11
 
12
+ ## [bashly.dannyb.co](https://bashly.dannyb.co)
13
+
12
14
  ---
13
15
 
14
16
  ![demo](demo/cast.svg)
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
- ## 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
- ```
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
- or with Docker:
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
- ## Prerequisites
31
+ ## Documentation
54
32
 
55
- The bash scripts generated by bashly require bash 4 or higher due to heavy
56
- use of associative arrays.
33
+ - [Bashly Homepage][docs]
34
+ - [Examples][examples]
57
35
 
36
+ ## How it works
58
37
 
59
- ## What is Bashly
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
- Bashly is a command line application (written in Ruby) that lets you generate
62
- feature-rich bash command line tools.
47
+ ## Features
63
48
 
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:
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 subcommands).
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
- your tool performs, and merging it back to the final script.
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
- [rush]: https://github.com/DannyBen/rush-cli
414
- [alf]: https://github.com/DannyBen/alf
415
- [git-changelog]: https://github.com/DannyBen/git-changelog
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
+
@@ -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\n yaml : generate a yaml compatible with 'completely'"
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 + completion_actions
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 tone (root) joined
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 << "[#{catch_all_label}]" if catch_all
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 teh config.
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"
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.4"
3
3
  end
@@ -0,0 +1,7 @@
1
+ # :command.catch_all_filter
2
+ <%- if catch_all_required? -%>
3
+ if [[ ${#other_args[@]} -eq 0 ]]; then
4
+ printf "<%= strings[:missing_required_argument] % { arg: catch_all_label, usage: usage_string } %>\n"
5
+ exit 1
6
+ fi
7
+ <%- 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
@@ -16,7 +16,7 @@ case "$1" in
16
16
  <%- end -%>
17
17
  long_usage=yes
18
18
  <%= function_name %>_usage
19
- exit 1
19
+ exit
20
20
  ;;
21
21
 
22
22
  esac
@@ -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
  }
@@ -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
data/lib/bashly.rb CHANGED
@@ -5,7 +5,6 @@ if ENV['BYEBUG']
5
5
  require 'lp'
6
6
  end
7
7
 
8
- requires 'bashly/polyfills'
9
8
  requires 'bashly/concerns'
10
9
 
11
10
  requires 'bashly/settings'
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.0
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-07-21 00:00:00.000000000 Z
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.16
172
+ rubygems_version: 3.2.25
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: Bash Command Line Tool Generator
@@ -1,12 +0,0 @@
1
- # :nocov:
2
-
3
- # Required for Ruby < 2.4
4
- if !Dir.respond_to? :empty?
5
- class Dir
6
- def self.empty?(path_name)
7
- exist?(path_name) && (entries(path_name) - ['.', '..']).empty?
8
- end
9
- end
10
- end
11
-
12
- # :nocov: