bashly 0.8.2 → 0.8.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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/lib/bashly/concerns/renderable.rb +3 -6
  3. data/lib/bashly/extensions/string.rb +2 -2
  4. data/lib/bashly/templates/strings.yml +1 -0
  5. data/lib/bashly/version.rb +1 -1
  6. data/lib/bashly/views/README.md +6 -0
  7. data/lib/bashly/views/argument/usage.gtx +15 -0
  8. data/lib/bashly/views/argument/validations.gtx +11 -0
  9. data/lib/bashly/views/command/catch_all_filter.gtx +10 -0
  10. data/lib/bashly/views/command/command_fallback.gtx +42 -0
  11. data/lib/bashly/views/command/command_filter.gtx +29 -0
  12. data/lib/bashly/views/command/command_functions.gtx +5 -0
  13. data/lib/bashly/views/command/default_assignments.gtx +13 -0
  14. data/lib/bashly/views/command/default_initialize_script.gtx +7 -0
  15. data/lib/bashly/views/command/default_root_script.gtx +4 -0
  16. data/lib/bashly/views/command/default_script.gtx +5 -0
  17. data/lib/bashly/views/command/dependencies_filter.gtx +10 -0
  18. data/lib/bashly/views/command/environment_variables_filter.gtx +18 -0
  19. data/lib/bashly/views/command/fixed_flags_filter.gtx +20 -0
  20. data/lib/bashly/views/command/footer.gtx +5 -0
  21. data/lib/bashly/views/command/function.gtx +6 -0
  22. data/lib/bashly/views/command/initialize.gtx +12 -0
  23. data/lib/bashly/views/command/inspect_args.gtx +21 -0
  24. data/lib/bashly/views/command/long_usage.gtx +13 -0
  25. data/lib/bashly/views/command/master_script.gtx +17 -0
  26. data/lib/bashly/views/command/normalize_input.gtx +25 -0
  27. data/lib/bashly/views/command/parse_requirements.gtx +26 -0
  28. data/lib/bashly/views/command/parse_requirements_case.gtx +11 -0
  29. data/lib/bashly/views/command/parse_requirements_case_catch_all.gtx +23 -0
  30. data/lib/bashly/views/command/parse_requirements_case_repeatable.gtx +24 -0
  31. data/lib/bashly/views/command/parse_requirements_case_simple.gtx +25 -0
  32. data/lib/bashly/views/command/parse_requirements_while.gtx +33 -0
  33. data/lib/bashly/views/command/required_args_filter.gtx +13 -0
  34. data/lib/bashly/views/command/required_flags_filter.gtx +12 -0
  35. data/lib/bashly/views/command/root_command.gtx +6 -0
  36. data/lib/bashly/views/command/run.gtx +28 -0
  37. data/lib/bashly/views/command/usage.gtx +50 -0
  38. data/lib/bashly/views/command/usage_args.gtx +20 -0
  39. data/lib/bashly/views/command/usage_commands.gtx +18 -0
  40. data/lib/bashly/views/command/usage_environment_variables.gtx +10 -0
  41. data/lib/bashly/views/command/usage_examples.gtx +10 -0
  42. data/lib/bashly/views/command/usage_fixed_flags.gtx +13 -0
  43. data/lib/bashly/views/command/usage_flags.gtx +7 -0
  44. data/lib/bashly/views/command/user_filter.gtx +13 -0
  45. data/lib/bashly/views/command/user_lib.gtx +11 -0
  46. data/lib/bashly/views/command/version_command.gtx +6 -0
  47. data/lib/bashly/views/command/whitelist_filter.gtx +41 -0
  48. data/lib/bashly/views/environment_variable/usage.gtx +11 -0
  49. data/lib/bashly/views/flag/case.gtx +6 -0
  50. data/lib/bashly/views/flag/case_arg.gtx +25 -0
  51. data/lib/bashly/views/flag/case_no_arg.gtx +11 -0
  52. data/lib/bashly/views/flag/conflicts.gtx +22 -0
  53. data/lib/bashly/views/flag/usage.gtx +15 -0
  54. data/lib/bashly/views/flag/validations.gtx +11 -0
  55. data/lib/bashly/views/wrapper/bash3_bouncer.gtx +7 -0
  56. data/lib/bashly/views/wrapper/header.gtx +5 -0
  57. data/lib/bashly/views/wrapper/wrapper.gtx +8 -0
  58. metadata +74 -58
  59. data/lib/bashly/views/argument/usage.erb +0 -10
  60. data/lib/bashly/views/argument/validations.erb +0 -8
  61. data/lib/bashly/views/command/catch_all_filter.erb +0 -7
  62. data/lib/bashly/views/command/command_fallback.erb +0 -45
  63. data/lib/bashly/views/command/command_filter.erb +0 -22
  64. data/lib/bashly/views/command/command_functions.erb +0 -4
  65. data/lib/bashly/views/command/default_assignments.erb +0 -7
  66. data/lib/bashly/views/command/default_initialize_script.erb +0 -6
  67. data/lib/bashly/views/command/default_root_script.erb +0 -3
  68. data/lib/bashly/views/command/default_script.erb +0 -4
  69. data/lib/bashly/views/command/dependencies_filter.erb +0 -9
  70. data/lib/bashly/views/command/environment_variables_filter.erb +0 -14
  71. data/lib/bashly/views/command/fixed_flags_filter.erb +0 -24
  72. data/lib/bashly/views/command/footer.erb +0 -3
  73. data/lib/bashly/views/command/function.erb +0 -4
  74. data/lib/bashly/views/command/initialize.erb +0 -8
  75. data/lib/bashly/views/command/inspect_args.erb +0 -19
  76. data/lib/bashly/views/command/master_script.erb +0 -14
  77. data/lib/bashly/views/command/normalize_input.erb +0 -24
  78. data/lib/bashly/views/command/parse_requirements.erb +0 -22
  79. data/lib/bashly/views/command/parse_requirements_case.erb +0 -8
  80. data/lib/bashly/views/command/parse_requirements_case_catch_all.erb +0 -18
  81. data/lib/bashly/views/command/parse_requirements_case_repeatable.erb +0 -18
  82. data/lib/bashly/views/command/parse_requirements_case_simple.erb +0 -18
  83. data/lib/bashly/views/command/parse_requirements_while.erb +0 -26
  84. data/lib/bashly/views/command/required_args_filter.erb +0 -7
  85. data/lib/bashly/views/command/required_flags_filter.erb +0 -7
  86. data/lib/bashly/views/command/root_command.erb +0 -4
  87. data/lib/bashly/views/command/run.erb +0 -23
  88. data/lib/bashly/views/command/usage.erb +0 -50
  89. data/lib/bashly/views/command/usage_args.erb +0 -14
  90. data/lib/bashly/views/command/usage_commands.erb +0 -13
  91. data/lib/bashly/views/command/usage_environment_variables.erb +0 -6
  92. data/lib/bashly/views/command/usage_examples.erb +0 -7
  93. data/lib/bashly/views/command/usage_fixed_flags.erb +0 -17
  94. data/lib/bashly/views/command/usage_flags.erb +0 -4
  95. data/lib/bashly/views/command/user_filter.erb +0 -11
  96. data/lib/bashly/views/command/user_lib.erb +0 -6
  97. data/lib/bashly/views/command/version_command.erb +0 -4
  98. data/lib/bashly/views/command/whitelist_filter.erb +0 -33
  99. data/lib/bashly/views/environment_variable/usage.erb +0 -7
  100. data/lib/bashly/views/flag/case.erb +0 -4
  101. data/lib/bashly/views/flag/case_arg.erb +0 -19
  102. data/lib/bashly/views/flag/case_no_arg.erb +0 -8
  103. data/lib/bashly/views/flag/conflicts.erb +0 -18
  104. data/lib/bashly/views/flag/usage.erb +0 -10
  105. data/lib/bashly/views/flag/validations.erb +0 -8
  106. data/lib/bashly/views/wrapper/bash3_bouncer.erb +0 -5
  107. data/lib/bashly/views/wrapper/header.erb +0 -4
  108. data/lib/bashly/views/wrapper/wrapper.erb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc4a83c90c751c1df692c55db4f7335619c927cb86a30de4fcb7eef5115710a1
4
- data.tar.gz: 343ede4e31e7a0833b6335a9690c9ecbe060da1983d829cfbdf197bbfe5dc640
3
+ metadata.gz: f3cd1ba341eabd9f1c3acead91ff8c56878db7eb07f3ef6e8f29ceb057cbce04
4
+ data.tar.gz: 9c8fdd62e401cf1d693d76163e61d93779fcbda67406e301f06d9be554ccbe96
5
5
  SHA512:
6
- metadata.gz: 3b5873adb5c173a4676ae071f6d83b11975053addd8b39e50613375032d441b227d6f27c4ad860719bdf22e37f7ce8882217e5c622c607dcff048fe7dfdaab18
7
- data.tar.gz: c01a6a3c20aee19338c3cddfbac0254d7316c5b9aa8f2423bbd6ba65746b439e1ce7e3eec2f2654087c3a6b55388fdeca645dfe786e4adcac97997f1a0f778e4
6
+ metadata.gz: e690eda52685f2b34ae5773b79b48ede2972d8e328dcc193c90d4a60b22a768ccaa1444e52652f0b11513cced19a02eff295ac011ca414d254d4d9e3b8aacf4a
7
+ data.tar.gz: 5b7bf250ea4cdc8d194dee285a6a61748e5d649b455d1b3836a35df1c511b6781d84ac966903a445bd84bcb471604e15c016bbd88f643afe7f030c8df65e6563
@@ -1,12 +1,9 @@
1
- require 'erb'
1
+ require 'gtx'
2
2
 
3
3
  module Bashly
4
4
  module Renderable
5
5
  def render(view)
6
- template = File.read view_path(view)
7
- erb = ERB.new(template, trim_mode: '%-')
8
- erb.filename = "#{views_subfolder}.#{view}"
9
- erb.result binding
6
+ GTX.render_file view_path(view), context: binding, filename: "#{views_subfolder}.#{view}"
10
7
  end
11
8
 
12
9
  def strings
@@ -37,7 +34,7 @@ module Bashly
37
34
  private
38
35
 
39
36
  def view_path(view)
40
- "#{self_views_path}/#{view}.erb"
37
+ "#{self_views_path}/#{view}.gtx"
41
38
  end
42
39
 
43
40
  def self_views_path
@@ -5,7 +5,7 @@ class String
5
5
 
6
6
  def indent(offset)
7
7
  return self unless offset > 0
8
- split("\n").indent(offset).join("\n")
8
+ lines.indent(offset).join
9
9
  end
10
10
 
11
11
  def to_underscore
@@ -24,7 +24,7 @@ class String
24
24
  end
25
25
 
26
26
  def lint
27
- gsub(/\s+\n/m, "\n\n").lines.reject { |l| l =~ /^\s*##/ }.join ""
27
+ gsub(/\s+\n/m, "\n\n").lines.reject { |l| l =~ /^\s*##/ }.join
28
28
  end
29
29
 
30
30
  def remove_front_matter
@@ -26,6 +26,7 @@ version_flag_text: Show version number
26
26
  flag_requires_an_argument: "%{name} requires an argument: %{usage}"
27
27
  invalid_argument: "invalid argument: %s"
28
28
  invalid_flag: "invalid option: %s"
29
+ invalid_command: "invalid command: %s"
29
30
  conflicting_flags: "conflicting options: %s cannot be used with %s"
30
31
  missing_required_argument: "missing required argument: %{arg}\\nusage: %{usage}"
31
32
  missing_required_flag: "missing required flag: %{usage}"
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.8.2"
2
+ VERSION = "0.8.3"
3
3
  end
@@ -0,0 +1,6 @@
1
+ # View Tempaltes
2
+
3
+ These are [GTX](https://github.com/dannyben/gtx) templates.
4
+
5
+ For syntax highlighting, set up your editor to treat `*.gtx` files as Ruby
6
+ source code.
@@ -0,0 +1,15 @@
1
+ = view_marker
2
+
3
+ > echo " {{ label }}"
4
+ > printf "{{ help.wrap(76).indent(4).sanitize_for_print }}\n"
5
+
6
+ if allowed
7
+ > printf " {{ strings[:allowed] % { values: allowed.join(', ') } }}\n"
8
+ end
9
+
10
+ if default
11
+ > printf " {{ strings[:default] % { value: default } }}\n"
12
+ end
13
+
14
+ > echo
15
+ >
@@ -0,0 +1,11 @@
1
+ if validate
2
+
3
+ = view_marker
4
+
5
+ > if [[ -n $(validate_{{ validate }} "$1") ]]; then
6
+ > printf "{{ strings[:validation_error] }}\n" "{{ name.upcase }}" "$(validate_{{ validate }} "$1")"
7
+ > exit 1
8
+ > fi
9
+ >
10
+
11
+ end
@@ -0,0 +1,10 @@
1
+ if catch_all.required?
2
+ = view_marker
3
+
4
+ > if [[ ${#other_args[@]} -eq 0 ]]; then
5
+ > printf "{{ strings[:missing_required_argument] % { arg: catch_all.label, usage: usage_string } }}\n"
6
+ > exit 1
7
+ > fi
8
+ >
9
+
10
+ end
@@ -0,0 +1,42 @@
1
+ = view_marker
2
+
3
+ > "" )
4
+ > {{ function_name }}_usage
5
+ > exit 1
6
+ > ;;
7
+ >
8
+ > * )
9
+
10
+ if default_command
11
+ > action="{{ default_command.name }}"
12
+ > {{ default_command.function_name }}_parse_requirements "$@"
13
+ > shift $#
14
+ > ;;
15
+ >
16
+
17
+ elsif extensible.is_a? String
18
+ > if [[ -x "$(command -v "{{ extensible }}")" ]]; then
19
+ > exec {{ extensible }} "$@"
20
+ > else
21
+ > printf "{{ strings[:invalid_command] }}\n" "$action"
22
+ > exit 1
23
+ > fi
24
+ >
25
+
26
+ elsif extensible
27
+ > if [[ -x "$(command -v "{{ function_name }}-$action")" ]]; then
28
+ > shift
29
+ > exec "{{ function_name }}-$action" "$@"
30
+ > else
31
+ > printf "{{ strings[:invalid_command] }}\n" "$action"
32
+ > exit 1
33
+ > fi
34
+ >
35
+
36
+ else
37
+ > printf "{{ strings[:invalid_command] }}\n" "$action"
38
+ > exit 1
39
+ > ;;
40
+ >
41
+
42
+ end
@@ -0,0 +1,29 @@
1
+ = view_marker
2
+
3
+ if commands.any?
4
+ > action=${1:-}
5
+ >
6
+ > case $action in
7
+ > -* )
8
+ > ;;
9
+ >
10
+
11
+ commands.each do |command|
12
+ > {{ command.aliases.join " | " }} )
13
+ > action="{{ command.name }}"
14
+ > shift
15
+ > {{ command.function_name }}_parse_requirements "$@"
16
+ > shift $#
17
+ > ;;
18
+ >
19
+
20
+ end
21
+
22
+ = render :command_fallback
23
+ > esac
24
+ >
25
+
26
+ else
27
+ > action="{{ action_name }}"
28
+
29
+ end
@@ -0,0 +1,5 @@
1
+ = view_marker
2
+
3
+ deep_commands.each do |command|
4
+ = command.render :function unless command.commands.any?
5
+ end
@@ -0,0 +1,13 @@
1
+ if default_args.any? or default_flags.any?
2
+ = view_marker
3
+
4
+ default_args.each do |arg|
5
+ > [[ -n ${args[{{ arg.name }}]:-} ]] || args[{{ arg.name }}]="{{ arg.default }}"
6
+ end
7
+
8
+ default_flags.each do |flag|
9
+ > [[ -n ${args[{{ flag.long }}]:-} ]] || args[{{ flag.long }}]="{{ flag.default }}"
10
+ end
11
+
12
+ >
13
+ end
@@ -0,0 +1,7 @@
1
+ > ## Code here runs inside the initialize() function
2
+ > ## Use it for anything that you need to run before any other function, like
3
+ > ## setting environment vairables:
4
+ > ## CONFIG_FILE=settings.ini
5
+ > ##
6
+ > ## Feel free to empty (but not delete) this file.
7
+ >
@@ -0,0 +1,4 @@
1
+ > echo "# this file is located in '{{ "#{Settings.source_dir}/#{filename}" }}'"
2
+ > echo "# you can edit it freely and regenerate (it will not be overwritten)"
3
+ > inspect_args
4
+ >
@@ -0,0 +1,5 @@
1
+ > echo "# this file is located in '{{ "#{Settings.source_dir}/#{filename}" }}'"
2
+ > echo "# code for '{{ full_name }}' goes here"
3
+ > echo "# you can edit it freely and regenerate (it will not be overwritten)"
4
+ > inspect_args
5
+ >
@@ -0,0 +1,10 @@
1
+ if dependencies
2
+ = view_marker
3
+
4
+ dependencies.each do |dependency|
5
+ > if ! [[ -x "$(command -v {{ dependency }})" ]]; then
6
+ > printf "{{ strings[:missing_dependency] % { dependency: dependency } }}\n"
7
+ > exit 1
8
+ > fi
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ if default_environment_variables.any? or required_environment_variables.any?
2
+ = view_marker
3
+
4
+ if default_environment_variables.any?
5
+ default_environment_variables.each do |env_var|
6
+ > export {{ env_var.name.upcase }}="${<%= env_var.name.upcase %>:-<%= env_var.default %>}"
7
+ end
8
+ end
9
+
10
+ if required_environment_variables.any?
11
+ required_environment_variables.each do |env_var|
12
+ > if [[ -z "${<%= env_var.name.upcase %>:-}" ]]; then
13
+ > printf "{{ strings[:missing_required_environment_variable] % { var: env_var.name.upcase } }}\n"
14
+ > exit 1
15
+ > fi
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ = view_marker
2
+
3
+ > case "${1:-}" in
4
+
5
+ if root_command?
6
+ = short_flag_exist?("-v") ? "--version )" : "--version | -v )"
7
+ > version_command
8
+ > exit
9
+ > ;;
10
+ >
11
+ end
12
+
13
+ = short_flag_exist?("-h") ? "--help )" : "--help | -h )"
14
+ > long_usage=yes
15
+ > <%= function_name %>_usage
16
+ > exit
17
+ > ;;
18
+ >
19
+ > esac
20
+ >
@@ -0,0 +1,5 @@
1
+ = view_marker
2
+
3
+ > printf "{{ footer.gsub("\n", '\n').gsub('"', '\"') }}\n"
4
+ > echo
5
+ >
@@ -0,0 +1,6 @@
1
+ = view_marker
2
+
3
+ > {{ function_name }}_command() {
4
+ = load_user_file(filename).indent 2
5
+ > }
6
+ >
@@ -0,0 +1,12 @@
1
+ = view_marker
2
+
3
+ > initialize() {
4
+ > version="<%= version %>"
5
+ > long_usage=''
6
+ > {{ Settings.strict ? "set -euo pipefail" : "set -e" }}
7
+ >
8
+
9
+ = load_user_file("initialize.sh", placeholder: false).indent 2
10
+
11
+ > }
12
+ >
@@ -0,0 +1,21 @@
1
+ = view_marker
2
+
3
+ > inspect_args() {
4
+ > readarray -t sorted_keys < <(printf '%s\n' "${!args[@]}" | sort)
5
+ > if (( ${#args[@]} )); then
6
+ > echo args:
7
+ > for k in "${sorted_keys[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done
8
+ > else
9
+ > echo args: none
10
+ > fi
11
+ >
12
+ > if (( ${#other_args[@]} )); then
13
+ > echo
14
+ > echo other_args:
15
+ > echo "- \${other_args[*]} = ${other_args[*]}"
16
+ > for i in "${!other_args[@]}"; do
17
+ > echo "- \${other_args[$i]} = ${other_args[$i]}"
18
+ > done
19
+ > fi
20
+ > }
21
+ >
@@ -0,0 +1,13 @@
1
+ = view_marker
2
+
3
+ > if [[ -n $long_usage ]]; then
4
+ > printf "{{ strings[:options] }}\n"
5
+ >
6
+ = render(:usage_fixed_flags).indent 2
7
+ = render(:usage_flags).indent 2 if flags.any?
8
+ = render(:usage_args).indent 2 if args.any? or catch_all.help
9
+ = render(:usage_environment_variables).indent 2 if environment_variables.any?
10
+ = render(:usage_examples).indent 2 if examples
11
+ = render(:footer).indent 2 if footer
12
+ >
13
+ > fi
@@ -0,0 +1,17 @@
1
+ = view_marker
2
+
3
+ = render :root_command if commands.empty?
4
+ = render :version_command
5
+ = render :usage
6
+ = render :normalize_input
7
+ = render :inspect_args
8
+ = render :user_lib if user_lib.any?
9
+ = render :command_functions
10
+ = render :parse_requirements
11
+ = render :initialize
12
+ = render :run
13
+
14
+ >
15
+ > initialize
16
+ > run "$@"
17
+ >
@@ -0,0 +1,25 @@
1
+ = view_marker
2
+
3
+ > normalize_input() {
4
+ > local arg flags
5
+ >
6
+ > while [[ $# -gt 0 ]]; do
7
+ > arg="$1"
8
+ > if [[ $arg =~ ^(--[a-zA-Z0-9_\-]+)=(.+)$ ]]; then
9
+ > input+=("${BASH_REMATCH[1]}")
10
+ > input+=("${BASH_REMATCH[2]}")
11
+ > elif [[ $arg =~ ^(-[a-zA-Z0-9])=(.+)$ ]]; then
12
+ > input+=("${BASH_REMATCH[1]}")
13
+ > input+=("${BASH_REMATCH[2]}")
14
+ > elif [[ $arg =~ ^-([a-zA-Z0-9][a-zA-Z0-9]+)$ ]]; then
15
+ > flags="${BASH_REMATCH[1]}"
16
+ > for (( i=0 ; i < ${#flags} ; i++ )); do
17
+ > input+=("-${flags:i:1}")
18
+ > done
19
+ > else
20
+ > input+=("$arg")
21
+ > fi
22
+ >
23
+ > shift
24
+ > done
25
+ > }
@@ -0,0 +1,26 @@
1
+ = view_marker
2
+
3
+ if root_command?
4
+ > parse_requirements() {
5
+ else
6
+ > {{ function_name }}_parse_requirements() {
7
+ end
8
+
9
+ = render(:fixed_flags_filter).indent 2
10
+ = render(:environment_variables_filter).indent 2
11
+ = render(:dependencies_filter).indent 2
12
+ = render(:command_filter).indent 2
13
+ = render(:parse_requirements_while).indent 2
14
+ = render(:required_args_filter).indent 2
15
+ = render(:required_flags_filter).indent 2
16
+ = render(:catch_all_filter).indent 2
17
+ = render(:default_assignments).indent 2
18
+ = render(:whitelist_filter).indent 2
19
+ = render(:user_filter).indent 2
20
+
21
+ > }
22
+ >
23
+
24
+ commands.each do |command|
25
+ = command.render :parse_requirements
26
+ end
@@ -0,0 +1,11 @@
1
+ = view_marker
2
+
3
+ if catch_all.enabled?
4
+ = render :parse_requirements_case_catch_all
5
+ elsif repeatable_arg_exist?
6
+ = render :parse_requirements_case_repeatable
7
+ else
8
+ = render :parse_requirements_case_simple
9
+ end
10
+
11
+ >
@@ -0,0 +1,23 @@
1
+ = view_marker
2
+
3
+ if args.any?
4
+ condition = "if"
5
+ args.each do |arg|
6
+ > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
7
+ = arg.render(:validations).indent 2
8
+ > args[{{ arg.name }}]=$1
9
+ > shift
10
+
11
+ condition = "elif"
12
+ end
13
+
14
+ > else
15
+ > other_args+=("$1")
16
+ > shift
17
+ > fi
18
+
19
+ else
20
+ > other_args+=("$1")
21
+ > shift
22
+
23
+ end
@@ -0,0 +1,24 @@
1
+ = view_marker
2
+
3
+ condition = "if"
4
+ args.each do |arg|
5
+ > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
6
+ = arg.render(:validations).indent 2
7
+
8
+ if arg.repeatable
9
+ > args[{{ arg.name }}]="\"$1\""
10
+ > shift
11
+ > else
12
+ > args[{{ arg.name }}]="${args[{{ arg.name }}]} \"$1\""
13
+ > shift
14
+
15
+ else
16
+ > args[{{ arg.name }}]=$1
17
+ > shift
18
+
19
+ end
20
+ condition = "elif"
21
+ end
22
+
23
+ > fi
24
+ >
@@ -0,0 +1,25 @@
1
+ = view_marker
2
+
3
+ if args.any?
4
+ condition = "if"
5
+ args.each do |arg|
6
+ > {{ condition }} [[ -z ${args[{{ arg.name }}]+x} ]]; then
7
+ > {{ arg.render(:validations).indent 2 }}
8
+ > args[{{ arg.name }}]=$1
9
+ > shift
10
+
11
+ condition = "elif"
12
+ end
13
+
14
+ > else
15
+ > printf "{{ strings[:invalid_argument] }}\n" "$key"
16
+ > exit 1
17
+ > fi
18
+
19
+ else
20
+ > printf "{{ strings[:invalid_argument] }}\n" "$key"
21
+ > exit 1
22
+
23
+ end
24
+
25
+ >
@@ -0,0 +1,33 @@
1
+ = view_marker
2
+
3
+ > while [[ $# -gt 0 ]]; do
4
+ > key="$1"
5
+ > case "$key" in
6
+
7
+ flags.each do |flag|
8
+ = flag.render(:case).indent 2
9
+ end
10
+
11
+ >
12
+ > -?* )
13
+
14
+ if catch_all.enabled?
15
+ > other_args+=("$1")
16
+ > shift
17
+ > ;;
18
+
19
+ else
20
+ > printf "<%= strings[:invalid_flag] %>\n" "$key"
21
+ > exit 1
22
+ > ;;
23
+
24
+ end
25
+
26
+ >
27
+ > * )
28
+ = render(:parse_requirements_case).indent 4
29
+ > ;;
30
+ >
31
+ > esac
32
+ > done
33
+
@@ -0,0 +1,13 @@
1
+ if required_args.any?
2
+ = view_marker
3
+
4
+ required_args.each do |arg|
5
+ > if [[ -z ${args[{{ arg.name }}]+x} ]]; then
6
+ > printf "{{ strings[:missing_required_argument] % { arg: arg.name.upcase, usage: usage_string } }}\n"
7
+ > exit 1
8
+ > fi
9
+ end
10
+
11
+ >
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ if required_flags.any?
2
+ = view_marker
3
+
4
+ required_flags.each do |flag|
5
+ > if [[ -z ${args[{{ flag.long }}]+x} ]]; then
6
+ > printf "{{ strings[:missing_required_flag] % { usage: flag.usage_string } }}\n"
7
+ > exit 1
8
+ > fi
9
+ end
10
+
11
+ >
12
+ end
@@ -0,0 +1,6 @@
1
+ = view_marker
2
+
3
+ > root_command() {
4
+ = load_user_file(filename).indent 2
5
+ > }
6
+ >
@@ -0,0 +1,28 @@
1
+ = view_marker
2
+
3
+ > run() {
4
+ > declare -A args=()
5
+ > declare -a other_args=()
6
+ > declare -a input=()
7
+ > normalize_input "$@"
8
+ > parse_requirements "${input[@]}"
9
+ >
10
+
11
+ condition = "if"
12
+ deep_commands.each do |command|
13
+ > {{ condition }} [[ $action == "{{ command.action_name }}" ]]; then
14
+ > if [[ ${args[--help]:-} ]]; then
15
+ > long_usage=yes
16
+ > {{ command.function_name }}_usage
17
+ > else
18
+ > {{ command.function_name }}_command
19
+ > fi
20
+ >
21
+
22
+ condition = "elif"
23
+ end
24
+
25
+ > {{ condition }} [[ $action == "root" ]]; then
26
+ > root_command
27
+ > fi
28
+ > }
@@ -0,0 +1,50 @@
1
+ = view_marker
2
+
3
+ > {{ function_name }}_usage() {
4
+ > if [[ -n $long_usage ]]; then
5
+
6
+ if summary == help
7
+ > printf "{{ caption_string }}\n"
8
+ > echo
9
+ else
10
+ > printf "{{ full_name }}\n"
11
+ > echo
12
+ > printf "{{ help.wrap(78).indent(2).sanitize_for_print }}\n"
13
+ > echo
14
+ end
15
+
16
+ > else
17
+ > printf "{{ caption_string }}\n"
18
+ > echo
19
+ > fi
20
+ >
21
+
22
+ if alt&.any?
23
+ > printf "{{ strings[:command_alias] % { alias: alt.join(', ') } }}\n"
24
+ > echo
25
+ end
26
+
27
+ >
28
+ > printf "{{ strings[:usage] }}\n"
29
+ > printf " {{ usage_string }}\n"
30
+
31
+ if commands.any?
32
+ > printf " {{ full_name }} [command] --help{{ " | -h" unless short_flag_exist? "-h" }}\n"
33
+ else
34
+ > printf " {{ full_name }} --help{{ " | -h" unless short_flag_exist? "-h" }}\n"
35
+ end
36
+
37
+ if root_command?
38
+ > printf " {{ full_name }} --version{{ " | -v" unless short_flag_exist? "-v" }}\n"
39
+ end
40
+ > echo
41
+
42
+ = render(:usage_commands).indent 2 if commands.any?
43
+ >
44
+ = render(:long_usage).indent 2
45
+ > }
46
+ >
47
+
48
+ commands.each do |command|
49
+ = command.render 'usage'
50
+ end