bashly 0.7.8 → 0.7.9

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/lib/bashly/cli.rb +2 -1
  3. data/lib/bashly/commands/generate.rb +11 -1
  4. data/lib/bashly/concerns/renderable.rb +8 -1
  5. data/lib/bashly/config_validator.rb +13 -5
  6. data/lib/bashly/extensions/yaml.rb +2 -0
  7. data/lib/bashly/script/argument.rb +13 -1
  8. data/lib/bashly/script/base.rb +7 -29
  9. data/lib/bashly/script/catch_all.rb +4 -0
  10. data/lib/bashly/script/command.rb +13 -1
  11. data/lib/bashly/script/environment_variable.rb +6 -0
  12. data/lib/bashly/script/flag.rb +9 -0
  13. data/lib/bashly/version.rb +1 -1
  14. data/lib/bashly/views/argument/usage.erb +2 -2
  15. data/lib/bashly/views/argument/validations.erb +1 -1
  16. data/lib/bashly/views/command/catch_all_filter.erb +1 -1
  17. data/lib/bashly/views/command/command_fallback.erb +1 -1
  18. data/lib/bashly/views/command/command_filter.erb +1 -1
  19. data/lib/bashly/views/command/command_functions.erb +1 -1
  20. data/lib/bashly/views/command/default_assignments.erb +1 -1
  21. data/lib/bashly/views/command/dependencies_filter.erb +1 -1
  22. data/lib/bashly/views/command/environment_variables_filter.erb +1 -1
  23. data/lib/bashly/views/command/fixed_flags_filter.erb +1 -1
  24. data/lib/bashly/views/command/footer.erb +1 -0
  25. data/lib/bashly/views/command/function.erb +1 -1
  26. data/lib/bashly/views/command/initialize.erb +1 -1
  27. data/lib/bashly/views/command/inspect_args.erb +1 -1
  28. data/lib/bashly/views/command/master_script.erb +1 -0
  29. data/lib/bashly/views/command/normalize_input.erb +1 -1
  30. data/lib/bashly/views/command/parse_requirements.erb +1 -1
  31. data/lib/bashly/views/command/parse_requirements_case.erb +15 -3
  32. data/lib/bashly/views/command/parse_requirements_while.erb +1 -1
  33. data/lib/bashly/views/command/required_args_filter.erb +1 -1
  34. data/lib/bashly/views/command/required_flags_filter.erb +1 -1
  35. data/lib/bashly/views/command/root_command.erb +1 -1
  36. data/lib/bashly/views/command/run.erb +1 -1
  37. data/lib/bashly/views/command/usage.erb +1 -1
  38. data/lib/bashly/views/command/usage_args.erb +1 -1
  39. data/lib/bashly/views/command/usage_commands.erb +1 -1
  40. data/lib/bashly/views/command/usage_environment_variables.erb +1 -1
  41. data/lib/bashly/views/command/usage_examples.erb +1 -1
  42. data/lib/bashly/views/command/usage_fixed_flags.erb +1 -1
  43. data/lib/bashly/views/command/usage_flags.erb +1 -1
  44. data/lib/bashly/views/command/user_filter.erb +1 -1
  45. data/lib/bashly/views/command/user_lib.erb +2 -2
  46. data/lib/bashly/views/command/version_command.erb +1 -1
  47. data/lib/bashly/views/command/whitelist_filter.erb +11 -1
  48. data/lib/bashly/views/environment_variable/usage.erb +1 -1
  49. data/lib/bashly/views/flag/case.erb +1 -1
  50. data/lib/bashly/views/flag/conflicts.erb +1 -1
  51. data/lib/bashly/views/flag/usage.erb +1 -1
  52. data/lib/bashly/views/flag/validations.erb +1 -1
  53. data/lib/bashly/views/wrapper/bash3_bouncer.erb +1 -1
  54. data/lib/bashly/views/wrapper/wrapper.erb +1 -1
  55. data/lib/bashly.rb +12 -0
  56. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d05f653ff5439edd7108eaff3c6265926dc4e894453fce1c59bc4727c4c98d1f
4
- data.tar.gz: 39afd30e66779103285d9df99f74f4e3cc8af61220d15a6b1cb02b21a4bebe57
3
+ metadata.gz: 2ef923a576e9bb9e16ec9f78c96c6008772c77d3bfc9520299fc2dd3cd7f3dd3
4
+ data.tar.gz: 593393d64ca6e63216e0e974c580db50db754fe430d319115aef8610c47d39aa
5
5
  SHA512:
6
- metadata.gz: 8db8291a3db5a496626676942eddcadb61f7080ab316ed17652af5f58376e40efa85473e7a665a3966dbbfdbc37b6662577a3e13b50d9f49c36a87792854cefc
7
- data.tar.gz: c844bf07c523c6f04a21874a08e3c2c40fafe4562829f419f77fd17f74ebaa70b5006e61c50b430399dcca00158f9d4b4fdb7afe4dfeb2e3a425c8eb544fcc22
6
+ metadata.gz: 2b0ffb33c0c11b423cb59d594362a0c2c071a685a2ad7d4837cbdc3bb1d6a494bdcce8ff1cb3d19cfb0078ac5f167912a9d2f93c44f173d2821b415fe9cbd92e
7
+ data.tar.gz: c6b6989f3c75226641847feee4e4e8a73326da2a006bbbd52ce7544c7c4ffb3bf1f4a659a15f0b70f14590b1fe0392062099f6ced43134b2a3d81000d5a350f9
data/lib/bashly/cli.rb CHANGED
@@ -6,7 +6,8 @@ module Bashly
6
6
  class CLI
7
7
  def self.runner
8
8
  runner = MisterBin::Runner.new version: Bashly::VERSION,
9
- header: "Bashly - Bash CLI Generator"
9
+ header: "Bashly - Bash CLI Generator",
10
+ footer: "Help: !txtpur!bashly COMMAND --help!txtrst!\nDocs: !undblu!https://bashly.dannyb.co"
10
11
 
11
12
  runner.route 'init', to: Commands::Init
12
13
  runner.route 'preview', to: Commands::Preview
@@ -3,24 +3,34 @@ module Bashly
3
3
  class Generate < Base
4
4
  help "Generate the bash script and required files"
5
5
 
6
- usage "bashly generate [--force --quiet --upgrade --wrap FUNCTION]"
6
+ usage "bashly generate [options]"
7
7
  usage "bashly generate (-h|--help)"
8
8
 
9
9
  option "-f --force", "Overwrite existing files"
10
10
  option "-q --quiet", "Disable on-screen progress report"
11
11
  option "-u --upgrade", "Upgrade all added library functions"
12
12
  option "-w --wrap FUNCTION", "Wrap the entire script in a function so it can also be sourced"
13
+ option "-e --env ENV", "Force the generation environment (see BASHLY_ENV)"
13
14
 
14
15
  environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
15
16
  environment "BASHLY_TARGET_DIR", "The path to use for creating the bash script [default: .]"
16
17
  environment "BASHLY_LIB_DIR", "The path to use for upgrading library files, relative to the source dir [default: lib]"
17
18
  environment "BASHLY_STRICT", "When not empty, enable bash strict mode (set -euo pipefail)"
19
+ environment "BASHLY_ENV", <<~EOF
20
+ Set to 'production' or 'development':
21
+ - production generate a smaller script, without file markers
22
+ - development generate with file markers
23
+
24
+ Can be overridden with --env [default: development]
25
+ EOF
18
26
 
19
27
  example "bashly generate --force"
20
28
  example "bashly generate --wrap my_function"
21
29
 
22
30
  def run
23
31
  validate_config
32
+ ENV['BASHLY_ENV'] = args['--env'] if args['--env']
33
+ quiet_say "creating !txtgrn!production!txtrst! version" if Bashly.production?
24
34
  create_user_files
25
35
  upgrade_libs if args['--upgrade']
26
36
  create_master_script
@@ -4,13 +4,20 @@ module Bashly
4
4
  module Renderable
5
5
  def render(view)
6
6
  template = File.read view_path(view)
7
- ERB.new(template, trim_mode: '%-').result(binding)
7
+ erb = ERB.new(template, trim_mode: '%-')
8
+ erb.filename = "#{views_subfolder}.#{view}"
9
+ erb.result binding
8
10
  end
9
11
 
10
12
  def strings
11
13
  @strings ||= MessageStrings.new
12
14
  end
13
15
 
16
+ def view_marker(id = nil)
17
+ id ||= ":#{caller_locations.first.path}"
18
+ "# #{id}" unless Bashly.production?
19
+ end
20
+
14
21
  private
15
22
 
16
23
  def view_path(view)
@@ -42,8 +42,13 @@ module Bashly
42
42
  end
43
43
  end
44
44
 
45
- def assert_hash(key, value)
45
+ def assert_hash(key, value, whitelist = nil)
46
46
  assert value.is_a?(Hash), "#{key} must be a hash"
47
+
48
+ if whitelist
49
+ invalid_keys = value.keys.map(&:to_sym) - whitelist
50
+ assert invalid_keys.empty?, "#{key} contains invalid options: #{invalid_keys.join(', ')}"
51
+ end
47
52
  end
48
53
 
49
54
  def assert_version(key, value)
@@ -61,6 +66,7 @@ module Bashly
61
66
  end
62
67
 
63
68
  def assert_catch_all_hash(key, value)
69
+ assert_hash key, value, Script::CatchAll.option_keys
64
70
  assert_string "#{key}.label", value['label']
65
71
  assert_optional_string "#{key}.help", value['help']
66
72
  assert_boolean "#{key}.required", value['required']
@@ -73,7 +79,7 @@ module Bashly
73
79
  end
74
80
 
75
81
  def assert_arg(key, value)
76
- assert_hash key, value
82
+ assert_hash key, value, Script::Argument.option_keys
77
83
  assert_string "#{key}.name", value['name']
78
84
  assert_optional_string "#{key}.help", value['help']
79
85
  assert_optional_string "#{key}.default", value['default']
@@ -89,7 +95,7 @@ module Bashly
89
95
  end
90
96
 
91
97
  def assert_flag(key, value)
92
- assert_hash key, value
98
+ assert_hash key, value, Script::Flag.option_keys
93
99
  assert value['short'] || value['long'], "#{key} must have at least one of long or short name"
94
100
 
95
101
  assert_optional_string "#{key}.long", value['long']
@@ -99,6 +105,7 @@ module Bashly
99
105
  assert_optional_string "#{key}.default", value['default']
100
106
  assert_optional_string "#{key}.validate", value['validate']
101
107
 
108
+ assert_boolean "#{key}.repeatable", value['repeatable']
102
109
  assert_boolean "#{key}.required", value['required']
103
110
  assert_array "#{key}.allowed", value['allowed'], of: :string
104
111
  assert_array "#{key}.conflicts", value['conflicts'], of: :string
@@ -119,7 +126,7 @@ module Bashly
119
126
  end
120
127
 
121
128
  def assert_env_var(key, value)
122
- assert_hash key, value
129
+ assert_hash key, value, Script::EnvironmentVariable.option_keys
123
130
  assert_string "#{key}.name", value['name']
124
131
  assert_optional_string "#{key}.help", value['help']
125
132
  assert_optional_string "#{key}.default", value['default']
@@ -127,7 +134,7 @@ module Bashly
127
134
  end
128
135
 
129
136
  def assert_command(key, value)
130
- assert_hash key, value
137
+ assert_hash key, value, Script::Command.option_keys
131
138
 
132
139
  refute value['commands'] && value['args'], "#{key} cannot have both commands and args"
133
140
  refute value['commands'] && value['flags'], "#{key} cannot have both commands and flags"
@@ -139,6 +146,7 @@ module Bashly
139
146
  assert_optional_string "#{key}.group", value['group']
140
147
  assert_optional_string "#{key}.filename", value['filename']
141
148
 
149
+ assert_boolean "#{key}.private", value['private']
142
150
  assert_boolean "#{key}.default", value['default']
143
151
  assert_version "#{key}.version", value['version']
144
152
  assert_catch_all "#{key}.catch_all", value['catch_all']
@@ -3,6 +3,8 @@ module YAML
3
3
  def self.properly_load_file(path)
4
4
  YAML.load_file path, aliases: true
5
5
  rescue ArgumentError
6
+ # :nocov:
6
7
  YAML.load_file path
8
+ # :nocov:
7
9
  end
8
10
  end
@@ -1,8 +1,20 @@
1
1
  module Bashly
2
2
  module Script
3
3
  class Argument < Base
4
+ class << self
5
+ def option_keys
6
+ @option_keys ||= %i[
7
+ allowed default help name repeatable required validate
8
+ ]
9
+ end
10
+ end
11
+
4
12
  def usage_string
5
- required ? name.upcase : "[#{name.upcase}]"
13
+ required ? label : "[#{label}]"
14
+ end
15
+
16
+ def label
17
+ repeatable ? "#{name.upcase}..." : name.upcase
6
18
  end
7
19
  end
8
20
  end
@@ -5,33 +5,11 @@ module Bashly
5
5
 
6
6
  attr_reader :options
7
7
 
8
- OPTION_KEYS = %i[
9
- allowed
10
- arg
11
- catch_all
12
- completions
13
- conflicts
14
- default
15
- dependencies
16
- description
17
- environment_variables
18
- examples
19
- extensible
20
- filters
21
- flags
22
- footer
23
- group
24
- help
25
- long
26
- name
27
- parent_name
28
- private
29
- repeatable
30
- required
31
- short
32
- validate
33
- version
34
- ]
8
+ class << self
9
+ def option_keys
10
+ @option_keys ||= []
11
+ end
12
+ end
35
13
 
36
14
  def initialize(options)
37
15
  raise Error, "Invalid options provided" unless options.respond_to? :keys
@@ -39,7 +17,7 @@ module Bashly
39
17
  end
40
18
 
41
19
  def optional
42
- !required
20
+ !options['required']
43
21
  end
44
22
 
45
23
  def summary
@@ -56,7 +34,7 @@ module Bashly
56
34
  end
57
35
 
58
36
  def respond_to_missing?(method_name, include_private = false)
59
- OPTION_KEYS.include?(method_name) || super
37
+ self.class.option_keys.include?(method_name) || super
60
38
  end
61
39
  end
62
40
  end
@@ -2,6 +2,10 @@ module Bashly
2
2
  module Script
3
3
  class CatchAll
4
4
  class << self
5
+ def option_keys
6
+ @option_keys ||= %i[label help required]
7
+ end
8
+
5
9
  def from_config(config)
6
10
  options = case config
7
11
  when nil
@@ -4,6 +4,18 @@ module Bashly
4
4
  include Completions
5
5
  include CommandScopes
6
6
 
7
+ class << self
8
+ def option_keys
9
+ @option_keys ||= %i[
10
+ args catch_all commands completions
11
+ default dependencies environment_variables examples
12
+ extensible filename filters flags
13
+ footer group help name
14
+ private short version
15
+ ]
16
+ end
17
+ end
18
+
7
19
  # Returns the name to be used as an action.
8
20
  # - If it is the root command, the action is "root"
9
21
  # - Else, it is all the parents, except the first one (root) joined
@@ -90,7 +102,7 @@ module Bashly
90
102
  default_content
91
103
  end
92
104
 
93
- "# :#{path}\n#{content}"
105
+ Bashly.production? ? content : "#{view_marker path}\n#{content}"
94
106
  end
95
107
 
96
108
  # Returns an array of all parents. For example, the command
@@ -1,6 +1,12 @@
1
1
  module Bashly
2
2
  module Script
3
3
  class EnvironmentVariable < Base
4
+ class << self
5
+ def option_keys
6
+ @option_keys ||= %i[default help name required]
7
+ end
8
+ end
9
+
4
10
  def usage_string(extended: false)
5
11
  result = [name.upcase]
6
12
  result << strings[:required] if required and extended
@@ -1,6 +1,15 @@
1
1
  module Bashly
2
2
  module Script
3
3
  class Flag < Base
4
+ class << self
5
+ def option_keys
6
+ @option_keys ||= %i[
7
+ allowed arg conflicts default help long repeatable required
8
+ short validate
9
+ ]
10
+ end
11
+ end
12
+
4
13
  def aliases
5
14
  if long and short
6
15
  [long, short]
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.7.8"
2
+ VERSION = "0.7.9"
3
3
  end
@@ -1,5 +1,5 @@
1
- # :argument.usage
2
- echo " <%= name.upcase %>"
1
+ <%= view_marker %>
2
+ echo " <%= label %>"
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"
@@ -1,4 +1,4 @@
1
- # :argument.validations
1
+ <%= view_marker %>
2
2
  % if validate
3
3
  if [[ -n $(validate_<%= validate %> "$1") ]]; then
4
4
  printf "<%= strings[:validation_error] %>\n" "<%= name.upcase %>" "$(validate_<%= validate %> "$1")"
@@ -1,4 +1,4 @@
1
- # :command.catch_all_filter
1
+ <%= view_marker %>
2
2
  % if catch_all.required?
3
3
  if [[ ${#other_args[@]} -eq 0 ]]; then
4
4
  printf "<%= strings[:missing_required_argument] % { arg: catch_all.label, usage: usage_string } %>\n"
@@ -1,4 +1,4 @@
1
- # :command.command_fallback
1
+ <%= view_marker %>
2
2
  % if default_command
3
3
  "" )
4
4
  <%= function_name %>_usage
@@ -1,4 +1,4 @@
1
- # :command.command_filter
1
+ <%= view_marker %>
2
2
  % if commands.any?
3
3
  action=${1:-}
4
4
 
@@ -1,4 +1,4 @@
1
- # :command.command_functions
1
+ <%= view_marker %>
2
2
  % deep_commands.each do |command|
3
3
  <%= command.render :function unless command.commands.any? %>
4
4
  % end
@@ -1,4 +1,4 @@
1
- # :command.default_assignments
1
+ <%= view_marker %>
2
2
  % default_args.each do |arg|
3
3
  [[ -n ${args[<%= arg.name %>]:-} ]] || args[<%= arg.name %>]="<%= arg.default %>"
4
4
  % end
@@ -1,4 +1,4 @@
1
- # :command.dependencies_filter
1
+ <%= view_marker %>
2
2
  % if dependencies
3
3
  % dependencies.each do |dependency|
4
4
  if ! [[ -x "$(command -v <%= dependency %>)" ]]; then
@@ -1,4 +1,4 @@
1
- # :command.environment_variables_filter
1
+ <%= view_marker %>
2
2
  % if default_environment_variables.any?
3
3
  % default_environment_variables.each do |env_var|
4
4
  export <%= env_var.name.upcase %>="${<%= env_var.name.upcase %>:-<%= env_var.default %>}"
@@ -1,4 +1,4 @@
1
- # :command.fixed_flag_filter
1
+ <%= view_marker %>
2
2
  case "${1:-}" in
3
3
  % if root_command?
4
4
  % if short_flag_exist? "-v"
@@ -1,2 +1,3 @@
1
+ <%= view_marker %>
1
2
  printf "<%= footer.gsub("\n", '\n').gsub('"', '\"') %>\n"
2
3
  echo
@@ -1,4 +1,4 @@
1
- # :command.function
1
+ <%= view_marker %>
2
2
  <%= function_name %>_command() {
3
3
  <%= load_user_file(filename).indent 2 %>
4
4
  }
@@ -1,4 +1,4 @@
1
- # :command.initialize
1
+ <%= view_marker %>
2
2
  initialize() {
3
3
  version="<%= version %>"
4
4
  long_usage=''
@@ -1,4 +1,4 @@
1
- # :command.inspect_args
1
+ <%= view_marker %>
2
2
  inspect_args() {
3
3
  readarray -t sorted_keys < <(printf '%s\n' "${!args[@]}" | sort)
4
4
  if (( ${#args[@]} )); then
@@ -1,3 +1,4 @@
1
+ <%= view_marker %>
1
2
  <%= render :root_command if commands.empty? %>
2
3
  <%= render :version_command %>
3
4
  <%= render :usage %>
@@ -1,4 +1,4 @@
1
- # :command.normalize_input
1
+ <%= view_marker %>
2
2
  normalize_input() {
3
3
  local arg flags
4
4
 
@@ -1,4 +1,4 @@
1
- # :command.parse_requirements
1
+ <%= view_marker %>
2
2
  % if root_command?
3
3
  parse_requirements() {
4
4
  % else
@@ -1,18 +1,30 @@
1
- # :command.parse_requirements_case
1
+ <%= view_marker %>
2
+ % repeatable_arg = false
2
3
  % if args.any?
3
4
  % condition = "if"
4
5
  % args.each do |arg|
5
6
  <%= condition %> [[ -z ${args[<%= arg.name %>]+x} ]]; then
6
7
  <%= arg.render(:validations).indent 2 %>
8
+ % if arg.repeatable
9
+ % repeatable_arg = true
10
+ args[<%= arg.name %>]="\"$1\""
11
+ shift
12
+ else
13
+ args[<%= arg.name %>]="${args[<%= arg.name %>]} \"$1\""
14
+ shift
15
+ % else
7
16
  args[<%= arg.name %>]=$1
8
17
  shift
18
+ % end
9
19
  % condition = "elif"
10
20
  % end
21
+ % if !repeatable_arg
11
22
  else
23
+ % end
12
24
  % if catch_all.enabled?
13
25
  other_args+=("$1")
14
26
  shift
15
- % else
27
+ % elsif !repeatable_arg
16
28
  printf "<%= strings[:invalid_argument] %>\n" "$key"
17
29
  exit 1
18
30
  % end
@@ -20,7 +32,7 @@ fi
20
32
  % elsif catch_all.enabled?
21
33
  other_args+=("$1")
22
34
  shift
23
- % else
35
+ % elsif !repeatable_arg
24
36
  printf "<%= strings[:invalid_argument] %>\n" "$key"
25
37
  exit 1
26
38
  % end
@@ -1,4 +1,4 @@
1
- # :command.parse_requirements_while
1
+ <%= view_marker %>
2
2
  while [[ $# -gt 0 ]]; do
3
3
  key="$1"
4
4
  case "$key" in
@@ -1,4 +1,4 @@
1
- # :command.required_args_filter
1
+ <%= view_marker %>
2
2
  % required_args.each do |arg|
3
3
  if [[ -z ${args[<%= arg.name %>]+x} ]]; then
4
4
  printf "<%= strings[:missing_required_argument] % { arg: arg.name.upcase, usage: usage_string } %>\n"
@@ -1,4 +1,4 @@
1
- # :command.required_flags_filter
1
+ <%= view_marker %>
2
2
  % required_flags.each do |flag|
3
3
  if [[ -z ${args[<%= flag.long %>]+x} ]]; then
4
4
  printf "<%= strings[:missing_required_flag] % { usage: flag.usage_string } %>\n"
@@ -1,4 +1,4 @@
1
- # :command.root_command
1
+ <%= view_marker %>
2
2
  root_command() {
3
3
  <%= load_user_file(filename).indent 2 %>
4
4
  }
@@ -1,4 +1,4 @@
1
- # :command.run
1
+ <%= view_marker %>
2
2
  run() {
3
3
  declare -A args=()
4
4
  declare -a other_args=()
@@ -1,4 +1,4 @@
1
- # :command.usage
1
+ <%= view_marker %>
2
2
  <%= function_name %>_usage() {
3
3
  if [[ -n $long_usage ]]; then
4
4
  <%- if summary == help -%>
@@ -1,4 +1,4 @@
1
- # :command.usage_args
1
+ <%= view_marker %>
2
2
  printf "<%= strings[:arguments] %>\n"
3
3
  % if args.any?
4
4
 
@@ -1,4 +1,4 @@
1
- # :command.usage_commands
1
+ <%= view_marker %>
2
2
  % unless commands.first.group
3
3
  printf "<%= strings[:commands] %>\n"
4
4
  % end
@@ -1,4 +1,4 @@
1
- # :command.usage_environment_variables
1
+ <%= view_marker %>
2
2
  printf "<%= strings[:environment_variables] %>\n"
3
3
 
4
4
  % environment_variables.each do |env_var|
@@ -1,4 +1,4 @@
1
- # :command.usage_examples
1
+ <%= view_marker %>
2
2
  printf "<%= strings[:examples] %>\n"
3
3
 
4
4
  % examples.each do |example|
@@ -1,4 +1,4 @@
1
- # :command.usage_fixed_flags
1
+ <%= view_marker %>
2
2
  % if short_flag_exist? "-h"
3
3
  echo " --help"
4
4
  % else
@@ -1,4 +1,4 @@
1
- # :command.usage_flags
1
+ <%= view_marker %>
2
2
  % flags.each do |flag|
3
3
  <%= flag.render(:usage) %>
4
4
  % end
@@ -1,4 +1,4 @@
1
- # :command.user_filter
1
+ <%= view_marker %>
2
2
  % if filters
3
3
  % filters.each do |filter|
4
4
  filter_error=$(filter_<%= filter %>)
@@ -1,6 +1,6 @@
1
- # :command.user_lib
1
+ <%= view_marker %>
2
2
  % user_lib.each do |file|
3
- # <%= ":#{file}" %>
3
+ <%= view_marker file %>
4
4
  <%= File.read file %>
5
5
 
6
6
  % end
@@ -1,4 +1,4 @@
1
- # :command.version_command
1
+ <%= view_marker %>
2
2
  version_command() {
3
3
  echo "$version"
4
4
  }
@@ -1,10 +1,20 @@
1
- # :command.whitelist_filter
1
+ <%= view_marker %>
2
2
  % whitelisted_args.each do |arg|
3
+ % if arg.repeatable
4
+ eval "input_array=(${args[<%= arg.name %>]})"
5
+ for i in "${input_array[@]}"; do
6
+ if [[ ! $i =~ ^(<%= arg.allowed.join '|' %>)$ ]]; then
7
+ printf "%s\n" "<%= strings[:disallowed_argument] % { name: arg.name, allowed: arg.allowed.join(', ') } %>"
8
+ exit 1
9
+ fi
10
+ done
11
+ % else
3
12
  if [[ ! ${args[<%= arg.name %>]} =~ ^(<%= arg.allowed.join '|' %>)$ ]]; then
4
13
  printf "%s\n" "<%= strings[:disallowed_argument] % { name: arg.name, allowed: arg.allowed.join(', ') } %>"
5
14
  exit 1
6
15
  fi
7
16
  % end
17
+ % end
8
18
  % whitelisted_flags.each do |flag|
9
19
  % if flag.repeatable
10
20
  eval "input_array=(${args[<%= flag.name %>]})"
@@ -1,4 +1,4 @@
1
- # :environment_variable.usage
1
+ <%= view_marker %>
2
2
  echo " <%= usage_string extended: true %>"
3
3
  printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
4
4
  % if default
@@ -1,4 +1,4 @@
1
- # :flag.case
1
+ <%= view_marker %>
2
2
  <%= aliases.join " | " %> )
3
3
  <%= render(:conflicts).indent 2 %>
4
4
  % if arg
@@ -1,4 +1,4 @@
1
- # :flag.conflicts
1
+ <%= view_marker %>
2
2
  % if conflicts
3
3
  % if conflicts.count == 1
4
4
  if [[ -n "${args[<%= conflicts.first %>]:-}" ]]; then
@@ -1,4 +1,4 @@
1
- # :flag.usage
1
+ <%= view_marker %>
2
2
  echo " <%= usage_string extended: true %>"
3
3
  printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
4
4
  % if allowed
@@ -1,4 +1,4 @@
1
- # :flag.validations
1
+ <%= view_marker %>
2
2
  % if validate
3
3
  if [[ -n $(validate_<%= validate %> "$2") ]]; then
4
4
  printf "<%= strings[:validation_error] %>\n" "<%= usage_string %>" "$(validate_<%= validate %> "$2")"
@@ -1,4 +1,4 @@
1
- # :script.bash3_bouncer
1
+ <%= view_marker %>
2
2
  if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then
3
3
  printf "<%= strings[:unsupported_bash_version] -%>\n"
4
4
  exit 1
@@ -1,4 +1,4 @@
1
- # :script.wrapper
1
+ <%= view_marker %>
2
2
  <%= function_name %>() {
3
3
  <%= body.indent 2 %>
4
4
  }
data/lib/bashly.rb CHANGED
@@ -15,3 +15,15 @@ requires 'bashly/script/base'
15
15
  requires 'bashly/commands/base'
16
16
  requires 'bashly/libraries/base'
17
17
  requires 'bashly'
18
+
19
+ module Bashly
20
+ class << self
21
+ def env
22
+ ENV['BASHLY_ENV']&.to_sym
23
+ end
24
+
25
+ def production?
26
+ env == :production
27
+ end
28
+ end
29
+ end
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.7.8
4
+ version: 0.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-11 00:00:00.000000000 Z
11
+ date: 2022-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole