bashly 0.6.3 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -2
  3. data/lib/bashly/models/command.rb +15 -4
  4. data/lib/bashly/templates/lib/config.sh +17 -14
  5. data/lib/bashly/version.rb +1 -1
  6. data/lib/bashly/views/argument/usage.erb +4 -4
  7. data/lib/bashly/views/command/catch_all_filter.erb +7 -0
  8. data/lib/bashly/views/command/command_fallback.erb +5 -5
  9. data/lib/bashly/views/command/command_filter.erb +5 -5
  10. data/lib/bashly/views/command/command_functions.erb +2 -2
  11. data/lib/bashly/views/command/default_assignments.erb +4 -4
  12. data/lib/bashly/views/command/dependencies_filter.erb +4 -4
  13. data/lib/bashly/views/command/environment_variables_filter.erb +9 -9
  14. data/lib/bashly/views/command/fixed_flags_filter.erb +7 -7
  15. data/lib/bashly/views/command/master_script.erb +1 -0
  16. data/lib/bashly/views/command/normalize_input.erb +24 -0
  17. data/lib/bashly/views/command/parse_requirements.erb +6 -5
  18. data/lib/bashly/views/command/parse_requirements_case.erb +11 -11
  19. data/lib/bashly/views/command/parse_requirements_while.erb +5 -5
  20. data/lib/bashly/views/command/required_args_filter.erb +2 -2
  21. data/lib/bashly/views/command/required_flags_filter.erb +4 -4
  22. data/lib/bashly/views/command/run.erb +3 -1
  23. data/lib/bashly/views/command/usage_args.erb +6 -6
  24. data/lib/bashly/views/command/usage_commands.erb +12 -12
  25. data/lib/bashly/views/command/usage_environment_variables.erb +2 -2
  26. data/lib/bashly/views/command/usage_examples.erb +2 -2
  27. data/lib/bashly/views/command/usage_fixed_flags.erb +8 -8
  28. data/lib/bashly/views/command/usage_flags.erb +2 -2
  29. data/lib/bashly/views/command/user_lib.erb +2 -2
  30. data/lib/bashly/views/command/whitelist_filter.erb +4 -4
  31. data/lib/bashly/views/environment_variable/usage.erb +2 -2
  32. data/lib/bashly/views/flag/case.erb +3 -3
  33. data/lib/bashly/views/flag/usage.erb +4 -4
  34. data/lib/bashly.rb +0 -1
  35. metadata +11 -12
  36. data/lib/bashly/polyfills/hash.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01c46120b6cecba45cf9b55dd726ce4b66888ba3fc11d3383557a554ac51b154
4
- data.tar.gz: 9682934a468d1624d05924f4ca5bd76d6438c26853fed1ad8098865dae669bc2
3
+ metadata.gz: c47271e43a775ff08c071428540301ed1fa0656c7d58020c9825dfbc492804ef
4
+ data.tar.gz: fdc8ac40f1d18c2bc90ae4700fd0757e55132852bbdf8700a2829a02dd3be61c
5
5
  SHA512:
6
- metadata.gz: bb068fa1b263a1f820910b548cd48fde9cc1ae8607c50eea381361f9cbfe952581a4e1c9e54ac31e20a96c6ccba876d2a58b2f0ec6e8a59c3f8a467fbe0bde43
7
- data.tar.gz: 653410059e779fffdf9aa28d8c23a0a2cc8d3ba0a7911651deaf2669fc1b4d744dc3a3824124ba79140813d331510ec14a1b47f852049c305ab47fe55fe9c89d
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 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.
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
- Visit the [Bashly Documentation][docs] site.
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 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
@@ -190,7 +201,7 @@ module Bashly
190
201
  result << arg.usage_string
191
202
  end
192
203
  result << "[options]" unless flags.empty?
193
- result << "[#{catch_all_label}]" if catch_all
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 fucntion, it is used by other
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]}"
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.6.3"
2
+ VERSION = "0.6.7"
3
3
  end
@@ -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
- <%- if allowed -%>
4
+ % if allowed
5
5
  printf " <%= strings[:allowed] % { values: allowed.join(', ') } -%>\n"
6
- <%- end -%>
7
- <%- if default -%>
6
+ % end
7
+ % if default
8
8
  printf " <%= strings[:default] % { value: default } -%>\n"
9
- <%- end -%>
9
+ % end
10
10
  echo
@@ -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,5 +1,5 @@
1
1
  # :command.command_fallback
2
- <%- if default_command -%>
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
- <%- elsif extensible.is_a? String -%>
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
- <%- elsif extensible -%>
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
- <%- else -%>
40
+ % else
41
41
  * )
42
42
  <%= function_name %>_usage
43
43
  exit 1
44
44
  ;;
45
- <%- end -%>
45
+ % end
@@ -1,12 +1,12 @@
1
1
  # :command.command_filter
2
- <%- if commands.any? -%>
2
+ % if commands.any?
3
3
  action=$1
4
4
 
5
5
  case $action in
6
6
  -* )
7
7
  ;;
8
8
 
9
- <%- commands.each do |command| -%>
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
- <%- end -%>
17
+ % end
18
18
  <%= render :command_fallback %>
19
19
  esac
20
- <%- else -%>
20
+ % else
21
21
  action="<%= action_name %>"
22
- <%- end -%>
22
+ % end
@@ -1,4 +1,4 @@
1
1
  # :command.command_functions
2
- <%- deep_commands.each do |command| -%>
2
+ % deep_commands.each do |command|
3
3
  <%= command.render :function unless command.commands.any? %>
4
- <%- end -%>
4
+ % end
@@ -1,7 +1,7 @@
1
1
  # :command.default_assignments
2
- <%- default_args.each do |arg| -%>
2
+ % default_args.each do |arg|
3
3
  [[ -n ${args[<%= arg.name %>]} ]] || args[<%= arg.name %>]="<%= arg.default %>"
4
- <%- end -%>
5
- <%- default_flags.each do |flag| -%>
4
+ % end
5
+ % default_flags.each do |flag|
6
6
  [[ -n ${args[<%= flag.long %>]} ]] || args[<%= flag.long %>]="<%= flag.default %>"
7
- <%- end -%>
7
+ % end
@@ -1,9 +1,9 @@
1
1
  # :command.dependencies_filter
2
- <%- if dependencies -%>
3
- <%- dependencies.each do |dependency| -%>
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
- <%- end -%>
9
- <%- end -%>
8
+ % end
9
+ % end
@@ -1,14 +1,14 @@
1
1
  # :command.environment_variables_filter
2
- <%- if default_environment_variables.any? -%>
3
- <%- default_environment_variables.each do |env_var| -%>
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
- <%- end -%>
6
- <%- end -%>
7
- <%- if required_environment_variables.any? -%>
8
- <%- required_environment_variables.each do |env_var| -%>
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 } -%>\n"
10
+ printf "<%= strings[:missing_required_environment_variable] % { var: env_var.name.upcase } %>\n"
11
11
  exit 1
12
12
  fi
13
- <%- end -%>
14
- <%- end -%>
13
+ % end
14
+ % end
@@ -1,22 +1,22 @@
1
1
  # :command.fixed_flag_filter
2
2
  case "$1" in
3
- <%- if short_flag_exist? "-v" -%>
3
+ % if short_flag_exist? "-v"
4
4
  --version )
5
- <%- else -%>
5
+ % else
6
6
  --version | -v )
7
- <%- end -%>
7
+ % end
8
8
  version_command
9
9
  exit
10
10
  ;;
11
11
 
12
- <%- if short_flag_exist? "-h" -%>
12
+ % if short_flag_exist? "-h"
13
13
  --help )
14
- <%- else -%>
14
+ % else
15
15
  --help | -h )
16
- <%- end -%>
16
+ % end
17
17
  long_usage=yes
18
18
  <%= function_name %>_usage
19
- exit 1
19
+ exit
20
20
  ;;
21
21
 
22
22
  esac
@@ -1,6 +1,7 @@
1
1
  <%= render :root_command if commands.empty? %>
2
2
  <%= render :version_command %>
3
3
  <%= render :usage %>
4
+ <%= render :normalize_input %>
4
5
  <%= render :inspect_args %>
5
6
  <%= render :user_lib if user_lib.any? %>
6
7
  <%= render :command_functions %>
@@ -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
- <%- if root_command? -%>
2
+ % if root_command?
3
3
  parse_requirements() {
4
- <%- else -%>
4
+ % else
5
5
  <%= function_name %>_parse_requirements() {
6
- <%- end -%>
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
- <%- commands.each do |command| %>
19
+ % commands.each do |command|
19
20
  <%= command.render :parse_requirements %>
20
- <%- end -%>
21
+ % end
@@ -1,25 +1,25 @@
1
1
  # :command.parse_requirements_case
2
- <%- if args.any? -%>
3
- <%- condition = "if" -%>
4
- <%- args.each do |arg| -%>
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
- <%- condition = "elif" -%>
9
- <%- end -%>
8
+ % condition = "elif"
9
+ % end
10
10
  else
11
- <%- if catch_all -%>
11
+ % if catch_all
12
12
  other_args+=("$1")
13
13
  shift
14
- <%- else -%>
14
+ % else
15
15
  printf "<%= strings[:invalid_argument] %>\n" "$key"
16
16
  exit 1
17
- <%- end -%>
17
+ % end
18
18
  fi
19
- <%- elsif catch_all -%>
19
+ % elsif catch_all
20
20
  other_args+=("$1")
21
21
  shift
22
- <%- else -%>
22
+ % else
23
23
  printf "<%= strings[:invalid_argument] %>\n" "$key"
24
24
  exit 1
25
- <%- end -%>
25
+ % end
@@ -2,21 +2,21 @@
2
2
  while [[ $# -gt 0 ]]; do
3
3
  key="$1"
4
4
  case "$key" in
5
- <%- flags.each do |flag| -%>
5
+ % flags.each do |flag|
6
6
  <%= flag.render(:case).indent 2 %>
7
7
 
8
- <%- end -%>
8
+ % end
9
9
 
10
10
  -* )
11
- <%- if catch_all -%>
11
+ % if catch_all
12
12
  other_args+=("$1")
13
13
  shift
14
14
  ;;
15
- <%- else -%>
15
+ % else
16
16
  printf "<%= strings[:invalid_flag] %>\n" "$key"
17
17
  exit 1
18
18
  ;;
19
- <%- end -%>
19
+ % end
20
20
 
21
21
  * )
22
22
  <%= render(:parse_requirements_case).indent 4 %>
@@ -1,5 +1,5 @@
1
1
  # :command.required_args_filter
2
- <%- required_args.each do |arg| -%>
2
+ % required_args.each do |arg|
3
3
  if [[ $1 && $1 != -* ]]; then
4
4
  args[<%= arg.name %>]=$1
5
5
  shift
@@ -8,4 +8,4 @@ else
8
8
  exit 1
9
9
  fi
10
10
 
11
- <%- end %>
11
+ % end
@@ -1,10 +1,10 @@
1
1
  # :command.required_flags_filter
2
- <%- if required_flags.any? -%>
2
+ % if required_flags.any?
3
3
  argstring="$*"
4
- <%- end -%>
5
- <%- required_flags.each do |flag| -%>
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
- <%- end %>
10
+ % end
@@ -2,7 +2,9 @@
2
2
  run() {
3
3
  declare -A args
4
4
  declare -a other_args
5
- parse_requirements "$@"
5
+ declare -a input
6
+ normalize_input "$@"
7
+ parse_requirements "${input[@]}"
6
8
 
7
9
  <%- condition = "if" -%>
8
10
  <%- deep_commands.each do |command| -%>
@@ -1,14 +1,14 @@
1
1
  # :command.usage_args
2
2
  printf "<%= strings[:arguments] %>\n"
3
- <%- if args.any? -%>
3
+ % if args.any?
4
4
 
5
- <%- args.each do |arg| -%>
5
+ % args.each do |arg|
6
6
  <%= arg.render(:usage) %>
7
- <%- end -%>
8
- <%- end -%>
9
- <%- if catch_all_help -%>
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
- <%- end -%>
14
+ % end
@@ -1,18 +1,18 @@
1
1
  # :command.usage_commands
2
- <%- unless commands.first.group -%>
2
+ % unless commands.first.group
3
3
  printf "<%= strings[:commands] %>\n"
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 -%>
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
- <%- else -%>
12
+ % else
13
13
  printf "\n<%= strings[:group] % { group: command.group } %>\n"
14
- <%- end -%>
15
- <%- end -%>
14
+ % end
15
+ % end
16
16
  echo " <%= command.name.ljust maxlen %> <%= summary %>"
17
- <%- end -%>
17
+ % end
18
18
  echo
@@ -1,6 +1,6 @@
1
1
  # :command.usage_environment_variables
2
2
  printf "<%= strings[:environment_variables] %>\n"
3
3
 
4
- <%- environment_variables.each do |env_var| -%>
4
+ % environment_variables.each do |env_var|
5
5
  <%= env_var.render(:usage) %>
6
- <%- end -%>
6
+ % end
@@ -1,7 +1,7 @@
1
1
  # :command.usage_examples
2
2
  printf "<%= strings[:examples] %>\n"
3
3
 
4
- <%- examples.each do |example| -%>
4
+ % examples.each do |example|
5
5
  printf "<%= example.wrap(78).indent(2).sanitize_for_print %>\n"
6
- <%- end -%>
6
+ % end
7
7
  echo
@@ -1,17 +1,17 @@
1
1
  # :command.usage_fixed_flags
2
- <%- if short_flag_exist? "-h" -%>
2
+ % if short_flag_exist? "-h"
3
3
  echo " --help"
4
- <%- else -%>
4
+ % else
5
5
  echo " --help, -h"
6
- <%- end -%>
6
+ % end
7
7
  printf " <%= strings[:help_flag_text] %>\n"
8
8
  echo
9
- <%- if root_command? -%>
10
- <%- if short_flag_exist? "-v" -%>
9
+ % if root_command?
10
+ % if short_flag_exist? "-v"
11
11
  echo " --version"
12
- <%- else -%>
12
+ % else
13
13
  echo " --version, -v"
14
- <%- end -%>
14
+ % end
15
15
  printf " <%= strings[:version_flag_text] %>\n"
16
16
  echo
17
- <%- end -%>
17
+ % end
@@ -1,4 +1,4 @@
1
1
  # :command.usage_flags
2
- <%- flags.each do |flag| -%>
2
+ % flags.each do |flag|
3
3
  <%= flag.render(:usage) %>
4
- <%- end -%>
4
+ % end
@@ -1,6 +1,6 @@
1
1
  # :command.user_lib
2
- <%- user_lib.each do |file| -%>
2
+ % user_lib.each do |file|
3
3
  # <%= ":#{file}" %>
4
4
  <%= File.read file %>
5
5
 
6
- <%- end -%>
6
+ % end
@@ -1,13 +1,13 @@
1
1
  # :command.whitelist_filter
2
- <%- whitelisted_args.each do |arg| -%>
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
- <%- end -%>
8
- <%- whitelisted_flags.each do |flag| -%>
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
- <%- end -%>
13
+ % end
@@ -1,7 +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 -%>
4
+ % if default
5
5
  printf " <%= strings[:default] % { value: default } -%>\n"
6
- <%- end -%>
6
+ % end
7
7
  echo
@@ -1,6 +1,6 @@
1
1
  # :flag.case
2
2
  <%= aliases.join " | " %> )
3
- <%- if arg -%>
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
- <%- else -%>
12
+ % else
13
13
  args[<%= name %>]=1
14
14
  shift
15
- <%- end -%>
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
- <%- if allowed -%>
4
+ % if allowed
5
5
  printf " <%= strings[:allowed] % { values: allowed.join(', ') } -%>\n"
6
- <%- end -%>
7
- <%- if default -%>
6
+ % end
7
+ % if default
8
8
  printf " <%= strings[:default] % { value: default } -%>\n"
9
- <%- end -%>
9
+ % end
10
10
  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.3
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-08-25 00:00:00.000000000 Z
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.1'
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.1'
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:
@@ -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: