bashly 0.6.3 → 0.6.7
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 +47 -2
- data/lib/bashly/models/command.rb +15 -4
- data/lib/bashly/templates/lib/config.sh +17 -14
- data/lib/bashly/version.rb +1 -1
- data/lib/bashly/views/argument/usage.erb +4 -4
- data/lib/bashly/views/command/catch_all_filter.erb +7 -0
- data/lib/bashly/views/command/command_fallback.erb +5 -5
- data/lib/bashly/views/command/command_filter.erb +5 -5
- data/lib/bashly/views/command/command_functions.erb +2 -2
- data/lib/bashly/views/command/default_assignments.erb +4 -4
- data/lib/bashly/views/command/dependencies_filter.erb +4 -4
- data/lib/bashly/views/command/environment_variables_filter.erb +9 -9
- data/lib/bashly/views/command/fixed_flags_filter.erb +7 -7
- data/lib/bashly/views/command/master_script.erb +1 -0
- data/lib/bashly/views/command/normalize_input.erb +24 -0
- data/lib/bashly/views/command/parse_requirements.erb +6 -5
- data/lib/bashly/views/command/parse_requirements_case.erb +11 -11
- data/lib/bashly/views/command/parse_requirements_while.erb +5 -5
- data/lib/bashly/views/command/required_args_filter.erb +2 -2
- data/lib/bashly/views/command/required_flags_filter.erb +4 -4
- data/lib/bashly/views/command/run.erb +3 -1
- data/lib/bashly/views/command/usage_args.erb +6 -6
- data/lib/bashly/views/command/usage_commands.erb +12 -12
- data/lib/bashly/views/command/usage_environment_variables.erb +2 -2
- data/lib/bashly/views/command/usage_examples.erb +2 -2
- data/lib/bashly/views/command/usage_fixed_flags.erb +8 -8
- data/lib/bashly/views/command/usage_flags.erb +2 -2
- data/lib/bashly/views/command/user_lib.erb +2 -2
- data/lib/bashly/views/command/whitelist_filter.erb +4 -4
- data/lib/bashly/views/environment_variable/usage.erb +2 -2
- data/lib/bashly/views/flag/case.erb +3 -3
- data/lib/bashly/views/flag/usage.erb +4 -4
- data/lib/bashly.rb +0 -1
- metadata +11 -12
- 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: c47271e43a775ff08c071428540301ed1fa0656c7d58020c9825dfbc492804ef
|
4
|
+
data.tar.gz: fdc8ac40f1d18c2bc90ae4700fd0757e55132852bbdf8700a2829a02dd3be61c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aff1e0723cdfdc10c409697cb2c715a37382dc7dbef3da3afe3b0e45fc8c91255ffeda153d24a25aa3bdcdf67ff863cfa7bec4558f79fced3d3ff33dc720b4d1
|
7
|
+
data.tar.gz: 54aa504a25003ddf1331e39de9b68612d2fff39bedc93dfc09bc961254c6b4ba7beacadf90412af6d76f9159bffb48456b6d6e85e5c805864372221f2edfbe2e
|
data/README.md
CHANGED
@@ -3,22 +3,66 @@
|
|
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.
|
22
|
+
|
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.
|
26
|
+
|
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).
|
29
|
+
|
30
|
+
|
18
31
|
## Documentation
|
19
32
|
|
20
|
-
|
33
|
+
- [Bashly Homepage][docs]
|
34
|
+
- [Examples][examples]
|
35
|
+
|
36
|
+
## How it works
|
37
|
+
|
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)).
|
46
|
+
|
47
|
+
## Features
|
48
|
+
|
49
|
+
Bashly is responsible for:
|
21
50
|
|
51
|
+
- Generating a **single, standalone bash script**.
|
52
|
+
- Generating **usage texts** and help screens, showing your tool's arguments, flags and commands (works for sub-commands also).
|
53
|
+
- Parsing the user's command line and extracting:
|
54
|
+
- Optional or required **positional arguments**.
|
55
|
+
- Optional or required **option flags** (with or without flag arguments).
|
56
|
+
- **Commands** (and sub-commands).
|
57
|
+
- Standard flags (like **--help** and **--version**).
|
58
|
+
- Preventing your script from running unless the command line is valid.
|
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:
|
61
|
+
- **Color output**.
|
62
|
+
- **Config file management** (INI format).
|
63
|
+
- **YAML parsing**.
|
64
|
+
- **Bash completions**.
|
65
|
+
- and more.
|
22
66
|
|
23
67
|
## Contributing / Support
|
24
68
|
|
@@ -29,4 +73,5 @@ to contribute, feel free to [open an issue][issues].
|
|
29
73
|
|
30
74
|
[issues]: https://github.com/DannyBen/bashly/issues
|
31
75
|
[docs]: https://bashly.dannyb.co/
|
76
|
+
[examples]: https://github.com/DannyBen/bashly/tree/master/examples#bashly-examples
|
32
77
|
|
@@ -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
|
@@ -190,7 +201,7 @@ module Bashly
|
|
190
201
|
result << arg.usage_string
|
191
202
|
end
|
192
203
|
result << "[options]" unless flags.empty?
|
193
|
-
result <<
|
204
|
+
result << catch_all_usage if catch_all
|
194
205
|
result.join " "
|
195
206
|
end
|
196
207
|
|
@@ -198,7 +209,7 @@ module Bashly
|
|
198
209
|
# This is meant to provide the user with the ability to add custom
|
199
210
|
# functions
|
200
211
|
def user_lib
|
201
|
-
@user_lib ||= Dir["#{Settings.source_dir}/lib/**/*.sh"]
|
212
|
+
@user_lib ||= Dir["#{Settings.source_dir}/lib/**/*.sh"].sort
|
202
213
|
end
|
203
214
|
|
204
215
|
# Raise an exception if there are some serious issues with the command
|
@@ -227,4 +238,4 @@ module Bashly
|
|
227
238
|
|
228
239
|
end
|
229
240
|
end
|
230
|
-
end
|
241
|
+
end
|
@@ -10,7 +10,7 @@
|
|
10
10
|
# ---
|
11
11
|
|
12
12
|
# Create a new config file.
|
13
|
-
# There is normally no need to use this
|
13
|
+
# There is normally no need to use this function, it is used by other
|
14
14
|
# functions as needed.
|
15
15
|
config_init() {
|
16
16
|
CONFIG_FILE=${CONFIG_FILE:=config.ini}
|
@@ -20,8 +20,9 @@ config_init() {
|
|
20
20
|
# Get a value from the config.
|
21
21
|
# Usage: result=$(config_get hello)
|
22
22
|
config_get() {
|
23
|
-
key=$1
|
24
|
-
regex="^$key *= *(.+)$"
|
23
|
+
local key=$1
|
24
|
+
local regex="^$key *= *(.+)$"
|
25
|
+
local value=""
|
25
26
|
|
26
27
|
config_init
|
27
28
|
|
@@ -38,15 +39,16 @@ config_get() {
|
|
38
39
|
# Add or update a key=value pair in the config.
|
39
40
|
# Usage: config_set key value
|
40
41
|
config_set() {
|
41
|
-
key=$1
|
42
|
+
local key=$1
|
42
43
|
shift
|
43
|
-
value="$*"
|
44
|
+
local value="$*"
|
44
45
|
|
45
46
|
config_init
|
46
47
|
|
47
|
-
regex="^($key) *= *.+$"
|
48
|
-
output=""
|
49
|
-
found_key=""
|
48
|
+
local regex="^($key) *= *.+$"
|
49
|
+
local output=""
|
50
|
+
local found_key=""
|
51
|
+
local newline
|
50
52
|
|
51
53
|
while IFS= read -r line || [ -n "$line" ]; do
|
52
54
|
newline=$line
|
@@ -69,15 +71,14 @@ config_set() {
|
|
69
71
|
# Delete a key from the config.
|
70
72
|
# Usage: config_del key
|
71
73
|
config_del() {
|
72
|
-
key=$1
|
74
|
+
local key=$1
|
73
75
|
|
74
|
-
regex="^($key) *="
|
75
|
-
output=""
|
76
|
+
local regex="^($key) *="
|
77
|
+
local output=""
|
76
78
|
|
77
79
|
config_init
|
78
80
|
|
79
81
|
while IFS= read -r line || [ -n "$line" ]; do
|
80
|
-
newline=$line
|
81
82
|
if [[ $line ]] && [[ ! $line =~ $regex ]]; then
|
82
83
|
output="$output$line\n"
|
83
84
|
fi
|
@@ -100,11 +101,13 @@ config_show() {
|
|
100
101
|
# done
|
101
102
|
#
|
102
103
|
config_keys() {
|
103
|
-
regex="^([a-zA-Z0-9_\-\/\.]+) *="
|
104
|
+
local regex="^([a-zA-Z0-9_\-\/\.]+) *="
|
104
105
|
|
105
106
|
config_init
|
106
107
|
|
107
|
-
keys=()
|
108
|
+
local keys=()
|
109
|
+
local key
|
110
|
+
|
108
111
|
while IFS= read -r line || [ -n "$line" ]; do
|
109
112
|
if [[ $line =~ $regex ]]; then
|
110
113
|
key="${BASH_REMATCH[1]}"
|
data/lib/bashly/version.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# :argument.usage
|
2
2
|
echo " <%= name.upcase %>"
|
3
3
|
printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
|
4
|
-
|
4
|
+
% if allowed
|
5
5
|
printf " <%= strings[:allowed] % { values: allowed.join(', ') } -%>\n"
|
6
|
-
|
7
|
-
|
6
|
+
% end
|
7
|
+
% if default
|
8
8
|
printf " <%= strings[:default] % { value: default } -%>\n"
|
9
|
-
|
9
|
+
% end
|
10
10
|
echo
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# :command.command_fallback
|
2
|
-
|
2
|
+
% if default_command
|
3
3
|
"" )
|
4
4
|
<%= function_name %>_usage
|
5
5
|
exit 1
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<%= default_command.function_name %>_parse_requirements "$@"
|
11
11
|
shift $#
|
12
12
|
;;
|
13
|
-
|
13
|
+
% elsif extensible.is_a? String
|
14
14
|
"" )
|
15
15
|
<%= function_name %>_usage
|
16
16
|
exit 1
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<%= function_name %>_usage
|
24
24
|
exit 1
|
25
25
|
fi
|
26
|
-
|
26
|
+
% elsif extensible
|
27
27
|
"" )
|
28
28
|
<%= function_name %>_usage
|
29
29
|
exit 1
|
@@ -37,9 +37,9 @@
|
|
37
37
|
<%= function_name %>_usage
|
38
38
|
exit 1
|
39
39
|
fi
|
40
|
-
|
40
|
+
% else
|
41
41
|
* )
|
42
42
|
<%= function_name %>_usage
|
43
43
|
exit 1
|
44
44
|
;;
|
45
|
-
|
45
|
+
% end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# :command.command_filter
|
2
|
-
|
2
|
+
% if commands.any?
|
3
3
|
action=$1
|
4
4
|
|
5
5
|
case $action in
|
6
6
|
-* )
|
7
7
|
;;
|
8
8
|
|
9
|
-
|
9
|
+
% commands.each do |command|
|
10
10
|
<%= command.aliases.join " | " %> )
|
11
11
|
action="<%= command.name %>"
|
12
12
|
shift
|
@@ -14,9 +14,9 @@ case $action in
|
|
14
14
|
shift $#
|
15
15
|
;;
|
16
16
|
|
17
|
-
|
17
|
+
% end
|
18
18
|
<%= render :command_fallback %>
|
19
19
|
esac
|
20
|
-
|
20
|
+
% else
|
21
21
|
action="<%= action_name %>"
|
22
|
-
|
22
|
+
% end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# :command.default_assignments
|
2
|
-
|
2
|
+
% default_args.each do |arg|
|
3
3
|
[[ -n ${args[<%= arg.name %>]} ]] || args[<%= arg.name %>]="<%= arg.default %>"
|
4
|
-
|
5
|
-
|
4
|
+
% end
|
5
|
+
% default_flags.each do |flag|
|
6
6
|
[[ -n ${args[<%= flag.long %>]} ]] || args[<%= flag.long %>]="<%= flag.default %>"
|
7
|
-
|
7
|
+
% end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# :command.dependencies_filter
|
2
|
-
|
3
|
-
|
2
|
+
% if dependencies
|
3
|
+
% dependencies.each do |dependency|
|
4
4
|
if ! [[ -x "$(command -v <%= dependency %>)" ]]; then
|
5
5
|
printf "<%= strings[:missing_dependency] % { dependency: dependency } -%>\n"
|
6
6
|
exit 1
|
7
7
|
fi
|
8
|
-
|
9
|
-
|
8
|
+
% end
|
9
|
+
% end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# :command.environment_variables_filter
|
2
|
-
|
3
|
-
|
2
|
+
% if default_environment_variables.any?
|
3
|
+
% default_environment_variables.each do |env_var|
|
4
4
|
export <%= env_var.name.upcase %>="${<%= env_var.name.upcase %>:-<%= env_var.default %>}"
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
% end
|
6
|
+
% end
|
7
|
+
% if required_environment_variables.any?
|
8
|
+
% required_environment_variables.each do |env_var|
|
9
9
|
if [[ -z "$<%= env_var.name.upcase %>" ]]; then
|
10
|
-
printf "<%= strings[:missing_required_environment_variable] % { var: env_var.name.upcase }
|
10
|
+
printf "<%= strings[:missing_required_environment_variable] % { var: env_var.name.upcase } %>\n"
|
11
11
|
exit 1
|
12
12
|
fi
|
13
|
-
|
14
|
-
|
13
|
+
% end
|
14
|
+
% end
|
@@ -1,22 +1,22 @@
|
|
1
1
|
# :command.fixed_flag_filter
|
2
2
|
case "$1" in
|
3
|
-
|
3
|
+
% if short_flag_exist? "-v"
|
4
4
|
--version )
|
5
|
-
|
5
|
+
% else
|
6
6
|
--version | -v )
|
7
|
-
|
7
|
+
% end
|
8
8
|
version_command
|
9
9
|
exit
|
10
10
|
;;
|
11
11
|
|
12
|
-
|
12
|
+
% if short_flag_exist? "-h"
|
13
13
|
--help )
|
14
|
-
|
14
|
+
% else
|
15
15
|
--help | -h )
|
16
|
-
|
16
|
+
% end
|
17
17
|
long_usage=yes
|
18
18
|
<%= function_name %>_usage
|
19
|
-
exit
|
19
|
+
exit
|
20
20
|
;;
|
21
21
|
|
22
22
|
esac
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# :command.normalize_input
|
2
|
+
normalize_input() {
|
3
|
+
local arg flags
|
4
|
+
|
5
|
+
while [[ $# -gt 0 ]]; do
|
6
|
+
arg="$1"
|
7
|
+
if [[ $arg =~ ^(--[a-zA-Z0-9_\-]+)=(.+)$ ]]; then
|
8
|
+
input+=("${BASH_REMATCH[1]}")
|
9
|
+
input+=("${BASH_REMATCH[2]}")
|
10
|
+
elif [[ $arg =~ ^(-[a-zA-Z0-9])=(.+)$ ]]; then
|
11
|
+
input+=("${BASH_REMATCH[1]}")
|
12
|
+
input+=("${BASH_REMATCH[2]}")
|
13
|
+
elif [[ $arg =~ ^-([a-zA-Z0-9][a-zA-Z0-9]+)$ ]]; then
|
14
|
+
flags="${BASH_REMATCH[1]}"
|
15
|
+
for (( i=0 ; i < ${#flags} ; i++ )); do
|
16
|
+
input+=("-${flags:i:1}")
|
17
|
+
done
|
18
|
+
else
|
19
|
+
input+=("$arg")
|
20
|
+
fi
|
21
|
+
|
22
|
+
shift
|
23
|
+
done
|
24
|
+
}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# :command.parse_requirements
|
2
|
-
|
2
|
+
% if root_command?
|
3
3
|
parse_requirements() {
|
4
|
-
|
4
|
+
% else
|
5
5
|
<%= function_name %>_parse_requirements() {
|
6
|
-
|
6
|
+
% end
|
7
7
|
<%= render(:fixed_flags_filter).indent 2 %>
|
8
8
|
<%= render(:environment_variables_filter).indent 2 %>
|
9
9
|
<%= render(:dependencies_filter).indent 2 %>
|
@@ -11,10 +11,11 @@ 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
|
}
|
17
18
|
|
18
|
-
|
19
|
+
% commands.each do |command|
|
19
20
|
<%= command.render :parse_requirements %>
|
20
|
-
|
21
|
+
% end
|
@@ -1,25 +1,25 @@
|
|
1
1
|
# :command.parse_requirements_case
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
% if args.any?
|
3
|
+
% condition = "if"
|
4
|
+
% args.each do |arg|
|
5
5
|
<%= condition %> [[ ! ${args[<%= arg.name %>]} ]]; then
|
6
6
|
args[<%= arg.name %>]=$1
|
7
7
|
shift
|
8
|
-
|
9
|
-
|
8
|
+
% condition = "elif"
|
9
|
+
% end
|
10
10
|
else
|
11
|
-
|
11
|
+
% if catch_all
|
12
12
|
other_args+=("$1")
|
13
13
|
shift
|
14
|
-
|
14
|
+
% else
|
15
15
|
printf "<%= strings[:invalid_argument] %>\n" "$key"
|
16
16
|
exit 1
|
17
|
-
|
17
|
+
% end
|
18
18
|
fi
|
19
|
-
|
19
|
+
% elsif catch_all
|
20
20
|
other_args+=("$1")
|
21
21
|
shift
|
22
|
-
|
22
|
+
% else
|
23
23
|
printf "<%= strings[:invalid_argument] %>\n" "$key"
|
24
24
|
exit 1
|
25
|
-
|
25
|
+
% end
|
@@ -2,21 +2,21 @@
|
|
2
2
|
while [[ $# -gt 0 ]]; do
|
3
3
|
key="$1"
|
4
4
|
case "$key" in
|
5
|
-
|
5
|
+
% flags.each do |flag|
|
6
6
|
<%= flag.render(:case).indent 2 %>
|
7
7
|
|
8
|
-
|
8
|
+
% end
|
9
9
|
|
10
10
|
-* )
|
11
|
-
|
11
|
+
% if catch_all
|
12
12
|
other_args+=("$1")
|
13
13
|
shift
|
14
14
|
;;
|
15
|
-
|
15
|
+
% else
|
16
16
|
printf "<%= strings[:invalid_flag] %>\n" "$key"
|
17
17
|
exit 1
|
18
18
|
;;
|
19
|
-
|
19
|
+
% end
|
20
20
|
|
21
21
|
* )
|
22
22
|
<%= render(:parse_requirements_case).indent 4 %>
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# :command.required_flags_filter
|
2
|
-
|
2
|
+
% if required_flags.any?
|
3
3
|
argstring="$*"
|
4
|
-
|
5
|
-
|
4
|
+
% end
|
5
|
+
% required_flags.each do |flag|
|
6
6
|
if [[ <%= flag.aliases.map { |a| %Q["$argstring" != *#{a}*] }.join " && " %> ]]; then
|
7
7
|
printf "<%= strings[:missing_required_flag] % { usage: flag.usage_string } %>\n"
|
8
8
|
exit 1
|
9
9
|
fi
|
10
|
-
|
10
|
+
% end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# :command.usage_args
|
2
2
|
printf "<%= strings[:arguments] %>\n"
|
3
|
-
|
3
|
+
% if args.any?
|
4
4
|
|
5
|
-
|
5
|
+
% args.each do |arg|
|
6
6
|
<%= arg.render(:usage) %>
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
% end
|
8
|
+
% end
|
9
|
+
% if catch_all_help
|
10
10
|
|
11
11
|
echo " <%= catch_all_label %>"
|
12
12
|
printf "<%= catch_all_help.wrap(76).indent(4).sanitize_for_print %>\n"
|
13
13
|
echo
|
14
|
-
|
14
|
+
% end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# :command.usage_commands
|
2
|
-
|
2
|
+
% unless commands.first.group
|
3
3
|
printf "<%= strings[:commands] %>\n"
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
% end
|
5
|
+
% maxlen = command_names.map(&:size).max
|
6
|
+
% commands.each do |command|
|
7
|
+
% summary = command.summary
|
8
|
+
% summary = strings[:default_command_summary] % { summary: summary } if command.default
|
9
|
+
% if command.group
|
10
|
+
% if command.name == commands.first.name
|
11
11
|
printf "<%= strings[:group] % { group: command.group } %>\n"
|
12
|
-
|
12
|
+
% else
|
13
13
|
printf "\n<%= strings[:group] % { group: command.group } %>\n"
|
14
|
-
|
15
|
-
|
14
|
+
% end
|
15
|
+
% end
|
16
16
|
echo " <%= command.name.ljust maxlen %> <%= summary %>"
|
17
|
-
|
17
|
+
% end
|
18
18
|
echo
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# :command.usage_fixed_flags
|
2
|
-
|
2
|
+
% if short_flag_exist? "-h"
|
3
3
|
echo " --help"
|
4
|
-
|
4
|
+
% else
|
5
5
|
echo " --help, -h"
|
6
|
-
|
6
|
+
% end
|
7
7
|
printf " <%= strings[:help_flag_text] %>\n"
|
8
8
|
echo
|
9
|
-
|
10
|
-
|
9
|
+
% if root_command?
|
10
|
+
% if short_flag_exist? "-v"
|
11
11
|
echo " --version"
|
12
|
-
|
12
|
+
% else
|
13
13
|
echo " --version, -v"
|
14
|
-
|
14
|
+
% end
|
15
15
|
printf " <%= strings[:version_flag_text] %>\n"
|
16
16
|
echo
|
17
|
-
|
17
|
+
% end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# :command.whitelist_filter
|
2
|
-
|
2
|
+
% whitelisted_args.each do |arg|
|
3
3
|
if [[ ! ${args[<%= arg.name %>]} =~ ^(<%= arg.allowed.join '|' %>)$ ]]; then
|
4
4
|
printf "%s\n" "<%= strings[:disallowed_argument] % { name: arg.name, allowed: arg.allowed.join(', ') } %>"
|
5
5
|
exit 1
|
6
6
|
fi
|
7
|
-
|
8
|
-
|
7
|
+
% end
|
8
|
+
% whitelisted_flags.each do |flag|
|
9
9
|
if [[ ! ${args[<%= flag.name %>]} =~ ^(<%= flag.allowed.join '|' %>)$ ]]; then
|
10
10
|
printf "%s\n" "<%= strings[:disallowed_flag] % { name: flag.name, allowed: flag.allowed.join(', ') } %>"
|
11
11
|
exit 1
|
12
12
|
fi
|
13
|
-
|
13
|
+
% end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# :flag.case
|
2
2
|
<%= aliases.join " | " %> )
|
3
|
-
|
3
|
+
% if arg
|
4
4
|
if [[ $2 ]]; then
|
5
5
|
args[<%= name %>]="$2"
|
6
6
|
shift
|
@@ -9,8 +9,8 @@
|
|
9
9
|
printf "%s\n" "<%= strings[:flag_requires_an_argument] % { name: name, usage: usage_string } %>"
|
10
10
|
exit 1
|
11
11
|
fi
|
12
|
-
|
12
|
+
% else
|
13
13
|
args[<%= name %>]=1
|
14
14
|
shift
|
15
|
-
|
15
|
+
% end
|
16
16
|
;;
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# :flag.usage
|
2
2
|
echo " <%= usage_string extended: true %>"
|
3
3
|
printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
|
4
|
-
|
4
|
+
% if allowed
|
5
5
|
printf " <%= strings[:allowed] % { values: allowed.join(', ') } -%>\n"
|
6
|
-
|
7
|
-
|
6
|
+
% end
|
7
|
+
% if default
|
8
8
|
printf " <%= strings[:default] % { value: default } -%>\n"
|
9
|
-
|
9
|
+
% end
|
10
10
|
echo
|
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.7
|
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-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colsole
|
@@ -30,20 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 0.1.2
|
33
|
+
version: '0.2'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
38
|
- - "~>"
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0.
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 0.1.2
|
40
|
+
version: '0.2'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: mister_bin
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,7 +96,6 @@ files:
|
|
102
96
|
- lib/bashly/models/environment_variable.rb
|
103
97
|
- lib/bashly/models/flag.rb
|
104
98
|
- lib/bashly/models/script.rb
|
105
|
-
- lib/bashly/polyfills/hash.rb
|
106
99
|
- lib/bashly/settings.rb
|
107
100
|
- lib/bashly/templates/bashly.yml
|
108
101
|
- lib/bashly/templates/lib/colors.sh
|
@@ -113,6 +106,7 @@ files:
|
|
113
106
|
- lib/bashly/templates/strings.yml
|
114
107
|
- lib/bashly/version.rb
|
115
108
|
- lib/bashly/views/argument/usage.erb
|
109
|
+
- lib/bashly/views/command/catch_all_filter.erb
|
116
110
|
- lib/bashly/views/command/command_fallback.erb
|
117
111
|
- lib/bashly/views/command/command_filter.erb
|
118
112
|
- lib/bashly/views/command/command_functions.erb
|
@@ -128,6 +122,7 @@ files:
|
|
128
122
|
- lib/bashly/views/command/initialize.erb
|
129
123
|
- lib/bashly/views/command/inspect_args.erb
|
130
124
|
- lib/bashly/views/command/master_script.erb
|
125
|
+
- lib/bashly/views/command/normalize_input.erb
|
131
126
|
- lib/bashly/views/command/parse_requirements.erb
|
132
127
|
- lib/bashly/views/command/parse_requirements_case.erb
|
133
128
|
- lib/bashly/views/command/parse_requirements_while.erb
|
@@ -153,7 +148,11 @@ files:
|
|
153
148
|
homepage: https://github.com/dannyben/bashly
|
154
149
|
licenses:
|
155
150
|
- MIT
|
156
|
-
metadata:
|
151
|
+
metadata:
|
152
|
+
bug_tracker_uri: https://github.com/DannyBen/bashly/issues
|
153
|
+
changelog_uri: https://github.com/DannyBen/bashly/blob/master/CHANGELOG.md
|
154
|
+
homepage_uri: https://bashly.dannyb.co/
|
155
|
+
source_code_uri: https://github.com/DannyBen/bashly
|
157
156
|
post_install_message:
|
158
157
|
rdoc_options: []
|
159
158
|
require_paths:
|