bashly 0.7.3 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a68036595993a9c9661c283bcb30d0b89941d15930cba9b821e2500d53087178
4
- data.tar.gz: d8d50d5c8f91f95a46a94116d3f7ffe5a66f7c2a994e87524036f91292b707f5
3
+ metadata.gz: 187dd845a74d432185c8c53460836cf856251384c750cc4c0e4f2d2d894946c9
4
+ data.tar.gz: 1b4f519c55758ca113be95a0149ca8050481e0a57c64ba5a01ce1596d0aa1035
5
5
  SHA512:
6
- metadata.gz: d7ad12eef82213a5ed61673d205dafb5626028516efe0768986dc64cf527ae346e0fa868019cb7c23b8366a277edc7f9414149ece6f2ab8178f5f0b20beedb77
7
- data.tar.gz: 3db2a86f70fb882bc63f615f25dc2e70aa818f1c5b9af9c13ce1d4d1d2c681dd1e7c5919c93422ccf1d0d440f018efefc3e8901e4af2b43a092fd652d503fee8
6
+ metadata.gz: 92a1416625eeb9d8f8e3d3b5c7b1cfaadf0b43b5d7e329af5f89173f82eb1f5d9bda10fa33d486d5e86262a8858b36ff5a8e794271d10ec57b8191f0ed96dd06
7
+ data.tar.gz: f52974cfdabc844b12ba046b155fe77dd598f5dcbfd3d7dbbf6e7b7dd0103cefb006e08cfebc0ecb93a811748e523afe18a57883ce6e71bdb080a7ec0cf138ed
@@ -9,6 +9,7 @@ module Bashly
9
9
  usage "bashly add colors [--force]"
10
10
  usage "bashly add yaml [--force]"
11
11
  usage "bashly add validations [--force]"
12
+ usage "bashly add test [--force]"
12
13
  usage "bashly add comp FORMAT [OUTPUT --force]"
13
14
  usage "bashly add (-h|--help)"
14
15
 
@@ -23,6 +24,7 @@ module Bashly
23
24
  command "colors", "Add standard functions for printing colorful and formatted text to the lib directory."
24
25
  command "yaml", "Add standard functions for reading YAML files to the lib directory."
25
26
  command "validations", "Add argument validation functions to the lib directory."
27
+ command "test", "Add approval testing."
26
28
  command "comp", "Generate a bash completions script or function."
27
29
 
28
30
  example "bashly add strings --force"
@@ -30,6 +32,7 @@ module Bashly
30
32
  example "bashly add comp script completions.bash"
31
33
 
32
34
  environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
35
+ environment "BASHLY_LIB_DIR", "The path to use for creating the library files, relative to the source dir [default: lib]"
33
36
 
34
37
  def strings_command
35
38
  add_lib 'strings'
@@ -55,6 +58,10 @@ module Bashly
55
58
  add_lib 'validations'
56
59
  end
57
60
 
61
+ def test_command
62
+ add_lib 'test'
63
+ end
64
+
58
65
  def comp_command
59
66
  format = args['FORMAT']
60
67
  output = args['OUTPUT']
@@ -5,6 +5,12 @@ module Bashly
5
5
  module Commands
6
6
  class Base < MisterBin::Command
7
7
  include AssetHelper
8
+
9
+ def validate_config
10
+ config = Config.new "#{Settings.source_dir}/bashly.yml"
11
+ validator = ConfigValidator.new config
12
+ validator.validate
13
+ end
8
14
  end
9
15
  end
10
16
  end
@@ -1,8 +1,6 @@
1
1
  module Bashly
2
2
  module Commands
3
3
  class Generate < Base
4
- using ComposeRefinements
5
-
6
4
  help "Generate the bash script and required files"
7
5
 
8
6
  usage "bashly generate [--force --quiet --upgrade --wrap FUNCTION]"
@@ -15,12 +13,14 @@ module Bashly
15
13
 
16
14
  environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
17
15
  environment "BASHLY_TARGET_DIR", "The path to use for creating the bash script [default: .]"
16
+ environment "BASHLY_LIB_DIR", "The path to use for upgrading library files, relative to the source dir [default: lib]"
18
17
  environment "BASHLY_STRICT", "When not empty, enable bash strict mode (set -euo pipefail)"
19
18
 
20
19
  example "bashly generate --force"
21
20
  example "bashly generate --wrap my_function"
22
21
 
23
22
  def run
23
+ validate_config
24
24
  create_user_files
25
25
  upgrade_libs if args['--upgrade']
26
26
  create_master_script
@@ -118,7 +118,7 @@ module Bashly
118
118
  end
119
119
 
120
120
  def config
121
- @config ||= Config.new("#{Settings.source_dir}/bashly.yml").compose
121
+ @config ||= Config.new "#{Settings.source_dir}/bashly.yml"
122
122
  end
123
123
 
124
124
  def command
@@ -9,9 +9,7 @@ module Bashly
9
9
  environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
10
10
 
11
11
  def run
12
- config = Config.new "#{Settings.source_dir}/bashly.yml"
13
- validator = ConfigValidator.new config
14
- validator.validate
12
+ validate_config
15
13
  say "!txtgrn!OK"
16
14
  end
17
15
  end
data/lib/bashly/config.rb CHANGED
@@ -4,11 +4,13 @@ module Bashly
4
4
  # A convenience class to use either a hash or a filename as a configuration
5
5
  # source
6
6
  class Config
7
+ using ComposeRefinements
8
+
7
9
  attr_reader :config
8
10
 
9
11
  def self.new(config)
10
12
  if config.is_a? String
11
- YAML.load_file config
13
+ YAML.properly_load_file(config).compose
12
14
  else
13
15
  config
14
16
  end
@@ -79,10 +79,13 @@ module Bashly
79
79
  assert_optional_string "#{key}.default", value['default']
80
80
  assert_optional_string "#{key}.validate", value['validate']
81
81
  assert_boolean "#{key}.required", value['required']
82
+ assert_boolean "#{key}.repeatable", value['repeatable']
82
83
 
83
84
  assert_array "#{key}.allowed", value['allowed'], of: :string
84
85
 
85
86
  refute value['name'].match(/^-/), "#{key}.name must not start with '-'"
87
+
88
+ refute value['required'] && value['default'], "#{key} cannot have both required and default"
86
89
  end
87
90
 
88
91
  def assert_flag(key, value)
@@ -98,10 +101,21 @@ module Bashly
98
101
 
99
102
  assert_boolean "#{key}.required", value['required']
100
103
  assert_array "#{key}.allowed", value['allowed'], of: :string
104
+ assert_array "#{key}.conflicts", value['conflicts'], of: :string
101
105
 
102
106
  assert value['long'].match(/^--[a-zA-Z0-9_\-]+$/), "#{key}.long must be in the form of '--name'" if value['long']
103
107
  assert value['short'].match(/^-[a-zA-Z0-9]$/), "#{key}.short must be in the form of '-n'" if value['short']
104
108
  refute value['arg'].match(/^-/), "#{key}.arg must not start with '-'" if value['arg']
109
+
110
+ refute value['required'] && value['default'], "#{key} cannot have both required and default"
111
+
112
+ if value['default']
113
+ assert value['arg'], "#{key}.default does not make sense without arg"
114
+ end
115
+
116
+ if value['allowed']
117
+ assert value['arg'], "#{key}.allowed does not make sense without arg"
118
+ end
105
119
  end
106
120
 
107
121
  def assert_env_var(key, value)
@@ -135,8 +149,19 @@ module Bashly
135
149
  assert_array "#{key}.commands", value['commands'], of: :command
136
150
  assert_array "#{key}.completions", value['completions'], of: :string
137
151
  assert_array "#{key}.dependencies", value['dependencies'], of: :string
152
+ assert_array "#{key}.filters", value['filters'], of: :string
138
153
  assert_array "#{key}.environment_variables", value['environment_variables'], of: :env_var
139
154
  assert_array "#{key}.examples", value['examples'], of: :string
155
+
156
+ if key == "root"
157
+ refute value['short'], "#{key}.short makes no sense"
158
+ refute value['group'], "#{key}.group makes no sense"
159
+ refute value['default'], "#{key}.default makes no sense"
160
+ refute value['private'], "#{key}.private makes no sense"
161
+ else
162
+ refute value['version'], "#{key}.version makes no sense"
163
+ refute value['extensible'], "#{key}.extensible makes no sense"
164
+ end
140
165
  end
141
166
  end
142
167
  end
@@ -0,0 +1,8 @@
1
+ module YAML
2
+ # This awkward patch is due to https://bugs.ruby-lang.org/issues/17866
3
+ def self.properly_load_file(path)
4
+ YAML.load_file path, aliases: true
5
+ rescue ArgumentError
6
+ YAML.load_file path
7
+ end
8
+ end
@@ -7,7 +7,7 @@ module Bashly
7
7
  end
8
8
 
9
9
  def config
10
- @config ||= Bashly::Config.new "#{Settings.source_dir}/bashly.yml"
10
+ @config ||= Config.new "#{Settings.source_dir}/bashly.yml"
11
11
  end
12
12
  end
13
13
  end
@@ -4,7 +4,7 @@ module Bashly
4
4
  def files
5
5
  [
6
6
  {
7
- path: "#{Settings.source_dir}/lib/#{function_name}.sh",
7
+ path: "#{Settings.full_lib_dir}/#{function_name}.sh",
8
8
  content: completions_function_code(function_name)
9
9
  }
10
10
  ]
@@ -1,38 +1,53 @@
1
1
  colors:
2
2
  files:
3
3
  - source: "templates/lib/colors.sh"
4
- target: "%{user_source_dir}/lib/colors.sh"
4
+ target: "%{user_lib_dir}/colors.sh"
5
5
 
6
6
  config:
7
7
  files:
8
8
  - source: "templates/lib/config.sh"
9
- target: "%{user_source_dir}/lib/config.sh"
9
+ target: "%{user_lib_dir}/config.sh"
10
10
 
11
11
  yaml:
12
12
  files:
13
13
  - source: "templates/lib/yaml.sh"
14
- target: "%{user_source_dir}/lib/yaml.sh"
14
+ target: "%{user_lib_dir}/yaml.sh"
15
15
 
16
16
  lib:
17
17
  files:
18
18
  - source: "templates/lib/sample_function.sh"
19
- target: "%{user_source_dir}/lib/sample_function.sh"
19
+ target: "%{user_lib_dir}/sample_function.sh"
20
20
 
21
21
  strings:
22
22
  files:
23
23
  - source: "templates/strings.yml"
24
24
  target: "%{user_source_dir}/bashly-strings.yml"
25
25
 
26
+ test:
27
+ files:
28
+ - source: "templates/test/approvals.bash"
29
+ target: "%{user_target_dir}/test/approvals.bash"
30
+ - source: "templates/test/approve"
31
+ target: "%{user_target_dir}/test/approve"
32
+
33
+ post_install_message: |
34
+ Edit your tests in !txtgrn!test/approve!txtrst! and then run:
35
+
36
+ !txtpur!$ ./test/approve!txtrst!"
37
+
38
+ Docs: !undblu!https://github.com/DannyBen/approvals.bash
39
+
40
+
26
41
  validations:
27
42
  files:
28
43
  - source: "templates/lib/validations/validate_dir_exists.sh"
29
- target: "%{user_source_dir}/lib/validations/validate_dir_exists.sh"
44
+ target: "%{user_lib_dir}/validations/validate_dir_exists.sh"
30
45
  - source: "templates/lib/validations/validate_file_exists.sh"
31
- target: "%{user_source_dir}/lib/validations/validate_file_exists.sh"
46
+ target: "%{user_lib_dir}/validations/validate_file_exists.sh"
32
47
  - source: "templates/lib/validations/validate_integer.sh"
33
- target: "%{user_source_dir}/lib/validations/validate_integer.sh"
48
+ target: "%{user_lib_dir}/validations/validate_integer.sh"
34
49
  - source: "templates/lib/validations/validate_not_empty.sh"
35
- target: "%{user_source_dir}/lib/validations/validate_not_empty.sh"
50
+ target: "%{user_lib_dir}/validations/validate_not_empty.sh"
36
51
 
37
52
  completions: :CompletionsFunction
38
53
  completions_script: :CompletionsScript
@@ -6,7 +6,7 @@ module Bashly
6
6
  end
7
7
 
8
8
  def config
9
- @config ||= YAML.load_file(config_path)
9
+ @config ||= YAML.properly_load_file(config_path)
10
10
  end
11
11
 
12
12
  def config_path
@@ -57,7 +57,11 @@ module Bashly
57
57
  end
58
58
 
59
59
  def target_file_args
60
- { user_source_dir: Settings.source_dir }
60
+ {
61
+ user_source_dir: Settings.source_dir,
62
+ user_target_dir: Settings.target_dir,
63
+ user_lib_dir: Settings.full_lib_dir,
64
+ }
61
65
  end
62
66
  end
63
67
  end
@@ -13,7 +13,7 @@ module Bashly
13
13
  private
14
14
 
15
15
  def values!
16
- defaults = YAML.load_file asset("templates/strings.yml")
16
+ defaults = YAML.properly_load_file asset("templates/strings.yml")
17
17
  defaults.merge project_strings
18
18
  end
19
19
 
@@ -23,7 +23,7 @@ module Bashly
23
23
 
24
24
  def project_strings!
25
25
  if File.exist? project_strings_path
26
- YAML.load_file project_strings_path
26
+ YAML.properly_load_file project_strings_path
27
27
  else
28
28
  {}
29
29
  end
@@ -22,7 +22,7 @@ module ComposeRefinements
22
22
  end
23
23
 
24
24
  def safe_load_yaml(path)
25
- loaded = YAML.load_file path
25
+ loaded = YAML.properly_load_file path
26
26
  return loaded if loaded.is_a? Array or loaded.is_a? Hash
27
27
  raise Bashly::ConfigurationError, "Cannot find a valid YAML in !txtgrn!#{path}"
28
28
 
@@ -10,12 +10,14 @@ module Bashly
10
10
  arg
11
11
  catch_all
12
12
  completions
13
+ conflicts
13
14
  default
14
15
  dependencies
15
16
  description
16
17
  environment_variables
17
18
  examples
18
19
  extensible
20
+ filters
19
21
  flags
20
22
  footer
21
23
  group
@@ -24,6 +26,7 @@ module Bashly
24
26
  name
25
27
  parent_name
26
28
  private
29
+ repeatable
27
30
  required
28
31
  short
29
32
  validate
@@ -33,7 +36,6 @@ module Bashly
33
36
  def initialize(options)
34
37
  raise Error, "Invalid options provided" unless options.respond_to? :keys
35
38
  @options = options
36
- validate_options if respond_to? :validate_options
37
39
  end
38
40
 
39
41
  def optional
@@ -125,13 +125,7 @@ module Bashly
125
125
  # This is meant to provide the user with the ability to add custom
126
126
  # functions
127
127
  def user_lib
128
- @user_lib ||= Dir["#{Settings.source_dir}/lib/**/*.sh"].sort
129
- end
130
-
131
- # Raise an exception if there are some serious issues with the command
132
- # definition. This is called by Base#initialize.
133
- def validate_options
134
- Bashly::ConfigValidator.new(options).validate
128
+ @user_lib ||= Dir["#{Settings.full_lib_dir}/**/*.sh"].sort
135
129
  end
136
130
 
137
131
  end
@@ -19,6 +19,7 @@ module Bashly
19
19
  result = [aliases.join(", ")]
20
20
  result << arg.upcase if arg
21
21
  result << strings[:required] if required and extended
22
+ result << strings[:repeatable] if repeatable and extended
22
23
  result.join " "
23
24
  end
24
25
  end
@@ -1,7 +1,7 @@
1
1
  module Bashly
2
2
  class Settings
3
3
  class << self
4
- attr_writer :source_dir, :target_dir
4
+ attr_writer :source_dir, :target_dir, :lib_dir, :strict
5
5
 
6
6
  def source_dir
7
7
  @source_dir ||= ENV['BASHLY_SOURCE_DIR'] || 'src'
@@ -10,6 +10,18 @@ module Bashly
10
10
  def target_dir
11
11
  @target_dir ||= ENV['BASHLY_TARGET_DIR'] || '.'
12
12
  end
13
+
14
+ def lib_dir
15
+ @lib_dir ||= ENV['BASHLY_LIB_DIR'] || 'lib'
16
+ end
17
+
18
+ def strict
19
+ @strict ||= ENV['BASHLY_STRICT']
20
+ end
21
+
22
+ def full_lib_dir
23
+ "#{source_dir}/#{lib_dir}"
24
+ end
13
25
  end
14
26
  end
15
27
  end
@@ -14,6 +14,7 @@ group: "%{group} Commands:"
14
14
  command_shortcut: "Shortcut: %{short}"
15
15
  default_command_summary: "%{summary} (default)"
16
16
  required: "(required)"
17
+ repeatable: "(repeatable)"
17
18
  default: "Default: %{value}"
18
19
  allowed: "Allowed: %{values}"
19
20
 
@@ -25,6 +26,7 @@ version_flag_text: Show version number
25
26
  flag_requires_an_argument: "%{name} requires an argument: %{usage}"
26
27
  invalid_argument: "invalid argument: %s"
27
28
  invalid_flag: "invalid option: %s"
29
+ conflicting_flags: "conflicting options: %s cannot be used with %s"
28
30
  missing_required_argument: "missing required argument: %{arg}\\nusage: %{usage}"
29
31
  missing_required_flag: "missing required flag: %{usage}"
30
32
  missing_required_environment_variable: "missing required environment variable: %{var}"
@@ -0,0 +1,93 @@
1
+ # approvals.bash v0.2.7
2
+ #
3
+ # Interactive approval testing for Bash.
4
+ # https://github.com/DannyBen/approvals.bash
5
+ approve() {
6
+ local expected approval approval_file actual cmd
7
+ approvals_dir=${APPROVALS_DIR:=approvals}
8
+
9
+ cmd=$1
10
+ actual=$(eval "$cmd" 2>&1)
11
+ last_exit_code=$?
12
+ approval=$(printf "%b" "$cmd" | tr -s -c "[:alnum:]" _)
13
+ approval_file="$approvals_dir/${2:-"$approval"}"
14
+
15
+ [[ -d "$approvals_dir" ]] || mkdir "$approvals_dir"
16
+
17
+ if [[ -f "$approval_file" ]]; then
18
+ expected=$(cat "$approval_file")
19
+ else
20
+ echo "--- [$(blue "new: $cmd")] ---"
21
+ printf "%b\n" "$actual"
22
+ echo "--- [$(blue "new: $cmd")] ---"
23
+ expected="$actual"
24
+ user_approval "$cmd" "$actual" "$approval_file"
25
+ return
26
+ fi
27
+
28
+ if [[ "$(printf "%b" "$actual")" = "$(printf "%b" "$expected")" ]]; then
29
+ green "PASS $cmd"
30
+ else
31
+ echo "--- [$(blue "diff: $cmd")] ---"
32
+ $diff_cmd <(printf "%b" "$expected\n") <(printf "%b" "$actual\n" ) | tail -n +4
33
+ echo "--- [$(blue "diff: $cmd")] ---"
34
+ user_approval "$cmd" "$actual" "$approval_file"
35
+ fi
36
+ }
37
+
38
+ describe() {
39
+ cyan "TEST $*"
40
+ }
41
+
42
+ fail() {
43
+ red "FAIL $*"
44
+ exit 1
45
+ }
46
+
47
+ pass() {
48
+ green "PASS $*"
49
+ return 0
50
+ }
51
+
52
+ expect_exit_code() {
53
+ if [[ $last_exit_code == "$1" ]]; then
54
+ pass "exit $last_exit_code"
55
+ else
56
+ fail "Expected exit code $1, got $last_exit_code"
57
+ fi
58
+ }
59
+
60
+ red() { printf "\e[31m%b\e[0m\n" "$*"; }
61
+ green() { printf "\e[32m%b\e[0m\n" "$*"; }
62
+ blue() { printf "\e[34m%b\e[0m\n" "$*"; }
63
+ magenta() { printf "\e[35m%b\e[0m\n" "$*"; }
64
+ cyan() { printf "\e[36m%b\e[0m\n" "$*"; }
65
+
66
+ # Private
67
+
68
+ user_approval() {
69
+ local cmd="$1"
70
+ local actual="$2"
71
+ local approval_file="$3"
72
+
73
+ if [[ -v CI || -v GITHUB_ACTIONS ]]; then
74
+ fail "$cmd"
75
+ fi
76
+
77
+ echo
78
+ printf "[A]pprove? \n"
79
+ response=$(bash -c "read -n 1 key; echo \$key")
80
+ printf "\r"
81
+ if [[ $response =~ [Aa] ]]; then
82
+ printf "%b\n" "$actual" > "$approval_file"
83
+ pass "$cmd"
84
+ else
85
+ fail "$cmd"
86
+ fi
87
+ }
88
+
89
+ if diff --help | grep -- --color > /dev/null 2>&1; then
90
+ diff_cmd="diff --unified --color=always"
91
+ else
92
+ diff_cmd="diff --unified"
93
+ fi
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.7.3"
2
+ VERSION = "0.7.7"
3
3
  end
@@ -2,7 +2,7 @@
2
2
  initialize() {
3
3
  version="<%= version %>"
4
4
  long_usage=''
5
- <%= ENV['BASHLY_STRICT'] ? "set -euo pipefail" : "set -e" %>
5
+ <%= Settings.strict ? "set -euo pipefail" : "set -e" %>
6
6
 
7
7
  <%= load_user_file("initialize.sh", placeholder: false).indent 2 %>
8
8
  }
@@ -14,6 +14,7 @@ parse_requirements() {
14
14
  <%= render(:catch_all_filter).indent 2 %>
15
15
  <%= render(:default_assignments).indent 2 %>
16
16
  <%= render(:whitelist_filter).indent 2 %>
17
+ <%= render(:user_filter).indent 2 %>
17
18
  }
18
19
 
19
20
  % commands.each do |command|
@@ -0,0 +1,11 @@
1
+ # :command.user_filter
2
+ % if filters
3
+ % filters.each do |filter|
4
+ filter_error=$(filter_<%= filter %>)
5
+ if [[ -n $filter_error ]]; then
6
+ echo "$filter_error"
7
+ exit 1
8
+ fi
9
+
10
+ % end
11
+ % end
@@ -6,8 +6,18 @@ if [[ ! ${args[<%= arg.name %>]} =~ ^(<%= arg.allowed.join '|' %>)$ ]]; then
6
6
  fi
7
7
  % end
8
8
  % whitelisted_flags.each do |flag|
9
+ % if flag.repeatable
10
+ eval "input_array=(${args[<%= flag.name %>]})"
11
+ for i in "${input_array[@]}"; do
12
+ if [[ ! $i =~ ^(<%= flag.allowed.join '|' %>)$ ]]; then
13
+ printf "%s\n" "<%= strings[:disallowed_flag] % { name: flag.name, allowed: flag.allowed.join(', ') } %>"
14
+ exit 1
15
+ fi
16
+ done
17
+ % else
9
18
  if [[ ! ${args[<%= flag.name %>]} =~ ^(<%= flag.allowed.join '|' %>)$ ]]; then
10
19
  printf "%s\n" "<%= strings[:disallowed_flag] % { name: flag.name, allowed: flag.allowed.join(', ') } %>"
11
20
  exit 1
12
21
  fi
22
+ % end
13
23
  % end
@@ -1,17 +1,30 @@
1
1
  # :flag.case
2
2
  <%= aliases.join " | " %> )
3
+ <%= render(:conflicts).indent 2 %>
3
4
  % if arg
4
5
  if [[ -n ${2+x} ]]; then
5
6
  <%= render(:validations).indent 4 %>
7
+ % if repeatable
8
+ if [[ -z ${args[<%= name %>]+x} ]]; then
9
+ args[<%= name %>]="\"$2\""
10
+ else
11
+ args[<%= name %>]="${args[<%= name %>]} \"$2\""
12
+ fi
13
+ % else
6
14
  args[<%= name %>]="$2"
15
+ % end
7
16
  shift
8
17
  shift
9
18
  else
10
19
  printf "%s\n" "<%= strings[:flag_requires_an_argument] % { name: name, usage: usage_string } %>"
11
20
  exit 1
12
21
  fi
22
+ % else
23
+ % if repeatable
24
+ (( args[<%= name %>]+=1 ))
13
25
  % else
14
26
  args[<%= name %>]=1
27
+ % end
15
28
  shift
16
29
  % end
17
30
  ;;
@@ -0,0 +1,18 @@
1
+ # :flag.conflicts
2
+ % if conflicts
3
+ % if conflicts.count == 1
4
+ if [[ -n "${args[<%= conflicts.first %>]:-}" ]]; then
5
+ printf "<%= strings[:conflicting_flags] %>\n" "$key" "<%= conflicts.first %>"
6
+ exit 1
7
+ fi
8
+
9
+ % else
10
+ for conflict in <%= conflicts.join ' ' %>; do
11
+ if [[ -n "${args[$conflict]:-}" ]]; then
12
+ printf "<%= strings[:conflicting_flags] %>\n" "$key" "$conflict"
13
+ exit 1
14
+ fi
15
+ done
16
+
17
+ % end
18
+ % end
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env bash
2
- # This script was generated by bashly (https://github.com/DannyBen/bashly)
2
+ # This script was generated by bashly <%= Bashly::VERSION %> (https://bashly.dannyb.co)
3
3
  # Modifying it manually is not recommended
4
4
 
data/lib/bashly.rb CHANGED
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  requires 'bashly/concerns'
9
9
 
10
+ requires 'bashly/extensions'
10
11
  requires 'bashly/settings'
11
12
  requires 'bashly/exceptions'
12
13
  requires 'bashly/refinements'
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.3
4
+ version: 0.7.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: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2022-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -93,6 +93,7 @@ files:
93
93
  - lib/bashly/extensions/array.rb
94
94
  - lib/bashly/extensions/file.rb
95
95
  - lib/bashly/extensions/string.rb
96
+ - lib/bashly/extensions/yaml.rb
96
97
  - lib/bashly/libraries.yml
97
98
  - lib/bashly/libraries/base.rb
98
99
  - lib/bashly/libraries/completions.rb
@@ -121,6 +122,7 @@ files:
121
122
  - lib/bashly/templates/lib/yaml.sh
122
123
  - lib/bashly/templates/minimal.yml
123
124
  - lib/bashly/templates/strings.yml
125
+ - lib/bashly/templates/test/approvals.bash
124
126
  - lib/bashly/version.rb
125
127
  - lib/bashly/views/argument/usage.erb
126
128
  - lib/bashly/views/argument/validations.erb
@@ -155,11 +157,13 @@ files:
155
157
  - lib/bashly/views/command/usage_examples.erb
156
158
  - lib/bashly/views/command/usage_fixed_flags.erb
157
159
  - lib/bashly/views/command/usage_flags.erb
160
+ - lib/bashly/views/command/user_filter.erb
158
161
  - lib/bashly/views/command/user_lib.erb
159
162
  - lib/bashly/views/command/version_command.erb
160
163
  - lib/bashly/views/command/whitelist_filter.erb
161
164
  - lib/bashly/views/environment_variable/usage.erb
162
165
  - lib/bashly/views/flag/case.erb
166
+ - lib/bashly/views/flag/conflicts.erb
163
167
  - lib/bashly/views/flag/usage.erb
164
168
  - lib/bashly/views/flag/validations.erb
165
169
  - lib/bashly/views/wrapper/bash3_bouncer.erb
@@ -188,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
192
  - !ruby/object:Gem::Version
189
193
  version: '0'
190
194
  requirements: []
191
- rubygems_version: 3.3.6
195
+ rubygems_version: 3.2.15
192
196
  signing_key:
193
197
  specification_version: 4
194
198
  summary: Bash Command Line Tool Generator