bashly 0.9.1 → 0.9.3

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: e1139c7453fff329c05879511103b80b6a89a76896a9d0cb3f5cad016d224b15
4
- data.tar.gz: acda8a068081a04a32218be7ddfee8cad1612b3dfafd9e1465170fd9cded32db
3
+ metadata.gz: 310bcfcf9a37601cdf37bd37f81c96fc8e33e4e38e601a4d496a2b8fed20e319
4
+ data.tar.gz: 72c4644b4051c9a290192c4d497bdcb80c8bdc5d473fe3c7bb01c40209f62a3d
5
5
  SHA512:
6
- metadata.gz: 61247ecd7b928a4babdbf307004424ffa060c567a16b4eb4b062c59e51eb9812f3469981ead958bb4f08aee8cb7ecd86a32a830f6102211012540eac0b878fd4
7
- data.tar.gz: 606e5df99d98e9853ed25a7fd516a807a90f1c40d7f19ac2ab1b8f3388a82919dd59af3b291d8de7b866d88cdcb8b1fec7883bd258b80c04f137b1729e58aca1
6
+ metadata.gz: 8b655051b58edb3182e022405484e006ef1ac6a7a0815fe6be77f38cbe57a5f9bf90adfa45be713719d718221451f9ab88087e4253fb7356651ff03f7ddc5b61
7
+ data.tar.gz: 992d1f15fdb7649375b2c1f8f09054b73dc7aef92c7e980995b7fd4c28671b42c9635078617ff10bba81a49836852b53151ef5559b53a55cf7070197a5937a01
data/README.md CHANGED
@@ -27,7 +27,6 @@ usually handled by a framework in any other programming language.
27
27
  It is available both as a [ruby gem](https://rubygems.org/gems/bashly) and as
28
28
  a [docker image](https://hub.docker.com/r/dannyben/bashly).
29
29
 
30
-
31
30
  ## Documentation
32
31
 
33
32
  - [Bashly Homepage][docs]
@@ -49,6 +48,7 @@ a [docker image](https://hub.docker.com/r/dannyben/bashly).
49
48
  Bashly is responsible for:
50
49
 
51
50
  - Generating a **single, standalone bash script**.
51
+ - Generating a **human readable, shellcheck-compliant and shfmt-compliant script**.
52
52
  - Generating **usage texts** and help screens, showing your tool's arguments, flags and commands (works for sub-commands also).
53
53
  - Parsing the user's command line and extracting:
54
54
  - Optional or required **positional arguments**.
@@ -72,15 +72,12 @@ to contribute, feel free to [open an issue][issues] or
72
72
 
73
73
  Visit the *[How to contribute][contributing]* page for more information.
74
74
 
75
-
76
75
  ## Stargazers and Forkers
77
76
 
78
77
  [![Stargazers repo roster for @DannyBen/bashly](https://reporoster.com/stars/DannyBen/bashly)](https://github.com/DannyBen/bashly/stargazers)
79
78
 
80
79
  [![Forkers repo roster for @DannyBen/bashly](https://reporoster.com/forks/DannyBen/bashly)](https://github.com/DannyBen/bashly/network/members)
81
80
 
82
-
83
-
84
81
  [issues]: https://github.com/DannyBen/bashly/issues
85
82
  [discussions]: https://github.com/DannyBen/bashly/discussions
86
83
  [docs]: https://bashly.dannyb.co/
data/lib/bashly/cli.rb CHANGED
@@ -14,6 +14,7 @@ module Bashly
14
14
  runner.route 'validate', to: Commands::Validate
15
15
  runner.route 'generate', to: Commands::Generate
16
16
  runner.route 'add', to: Commands::Add
17
+ runner.route 'doc', to: Commands::Doc
17
18
 
18
19
  runner
19
20
  end
@@ -0,0 +1,90 @@
1
+ module Bashly
2
+ module Commands
3
+ class Doc < Base
4
+ summary 'Show bashly reference documentation'
5
+ help 'This command displays bite-sized help for all the bashly configuration options in the terminal.'
6
+
7
+ usage 'bashly doc [SEARCH] [--index]'
8
+ usage 'bashly doc (-h|--help)'
9
+
10
+ option '-i --index', 'Show option keys only'
11
+ param 'SEARCH', 'Search for options that match this text'
12
+
13
+ example 'bashly doc command'
14
+ example 'bashly doc command.flags'
15
+ example 'bashly doc flag. -i'
16
+ example 'bashly doc catch_all'
17
+
18
+ def run
19
+ if args['--index']
20
+ puts data.keys
21
+ else
22
+ show
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def show
29
+ data.each do |key, info|
30
+ show_key key
31
+ show_help info['help']
32
+ show_example info['example'] if info['example']
33
+ show_url info['url'] if info['url']
34
+ end
35
+ end
36
+
37
+ def show_key(key)
38
+ say "!txtgrn!#{key}"
39
+ say ''
40
+ end
41
+
42
+ def show_url(url)
43
+ say " See !undblu!#{url}"
44
+ say ''
45
+ end
46
+
47
+ def show_example(example)
48
+ example = word_wrap " #{example}"
49
+ example.gsub!(/^(\s*- )?(\s*\w+):/, '\1!txtblu!\2!txtrst!:')
50
+ example.gsub!(/^(\s*- )/, '!txtylw!\1!txtrst!')
51
+ example.gsub!(/^(\s*#.+)/, '!txtpur!\1!txtrst!')
52
+ say example
53
+ say ''
54
+ end
55
+
56
+ def show_help(help)
57
+ help = word_wrap " #{help}"
58
+ help.gsub!(/`([^`]+)`/, '!txtgrn!\1!txtrst!')
59
+ say help
60
+ say ''
61
+ end
62
+
63
+ def data
64
+ return raw_data unless args['SEARCH']
65
+
66
+ result = raw_data.select { |k, _v| k.== args['SEARCH'] }
67
+ return result if result.any?
68
+
69
+ result = raw_data.select { |k, _v| k.include? args['SEARCH'] }
70
+ return result if result.any?
71
+
72
+ raise Error, "No match"
73
+ end
74
+
75
+ def raw_data
76
+ @raw_data ||= begin
77
+ result = {}
78
+ Dir["#{docs_dir}/*.yml"].sort.each do |path|
79
+ result.merge! YAML.load_file(path)
80
+ end
81
+ result
82
+ end
83
+ end
84
+
85
+ def docs_dir
86
+ @docs_dir ||= File.expand_path '../docs', __dir__
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,94 @@
1
+ arg:
2
+ help: Define positional arguments.
3
+ url: https://bashly.dannyb.co/configuration/argument/
4
+ example: |-
5
+ args:
6
+ - name: user
7
+ help: AWS Username.
8
+ required: true
9
+
10
+ - name: role
11
+ help: User role.
12
+ default: admin
13
+ allowed:
14
+ - admin
15
+ - guest
16
+
17
+ arg.allowed:
18
+ help: Specify a list of allowed values. Can be used in conjunction with `default` and `required`.
19
+ url: https://bashly.dannyb.co/configuration/argument/#allowed
20
+ example: |-
21
+ args:
22
+ - name: region
23
+ help: Region to connect to
24
+
25
+ # allowed + required
26
+ allowed: [eu, us]
27
+ required: true
28
+
29
+ - name: environment
30
+ help: Environment to connect to
31
+
32
+ # allowed + default
33
+ allowed: [stage, production, development]
34
+ default: development
35
+
36
+ arg.default:
37
+ help: Specify the value to apply when not provided by the user.
38
+ url: https://bashly.dannyb.co/configuration/argument/#default
39
+ example: |-
40
+ args:
41
+ - name: images
42
+ help: Image files to convert.
43
+ default: "*.jpg"
44
+
45
+ arg.help:
46
+ help: Specify the help message for this argument.
47
+ url: https://bashly.dannyb.co/configuration/argument/#help
48
+ example: |-
49
+ args:
50
+ - name: user
51
+ help: AWS Username.
52
+ required: true
53
+
54
+ arg.name:
55
+ help: Specify the lowercase name of the argument.
56
+ url: https://bashly.dannyb.co/configuration/argument/#name
57
+ example: |-
58
+ args:
59
+ - name: user
60
+ help: AWS Username.
61
+ required: true
62
+
63
+ arg.repeatable:
64
+ help: |-
65
+ Specify that this argument can be provided multiple times.
66
+
67
+ The argument below will be received as a space-delimited string which needs to be converted to an array with:
68
+ `eval "data=(${args[file]})"`
69
+
70
+ url: https://bashly.dannyb.co/configuration/argument/#repeatable
71
+ example: |-
72
+ args:
73
+ - name: file
74
+ help: One or more files to process
75
+ required: true
76
+ repeatable: true
77
+
78
+ arg.required:
79
+ help: Specify that this argument is required.
80
+ url: https://bashly.dannyb.co/configuration/argument/#required
81
+ example: |-
82
+ args:
83
+ - name: region
84
+ help: Region to connect to
85
+ required: true
86
+
87
+ arg.validate:
88
+ help: Apply custom validation functions.
89
+
90
+ url: https://bashly.dannyb.co/configuration/argument/#validate
91
+ example: |-
92
+ args:
93
+ - name: path
94
+ validate: file_exists
@@ -0,0 +1,310 @@
1
+ command:
2
+ help: Define the root command, or any sub-command.
3
+ url: https://bashly.dannyb.co/configuration/command/
4
+ example: |-
5
+ name: rush
6
+ help: Personal package manager
7
+ version: 0.6.5
8
+
9
+ commands:
10
+ - name: add
11
+ alias: a
12
+ help: Register a local repository
13
+ args:
14
+ - name: repo
15
+ required: true
16
+ help: Repository name.
17
+
18
+ command.alias:
19
+ help: Specify one or more aliases for this sub-command.
20
+ url: https://bashly.dannyb.co/configuration/command/#alias
21
+ example: |-
22
+ # Define a single alias
23
+ command:
24
+ name: download
25
+ alias: d
26
+
27
+ # Define multiple aliases
28
+ command:
29
+ name: download
30
+ alias: [d, pull]
31
+
32
+ # Run this command with anything that starts with 's'.
33
+ command:
34
+ name: server
35
+ alias: s*
36
+
37
+ command.args:
38
+ help: Define a list of positional arguments. See `arg` for reference.
39
+ url: https://bashly.dannyb.co/configuration/command/#args
40
+ example: |-
41
+ args:
42
+ - name: repo
43
+ required: true
44
+ help: Repository name.
45
+
46
+ command.catch_all:
47
+ help: Specify that this command should allow for additional arbitrary arguments or flags.
48
+ url: https://bashly.dannyb.co/configuration/command/#catch_all
49
+ example: |-
50
+ commands:
51
+ - name: download
52
+ help: Download one or more URLs
53
+
54
+ # Set to 'true' to simply enable this option
55
+ catch_all: true
56
+
57
+ - name: upload
58
+ help: Upload one or more files
59
+
60
+ # Use this extended syntax in order to also provide a usage label
61
+ # for these arguments, as well as specifying that at least one is
62
+ # required.
63
+ catch_all:
64
+ label: Files
65
+ help: Files to upload
66
+ required: true
67
+
68
+ command.commands:
69
+ help: Define a list of sub-commands. See `command` for reference.
70
+ url: https://bashly.dannyb.co/configuration/command/#commands
71
+ example: |-
72
+ commands:
73
+ - name: add
74
+ alias: a
75
+ help: Register a local repository
76
+
77
+ command.completions:
78
+ help: Specify a list of additional completion suggestions when used in conjunction with `bashly add comp`.
79
+ url: https://bashly.dannyb.co/configuration/command/#completions
80
+ example: |-
81
+ commands:
82
+ - name: view
83
+ help: View a directory, system user or a git branch
84
+ completions:
85
+ - <directory>
86
+ - <user>
87
+ - $(git branch 2> /dev/null)
88
+
89
+ command.default:
90
+ help: Specify that this sub-command will be executed implicitly.
91
+ url: https://bashly.dannyb.co/configuration/command/#default
92
+ example: |-
93
+ # This command will execute when the command line is not
94
+ # recognized.
95
+ commands:
96
+ - name: upload
97
+ help: Upload a file
98
+ default: true
99
+
100
+ # This command will execute when the command line is not
101
+ # recognized, or when it is empty.
102
+ commands:
103
+ - name: all
104
+ help: Run all tests
105
+ default: force
106
+
107
+ command.dependencies:
108
+ help: Specify a list of required external commands that are needed to run this command.
109
+ url: https://bashly.dannyb.co/configuration/command/#dependencies
110
+ example: |-
111
+ # Array syntax
112
+ dependencies:
113
+ - docker
114
+ - curl
115
+
116
+ # Hash syntax, to provide additional help message
117
+ dependencies:
118
+ docker: see https://docker.com for installation instructions
119
+ git: "install by running: sudo apt install git"
120
+
121
+ command.environment_variables:
122
+ help: Define a list of environment variables. See `environment_variable` for reference.
123
+ url: https://bashly.dannyb.co/configuration/command/#environment_variables
124
+ example: |-
125
+ environment_variables:
126
+ - name: config_path
127
+ help: Location of the config file
128
+ default: ~/config.ini
129
+ - name: api_key
130
+ help: Your API key
131
+ required: true
132
+
133
+ command.examples:
134
+ help: Define one or more example messages.
135
+ url: https://bashly.dannyb.co/configuration/command/#examples
136
+ example: |-
137
+ # Use an array of examples for simple one-liners.
138
+ examples:
139
+ - cli download example.com
140
+ - cli download example.com ./output -f
141
+
142
+ # Use a multi-line string when you need more control.
143
+ # Note the use of the '|-' marker that tells YAML to use the
144
+ # string as is, including the newlines it contains.
145
+ examples: |-
146
+ Upload a file
147
+ $ cli upload profile.png -u admin -p s3cr3t
148
+
149
+ Upload a file (you will be prompted to provide a password)
150
+ $ cli upload profile.png --user admin
151
+
152
+ command.expose:
153
+ help: Specify that the sub-commands of this command should be visible when showing the usage of its parent.
154
+ url: https://bashly.dannyb.co/configuration/command/#expose
155
+ example: |-
156
+ name: cli
157
+ commands:
158
+ - name: config
159
+ help: Config management commands
160
+
161
+ # Set to 'true' to show both 'config edit' and 'config show' when
162
+ # running 'cli --help'
163
+ expose: true
164
+ commands:
165
+ - name: edit
166
+ help: Edit config file
167
+ - name: show
168
+ help: Show config file
169
+
170
+ - name: server
171
+ help: Server management commands
172
+
173
+ # Set to 'always' to also show the usage of the sub-commands when
174
+ # running 'cli' without arguments.
175
+ expose: always
176
+
177
+ commands:
178
+ - name: start
179
+ help: Start the server
180
+ - name: stop
181
+ help: Stop the server
182
+
183
+ command.extensible:
184
+ help: Specify that this command can be extended by external means.
185
+ url: https://bashly.dannyb.co/configuration/command/#extensible
186
+ example: |-
187
+ name: mygit
188
+ help: Wrapper for git
189
+ version: 0.1.0
190
+
191
+ # Set to 'true' to allow extending it by creating executables in the
192
+ # path named 'mygit-*'.
193
+ extensible: true
194
+
195
+ # Set to another executable name to delegate all unknown commands
196
+ # to it.
197
+ extensible: git
198
+
199
+ command.filename:
200
+ help: Specify the path (relative to src) to the partial source code file.
201
+ url: https://bashly.dannyb.co/configuration/command/#filename
202
+ example: |-
203
+ commands:
204
+ - name: connect
205
+ help: Connect to server
206
+ filename: admin_commands/list.sh
207
+
208
+ command.filters:
209
+ help: Specify a list of custom filter functions that will prevent the command from running unless certain conditions are met.
210
+ url: https://bashly.dannyb.co/configuration/command/#filters
211
+ example: |-
212
+ commands:
213
+ - name: container
214
+ help: Perform actions on a docker container
215
+
216
+ # When the command is executed, your script will look for a function
217
+ # named 'filter_docker_running' and execute it. If it prints a string,
218
+ # it will be considered an error and the command execution will be
219
+ # halted.
220
+ filters:
221
+ - docker_running
222
+
223
+ # Example function (put somewhere in src/lib)
224
+ filter_docker_running() {
225
+ docker info >/dev/null 2>&1 || echo "Docker must be running"
226
+ }
227
+
228
+ command.flags:
229
+ help: Define a list of option flags. See `flag` for reference.
230
+ url: https://bashly.dannyb.co/configuration/command/#flags
231
+ example: |-
232
+ flags:
233
+ - long: --purge
234
+ short: -p
235
+ help: Also remove the local directory.
236
+
237
+ command.footer:
238
+ help: Specify a message to show at the bottom of the help text.
239
+ url: https://bashly.dannyb.co/configuration/command/#footer
240
+ example: |-
241
+ footer: For further help visit https://my.docs-site.com
242
+
243
+ command.function:
244
+ help: Specify a different base function name for this command.
245
+ url: https://bashly.dannyb.co/configuration/command/#function
246
+ example: |-
247
+ commands:
248
+ - name: container-start
249
+ help: Start a new container (deprecated)
250
+
251
+ # Override the name of the internal functions bashly uses. This is
252
+ # needed in this case since the command 'container-start' and the
253
+ # nested command 'container start' will have the same underlying
254
+ # function name otherwise.
255
+ function: deprecated_container_start
256
+ footer: This command is deprecated, use 'container start' instead
257
+
258
+ - name: container
259
+ help: Container commands
260
+ commands:
261
+ - name: start
262
+ help: Start a new container
263
+
264
+ command.group:
265
+ help: Specify the group that this command belongs to.
266
+ url: https://bashly.dannyb.co/configuration/command/#group
267
+ example: |-
268
+ command:
269
+ name: start
270
+ help: Start the server
271
+ group: Server
272
+
273
+ command.help:
274
+ help: Specify the help text to show when displaying usage.
275
+ url: https://bashly.dannyb.co/configuration/command/#help
276
+ example: |-
277
+ name: docker
278
+ help: Runtime for containers
279
+
280
+ commands:
281
+ - name: images
282
+ help: Manage images
283
+
284
+ command.name:
285
+ help: Specify the name of the command. This option is required.
286
+ url: https://bashly.dannyb.co/configuration/command/#name
287
+ example: |-
288
+ name: docker
289
+ help: Runtime for containers
290
+
291
+ commands:
292
+ - name: images
293
+ help: Manage images
294
+
295
+ command.private:
296
+ help: Specify that this command should not be displayed in the help text.
297
+ url: https://bashly.dannyb.co/configuration/command/#private
298
+ example: |-
299
+ commands:
300
+ - name: completions
301
+ help: Send bash completions
302
+ private: true
303
+
304
+ command.version:
305
+ help: Specify the version to show when running with `--version`.
306
+ url: https://bashly.dannyb.co/configuration/command/#version
307
+ example: |-
308
+ name: rush
309
+ help: Personal package manager
310
+ version: 0.6.5
@@ -0,0 +1,54 @@
1
+ environment_variable:
2
+ help: Define environment variables that will be in use in your script.
3
+ url: https://bashly.dannyb.co/configuration/environment-variable/
4
+ example: |-
5
+ environment_variables:
6
+ - name: config_path
7
+ help: Location of the config file
8
+ default: ~/config.ini
9
+ - name: api_key
10
+ help: Your API key
11
+ required: true
12
+
13
+ environment_variable.default:
14
+ help: Specify the value to apply when not provided by the user.
15
+ url: https://bashly.dannyb.co/configuration/environment-variable/#default
16
+ example: |-
17
+ environment_variables:
18
+ - name: config_path
19
+ help: Location of the config file
20
+ default: ~/config.ini
21
+
22
+ environment_variable.help:
23
+ help: Specify the help message for this variable.
24
+ url: https://bashly.dannyb.co/configuration/environment-variable/#help
25
+ example: |-
26
+ environment_variables:
27
+ - name: api_key
28
+ help: Your API key
29
+
30
+ environment_variable.name:
31
+ help: Specify the lowercase name of the variable.
32
+ url: https://bashly.dannyb.co/configuration/environment-variable/#name
33
+ example: |-
34
+ environment_variables:
35
+ - name: api_key
36
+ help: Your API key
37
+
38
+ environment_variable.private:
39
+ help: Specify that this environment variable should not be advertised in the usage text. Only makes sense when accompanied by `default`.
40
+ url: https://bashly.dannyb.co/configuration/environment-variable/#private
41
+ example: |-
42
+ environment_variables:
43
+ - name: editor
44
+ help: Editor to use
45
+ default: vim
46
+ private: true
47
+
48
+ environment_variable.required:
49
+ help: Specify that this variable is required.
50
+ url: https://bashly.dannyb.co/configuration/environment-variable/#required
51
+ example: |-
52
+ - name: api_key
53
+ help: Your API key
54
+ required: true
@@ -0,0 +1,163 @@
1
+ flag:
2
+ help: Define option flags.
3
+ url: https://bashly.dannyb.co/configuration/flag/
4
+ example: |-
5
+ flags:
6
+ - long: --ssh
7
+ short: -s
8
+ help: Clone using SSH
9
+
10
+ - long: --user
11
+ short: -u
12
+ arg: name
13
+ help: Repository user name
14
+ required: true
15
+
16
+ flag.allowed:
17
+ help: Specify a list of allowed values. Can be used in conjunction with `default` and `required`, and must be accompanied by `arg`.
18
+ url: https://bashly.dannyb.co/configuration/flag/#allowed
19
+ example: |-
20
+ flags:
21
+ - long: --user
22
+ short: -u
23
+ arg: name
24
+ help: User name
25
+
26
+ # allowed + required
27
+ allowed: [user, admin]
28
+ required: true
29
+
30
+ - long: --protocol
31
+ short: -p
32
+ arg: type
33
+ help: Protocol to connect with
34
+
35
+ # allowed + default
36
+ allowed: [ftp, ssh, http]
37
+ default: ssh
38
+
39
+ flag.arg:
40
+ help: Specify the name of the argument for this flag, in case it requires any.
41
+ url: https://bashly.dannyb.co/configuration/flag/#arg
42
+ example: |-
43
+ flags:
44
+ - long: --ssh
45
+ short: -s
46
+ help: Clone using SSH
47
+
48
+ flag.completions:
49
+ help: Specify a list of additional completion suggestions when used in conjunction with `bashly add comp`. Must be accompanied by `arg`.
50
+ url: https://bashly.dannyb.co/configuration/flag/#completions
51
+ example: |-
52
+ flags:
53
+ - long: --user
54
+ arg: username
55
+ completions:
56
+ - <user>
57
+
58
+ # Anything in the 'allowed' option is automatically added as a completion.
59
+ - long: --protocol
60
+ arg: protocol
61
+ allowed:
62
+ - ssh
63
+ - telnet
64
+
65
+ flag.conflicts:
66
+ help: Specify that this flag is mutually exclusive with one or more other flags. Use the long name of these conflicting flags.
67
+ url: https://bashly.dannyb.co/configuration/flag/#conflicts
68
+ example: |-
69
+ flags:
70
+ - long: --cache
71
+ help: Enable cache
72
+
73
+ # Running --cache with --no-cache is not permitted
74
+ conflicts: [--no-cache]
75
+
76
+ - long: --no-cache
77
+ help: Disable cache
78
+
79
+ # Running --no-cache with --cache or with --fast is not permitted
80
+ conflicts: [--cache, --fast]
81
+
82
+ - long: --fast
83
+ help: Run faster
84
+
85
+ # Make sure to add the conflicting flags on both sides of the conflict
86
+ conflicts: [--no-cache]
87
+
88
+ flag.default:
89
+ help: Specify the value to apply when not provided by the user.
90
+ url: https://bashly.dannyb.co/configuration/flag/#default
91
+ example: |-
92
+ flags:
93
+ - long: --environment
94
+ arg: name
95
+ help: Set environment name
96
+ default: production
97
+
98
+ flag.help:
99
+ help: Specify the help message for this flag.
100
+ url: https://bashly.dannyb.co/configuration/flag/#help
101
+ example: |-
102
+ flags:
103
+ - long: --cache
104
+ help: Enable cache
105
+
106
+ flag.long:
107
+ help: Specify the long form of the flag, including the -- prefix. Either `long` or `short` is required.
108
+ url: https://bashly.dannyb.co/configuration/flag/#long
109
+ example: |-
110
+ flags:
111
+ - long: --ssh
112
+ short: -s
113
+ help: Clone using SSH
114
+
115
+ flag.repeatable:
116
+ help: |-
117
+ Specify that this flag can be provided multiple times. When used on a flag with an argument, it will be received as a space-delimited string, which needs to be converted to an array with:
118
+ `eval "data=(${args[--data]})"`
119
+
120
+ url: https://bashly.dannyb.co/configuration/flag/#repeatable
121
+ example: |-
122
+ flags:
123
+ - long: --data
124
+ short: -d
125
+ arg: data
126
+ help: Provide data values
127
+ required: true
128
+ repeatable: true
129
+
130
+ - long: --verbose
131
+ short: -v
132
+ help: Set verbosity level
133
+ repeatable: true
134
+
135
+ flag.required:
136
+ help: Specify that this flag is required.
137
+ url: https://bashly.dannyb.co/configuration/flag/#required
138
+ example: |-
139
+ args:
140
+ - long: --user
141
+ arg: name
142
+ help: Repository user name
143
+ required: true
144
+
145
+ flag.short:
146
+ help: Specify the short form of the flag, including the - prefix. Either `long` or `short` is required.
147
+ url: https://bashly.dannyb.co/configuration/flag/#short
148
+ example: |-
149
+ - long: --user
150
+ short: -u
151
+ arg: name
152
+ help: Repository user name
153
+
154
+ flag.validate:
155
+ help: Apply custom validation functions. Must be accompanied by `arg`.
156
+
157
+ url: https://bashly.dannyb.co/configuration/flag/#validate
158
+ example: |-
159
+ flags:
160
+ - long: --config
161
+ arg: path
162
+ help: Load configuration from a file
163
+ validate: file_exists
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = '0.9.1'
2
+ VERSION = '0.9.3'
3
3
  end
@@ -24,6 +24,7 @@ elsif extensible.is_a? String
24
24
  > printf "{{ strings[:invalid_command] }}\n" "$action" >&2
25
25
  > exit 1
26
26
  > fi
27
+ > ;;
27
28
  >
28
29
 
29
30
  elsif extensible
@@ -34,6 +35,7 @@ elsif extensible
34
35
  > printf "{{ strings[:invalid_command] }}\n" "$action" >&2
35
36
  > exit 1
36
37
  > fi
38
+ > ;;
37
39
  >
38
40
 
39
41
  else
@@ -2,11 +2,11 @@ if default_args.any? or default_flags.any?
2
2
  = view_marker
3
3
 
4
4
  default_args.each do |arg|
5
- > [[ -n ${args[{{ arg.name }}]:-} ]] || args[{{ arg.name }}]="{{ arg.default }}"
5
+ > [[ -n ${args['{{ arg.name }}']:-} ]] || args['{{ arg.name }}']="{{ arg.default }}"
6
6
  end
7
7
 
8
8
  default_flags.each do |flag|
9
- > [[ -n ${args[{{ flag.long }}]:-} ]] || args[{{ flag.long }}]="{{ flag.default }}"
9
+ > [[ -n ${args['{{ flag.long }}']:-} ]] || args['{{ flag.long }}']="{{ flag.default }}"
10
10
  end
11
11
 
12
12
  >
@@ -4,14 +4,14 @@
4
4
  > case "${1:-}" in
5
5
 
6
6
  if root_command?
7
- = short_flag_exist?("-v") ? "--version)" : "--version | -v)".indent(4)
7
+ = (short_flag_exist?("-v") ? "--version)" : "--version | -v)").indent(4)
8
8
  > version_command
9
9
  > exit
10
10
  > ;;
11
11
  >
12
12
  end
13
13
 
14
- = short_flag_exist?("-h") ? "--help)" : "--help | -h)".indent(4)
14
+ = (short_flag_exist?("-h") ? "--help)" : "--help | -h)").indent(4)
15
15
  > long_usage=yes
16
16
  > <%= function_name %>_usage
17
17
  > exit
@@ -3,9 +3,9 @@
3
3
  if args.any?
4
4
  condition = "if"
5
5
  args.each do |arg|
6
- > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
6
+ > {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
7
7
  = arg.render(:validations).indent 2
8
- > args[{{ arg.name }}]=$1
8
+ > args['{{ arg.name }}']=$1
9
9
  > shift
10
10
 
11
11
  condition = "elif"
@@ -2,18 +2,17 @@
2
2
 
3
3
  condition = "if"
4
4
  args.each do |arg|
5
- > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
6
- = arg.render(:validations).indent 2
7
-
5
+ = arg.render(:validations)
6
+ > {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
8
7
  if arg.repeatable
9
- > args[{{ arg.name }}]="\"$1\""
8
+ > args['{{ arg.name }}']="\"$1\""
10
9
  > shift
11
10
  > else
12
- > args[{{ arg.name }}]="${args[{{ arg.name }}]} \"$1\""
11
+ > args['{{ arg.name }}']="${args[{{ arg.name }}]} \"$1\""
13
12
  > shift
14
13
 
15
14
  else
16
- > args[{{ arg.name }}]=$1
15
+ > args['{{ arg.name }}']=$1
17
16
  > shift
18
17
 
19
18
  end
@@ -3,9 +3,9 @@
3
3
  if args.any?
4
4
  condition = "if"
5
5
  args.each do |arg|
6
- > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
6
+ > {{ condition }} [[ -z ${args['{{ arg.name }}']+x} ]]; then
7
7
  > {{ arg.render(:validations).indent 2 }}
8
- > args[{{ arg.name }}]=$1
8
+ > args['{{ arg.name }}']=$1
9
9
  > shift
10
10
 
11
11
  condition = "elif"
@@ -11,8 +11,16 @@ unless global_flags?
11
11
  end
12
12
 
13
13
  >
14
- > -?*)
14
+ if catch_all.enabled?
15
+ > --)
16
+ > shift
17
+ > other_args+=("$@")
18
+ > break
19
+ > ;;
20
+ >
21
+ end
15
22
 
23
+ > -?*)
16
24
  if catch_all.enabled?
17
25
  > other_args+=("$1")
18
26
  > shift
@@ -2,7 +2,7 @@ if required_args.any?
2
2
  = view_marker
3
3
 
4
4
  required_args.each do |arg|
5
- > if [[ -z ${args[{{ arg.name }}]+x} ]]; then
5
+ > if [[ -z ${args['{{ arg.name }}']+x} ]]; then
6
6
  > printf "{{ strings[:missing_required_argument] % { arg: arg.name.upcase, usage: usage_string } }}\n" >&2
7
7
  > exit 1
8
8
  > fi
@@ -2,7 +2,7 @@ if required_flags.any?
2
2
  = view_marker
3
3
 
4
4
  required_flags.each do |flag|
5
- > if [[ -z ${args[{{ flag.long }}]+x} ]]; then
5
+ > if [[ -z ${args['{{ flag.long }}']+x} ]]; then
6
6
  > printf "{{ strings[:missing_required_flag] % { usage: flag.usage_string } }}\n" >&2
7
7
  > exit 1
8
8
  > fi
@@ -11,7 +11,7 @@
11
11
 
12
12
  deep_commands.each do |command|
13
13
  > "{{ command.action_name }}")
14
- > if [[ ${args[--help]:-} ]]; then
14
+ > if [[ ${args['--help']:-} ]]; then
15
15
  > long_usage=yes
16
16
  > {{ command.function_name }}_usage
17
17
  > else
@@ -12,7 +12,7 @@ if whitelisted_args.any? or whitelisted_flags.any?
12
12
  > done
13
13
 
14
14
  else
15
- > if [[ ! ${args[{{ arg.name }}]} =~ ^({{ arg.allowed.join '|' }})$ ]]; then
15
+ > if [[ ! ${args['{{ arg.name }}']} =~ ^({{ arg.allowed.join '|' }})$ ]]; then
16
16
  > printf "%s\n" "{{ strings[:disallowed_argument] % { name: arg.name, allowed: arg.allowed.join(', ') } }}" >&2
17
17
  > exit 1
18
18
  > fi
@@ -31,7 +31,7 @@ if whitelisted_args.any? or whitelisted_flags.any?
31
31
  > done
32
32
 
33
33
  else
34
- > if [[ ! ${args[{{ flag.name }}]} =~ ^({{ flag.allowed.join '|' }})$ ]]; then
34
+ > if [[ ! ${args['{{ flag.name }}']} =~ ^({{ flag.allowed.join '|' }})$ ]]; then
35
35
  > printf "%s\n" "{{ strings[:disallowed_flag] % { name: flag.name, allowed: flag.allowed.join(', ') } }}" >&2
36
36
  > exit 1
37
37
  > fi
@@ -4,14 +4,14 @@
4
4
  = render(:validations).indent 2
5
5
 
6
6
  if repeatable
7
- > if [[ -z ${args[{{ name }}]+x} ]]; then
8
- > args[{{ name }}]="\"$2\""
7
+ > if [[ -z ${args['{{ name }}']+x} ]]; then
8
+ > args['{{ name }}']="\"$2\""
9
9
  > else
10
- > args[{{ name }}]="${args[{{ name }}]} \"$2\""
10
+ > args['{{ name }}']="${args[{{ name }}]} \"$2\""
11
11
  > fi
12
12
 
13
13
  else
14
- > args[{{ name }}]="$2"
14
+ > args['{{ name }}']="$2"
15
15
 
16
16
  end
17
17
 
@@ -1,9 +1,9 @@
1
1
  = view_marker
2
2
 
3
3
  if repeatable
4
- > ((args[<%= name %>]+=1))
4
+ > ((args['<%= name %>'] += 1))
5
5
  else
6
- > args[<%= name %>]=1
6
+ > args['<%= name %>']=1
7
7
  end
8
8
 
9
9
  > shift
@@ -3,7 +3,7 @@ if conflicts
3
3
  = view_marker
4
4
 
5
5
  if conflicts.count == 1
6
- > if [[ -n "${args[{{ conflicts.first }}]:-}" ]]; then
6
+ > if [[ -n "${args['{{ conflicts.first }}']:-}" ]]; then
7
7
  > printf "{{ strings[:conflicting_flags] }}\n" "$key" "{{ conflicts.first }}" >&2
8
8
  > exit 1
9
9
  > fi
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.9.1
4
+ version: 0.9.3
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: 2022-12-09 00:00:00.000000000 Z
11
+ date: 2022-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: completely
@@ -121,6 +121,7 @@ files:
121
121
  - lib/bashly/cli.rb
122
122
  - lib/bashly/commands/add.rb
123
123
  - lib/bashly/commands/base.rb
124
+ - lib/bashly/commands/doc.rb
124
125
  - lib/bashly/commands/generate.rb
125
126
  - lib/bashly/commands/init.rb
126
127
  - lib/bashly/commands/preview.rb
@@ -132,6 +133,10 @@ files:
132
133
  - lib/bashly/config.rb
133
134
  - lib/bashly/config_validator.rb
134
135
  - lib/bashly/deprecation.rb
136
+ - lib/bashly/docs/arg.yml
137
+ - lib/bashly/docs/command.yml
138
+ - lib/bashly/docs/env.yml
139
+ - lib/bashly/docs/flag.yml
135
140
  - lib/bashly/exceptions.rb
136
141
  - lib/bashly/extensions/array.rb
137
142
  - lib/bashly/extensions/file.rb
@@ -247,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
252
  - !ruby/object:Gem::Version
248
253
  version: '0'
249
254
  requirements: []
250
- rubygems_version: 3.3.26
255
+ rubygems_version: 3.4.0
251
256
  signing_key:
252
257
  specification_version: 4
253
258
  summary: Bash Command Line Tool Generator