bashly 0.6.2 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -2
  3. data/lib/bashly/commands/add.rb +1 -1
  4. data/lib/bashly/models/command.rb +15 -4
  5. data/lib/bashly/templates/lib/config.sh +5 -5
  6. data/lib/bashly/templates/strings.yml +1 -0
  7. data/lib/bashly/version.rb +1 -1
  8. data/lib/bashly/views/argument/usage.erb +4 -4
  9. data/lib/bashly/views/command/catch_all_filter.erb +7 -0
  10. data/lib/bashly/views/command/command_fallback.erb +5 -5
  11. data/lib/bashly/views/command/command_filter.erb +5 -5
  12. data/lib/bashly/views/command/command_functions.erb +2 -2
  13. data/lib/bashly/views/command/default_assignments.erb +4 -4
  14. data/lib/bashly/views/command/dependencies_filter.erb +4 -4
  15. data/lib/bashly/views/command/environment_variables_filter.erb +9 -9
  16. data/lib/bashly/views/command/fixed_flags_filter.erb +7 -7
  17. data/lib/bashly/views/command/initialize.erb +6 -1
  18. data/lib/bashly/views/command/master_script.erb +1 -0
  19. data/lib/bashly/views/command/normalize_input.erb +24 -0
  20. data/lib/bashly/views/command/parse_requirements.erb +6 -5
  21. data/lib/bashly/views/command/parse_requirements_case.erb +11 -11
  22. data/lib/bashly/views/command/parse_requirements_while.erb +5 -5
  23. data/lib/bashly/views/command/required_args_filter.erb +2 -2
  24. data/lib/bashly/views/command/required_flags_filter.erb +4 -4
  25. data/lib/bashly/views/command/run.erb +3 -1
  26. data/lib/bashly/views/command/usage_args.erb +6 -6
  27. data/lib/bashly/views/command/usage_commands.erb +12 -12
  28. data/lib/bashly/views/command/usage_environment_variables.erb +2 -2
  29. data/lib/bashly/views/command/usage_examples.erb +2 -2
  30. data/lib/bashly/views/command/usage_fixed_flags.erb +8 -8
  31. data/lib/bashly/views/command/usage_flags.erb +2 -2
  32. data/lib/bashly/views/command/user_lib.erb +2 -2
  33. data/lib/bashly/views/command/whitelist_filter.erb +4 -4
  34. data/lib/bashly/views/environment_variable/usage.erb +2 -2
  35. data/lib/bashly/views/flag/case.erb +3 -3
  36. data/lib/bashly/views/flag/usage.erb +4 -4
  37. data/lib/bashly.rb +0 -1
  38. metadata +12 -13
  39. data/lib/bashly/polyfills/hash.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd9fb393dfda0c4529dc984e9ee12660e310c014a41e4fac031c3d7b33420bad
4
- data.tar.gz: 3496cc3d2d8715332fce5d163b4ebe0d6ea9eb5441378c75dae3a070fbf8db18
3
+ metadata.gz: e61f83f8d8f8b4992a5f7d66731de37d640dd1da71c8bc243558ba173f56a76c
4
+ data.tar.gz: c85eb4ea1c11c97c494b969075553f3a341bc29ac44ba94a4763d5efe1b03af0
5
5
  SHA512:
6
- metadata.gz: 430ac01ae504b3f54e6c812d13729806c494cf5912833bf2b5360645040c368b1f514c538c66d701672f12ae6c1ba77849691c1666f4f6d11a43b44bc79d0f17
7
- data.tar.gz: 41784e22ff19801e5e6be60be31652ea751f30a21c027d40ba59d9f29a08ed0e5074fa1c87518bb54fd0d41bc94ad475f7f91764bbf3cde85f09868e4ccda46f
6
+ metadata.gz: 1685fa4d73c0bc652e3043e8686e39b8ce7571f7baa41e5c84fa5dcce01a49331fd65af7a817bdbd0b985200c9a0502565bfece80414d58b3eed2b1729be101d
7
+ data.tar.gz: d20da15898e3792bb6efeb7257d0b4a21dc6c0adc5dca00b72411dd37acfd61a926427ec70264058fd276c509c24d7a5d7b7235f66b74b075d86ff1266b2163f
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
 
@@ -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."
@@ -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,14 +10,14 @@
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}
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.2"
2
+ VERSION = "0.6.6"
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
@@ -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
  }
@@ -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.2
4
+ version: 0.6.6
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-27 00:00:00.000000000 Z
11
+ date: 2021-09-07 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:
@@ -169,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
168
  - !ruby/object:Gem::Version
170
169
  version: '0'
171
170
  requirements: []
172
- rubygems_version: 3.2.16
171
+ rubygems_version: 3.2.25
173
172
  signing_key:
174
173
  specification_version: 4
175
174
  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: