bashly 0.7.1 → 0.7.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53a5744ae1746cdd47de191ea91539ab7336aca894f583384ef0b170c03a746e
4
- data.tar.gz: 0e1e9bc417d3947bcce84c3c6f44df87521dfeeae2329cc736a53816cb66cba3
3
+ metadata.gz: 701ac68c31b0dc916b212886b694c8aef4994aabdd703cfffe5bd592a91d1989
4
+ data.tar.gz: c9968bd61faf7ffc1f52e9eefc65fa54a88ee09326238618809eb66e65a17fb0
5
5
  SHA512:
6
- metadata.gz: 72154aafdc3c3787b4d23a2935192a92c21b94b830d7fb01c22057ed839d30120d8a31a8962b7b075110551d034b2c971b92010e55c88a17d4e9041ecb309ad7
7
- data.tar.gz: a02638101b685d5e9de575fe4537991c558c462dc030355b5e8ab6ffe4f32b8018c510afb516f51c02d4412a20c21a3703b5dc5872a0f377baa343345f045605
6
+ metadata.gz: dd50a1a52f24a5a7989266090827f21fa4265856d9319ab1eff288bab8e3bd2b0256efec8462387fe992f2adba175bbb50b2dd9b59e580e5b4a97f2aba9849dd
7
+ data.tar.gz: f40b18e9876e6297a1bcb8e14d9b364a88cb05f8db1fbaff31e3746f96961db581dbda6bd33a5a9147767c62afaab7caf7541fdde02167403d17ef4ec48933ff
@@ -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]"
@@ -82,7 +80,7 @@ module Bashly
82
80
  end
83
81
 
84
82
  def create_root_command_file
85
- create_file "#{Settings.source_dir}/root_command.sh", command.render(:default_root_script)
83
+ create_file "#{Settings.source_dir}/#{command.filename}", command.render(:default_root_script)
86
84
  end
87
85
 
88
86
  def create_all_command_files
@@ -98,7 +96,7 @@ module Bashly
98
96
  if File.exist? file and !args['--force']
99
97
  quiet_say "!txtblu!skipped!txtrst! #{file} (exists)"
100
98
  else
101
- File.write file, content
99
+ File.deep_write file, content
102
100
  quiet_say "!txtgrn!created!txtrst! #{file}"
103
101
  end
104
102
  end
@@ -118,7 +116,7 @@ module Bashly
118
116
  end
119
117
 
120
118
  def config
121
- @config ||= Config.new("#{Settings.source_dir}/bashly.yml").compose
119
+ @config ||= Config.new "#{Settings.source_dir}/bashly.yml"
122
120
  end
123
121
 
124
122
  def command
@@ -0,0 +1,68 @@
1
+ module Bashly
2
+ # This is a `Command` concern responsible for providing additional scopes.
3
+ module CommandScopes
4
+ # Returns only the names of the Commands
5
+ def command_names
6
+ commands.map &:name
7
+ end
8
+
9
+ # Returns a flat array containing all the commands in this tree.
10
+ # This includes self + children + grandchildres + ...
11
+ def deep_commands
12
+ result = []
13
+ commands.each do |command|
14
+ result << command
15
+ if command.commands.any?
16
+ result += command.deep_commands
17
+ end
18
+ end
19
+ result
20
+ end
21
+
22
+ # If any of this command's subcommands has the default option set to
23
+ # true, this default command will be returned, nil otherwise.
24
+ def default_command
25
+ commands.find { |c| c.default }
26
+ end
27
+
28
+ # Returns an array of all the default Args
29
+ def default_args
30
+ args.select &:default
31
+ end
32
+
33
+ # Returns an array of all the default Environment Variables
34
+ def default_environment_variables
35
+ environment_variables.select &:default
36
+ end
37
+
38
+ # Returns an array of all the default Flags
39
+ def default_flags
40
+ flags.select &:default
41
+ end
42
+
43
+ # Returns an array of all the required Arguments
44
+ def required_args
45
+ args.select &:required
46
+ end
47
+
48
+ # Returns an array of all the required EnvironmentVariables
49
+ def required_environment_variables
50
+ environment_variables.select &:required
51
+ end
52
+
53
+ # Returns an array of all the required Flags
54
+ def required_flags
55
+ flags.select &:required
56
+ end
57
+
58
+ # Returns an array of all the args with a whitelist
59
+ def whitelisted_args
60
+ args.select &:allowed
61
+ end
62
+
63
+ # Returns an array of all the flags with a whitelist arg
64
+ def whitelisted_flags
65
+ flags.select &:allowed
66
+ end
67
+ end
68
+ 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.load_file(config).compose
12
14
  else
13
15
  config
14
16
  end
@@ -81,6 +81,8 @@ module Bashly
81
81
  assert_boolean "#{key}.required", value['required']
82
82
 
83
83
  assert_array "#{key}.allowed", value['allowed'], of: :string
84
+
85
+ refute value['name'].match(/^-/), "#{key}.name must not start with '-'"
84
86
  end
85
87
 
86
88
  def assert_flag(key, value)
@@ -96,6 +98,10 @@ module Bashly
96
98
 
97
99
  assert_boolean "#{key}.required", value['required']
98
100
  assert_array "#{key}.allowed", value['allowed'], of: :string
101
+
102
+ assert value['long'].match(/^--[a-zA-Z0-9_\-]+$/), "#{key}.long must be in the form of '--name'" if value['long']
103
+ assert value['short'].match(/^-[a-zA-Z0-9]$/), "#{key}.short must be in the form of '-n'" if value['short']
104
+ refute value['arg'].match(/^-/), "#{key}.arg must not start with '-'" if value['arg']
99
105
  end
100
106
 
101
107
  def assert_env_var(key, value)
@@ -117,6 +123,7 @@ module Bashly
117
123
  assert_optional_string "#{key}.help", value['help']
118
124
  assert_optional_string "#{key}.footer", value['footer']
119
125
  assert_optional_string "#{key}.group", value['group']
126
+ assert_optional_string "#{key}.filename", value['filename']
120
127
 
121
128
  assert_boolean "#{key}.default", value['default']
122
129
  assert_version "#{key}.version", value['version']
@@ -128,6 +135,7 @@ module Bashly
128
135
  assert_array "#{key}.commands", value['commands'], of: :command
129
136
  assert_array "#{key}.completions", value['completions'], of: :string
130
137
  assert_array "#{key}.dependencies", value['dependencies'], of: :string
138
+ assert_array "#{key}.filters", value['filters'], of: :string
131
139
  assert_array "#{key}.environment_variables", value['environment_variables'], of: :env_var
132
140
  assert_array "#{key}.examples", value['examples'], of: :string
133
141
  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
@@ -16,6 +16,7 @@ module Bashly
16
16
  environment_variables
17
17
  examples
18
18
  extensible
19
+ filters
19
20
  flags
20
21
  footer
21
22
  group
@@ -53,9 +54,9 @@ module Bashly
53
54
  respond_to?(method_name) ? options[key] : super
54
55
  end
55
56
 
56
- def respond_to?(method_name, include_private = false)
57
+ def respond_to_missing?(method_name, include_private = false)
57
58
  OPTION_KEYS.include?(method_name) || super
58
59
  end
59
60
  end
60
61
  end
61
- end
62
+ end
@@ -0,0 +1,49 @@
1
+ module Bashly
2
+ module Script
3
+ class CatchAll
4
+ class << self
5
+ def from_config(config)
6
+ options = case config
7
+ when nil
8
+ { enabled: false }
9
+ when String
10
+ { label: config }
11
+ when Hash
12
+ { label: config['label'], help: config['help'], required: config['required'] }
13
+ else
14
+ {}
15
+ end
16
+
17
+ new **options
18
+ end
19
+ end
20
+
21
+ def initialize(label: nil, help: nil, required: false, enabled: true)
22
+ @label, @help, @required, @enabled = label, help, required, enabled
23
+ end
24
+
25
+ def enabled?
26
+ @enabled
27
+ end
28
+
29
+ def label
30
+ enabled? ? "#{@label&.upcase}..." : nil
31
+ end
32
+
33
+ def help
34
+ enabled? ? @help : nil
35
+ end
36
+
37
+ def required?
38
+ @required
39
+ end
40
+
41
+ def usage_string
42
+ return nil unless enabled?
43
+ required? ? label : "[#{label}]"
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+
@@ -2,6 +2,7 @@ module Bashly
2
2
  module Script
3
3
  class Command < Base
4
4
  include Completions
5
+ include CommandScopes
5
6
 
6
7
  # Returns the name to be used as an action.
7
8
  # - If it is the root command, the action is "root"
@@ -30,41 +31,8 @@ module Bashly
30
31
  help ? "#{full_name} - #{summary}" : full_name
31
32
  end
32
33
 
33
- # Returns a label for the catch_all directive
34
- def catch_all_label
35
- case catch_all
36
- when nil then nil
37
- when String then "#{catch_all.upcase}..."
38
- when Hash then "#{catch_all['label'].upcase}..."
39
- else "..."
40
- end
41
- end
42
-
43
- # Returns a user defined help string for the catch_all directive
44
- def catch_all_help
45
- return nil unless catch_all
46
-
47
- if catch_all.is_a?(Hash) and catch_all['help'].is_a?(String)
48
- catch_all['help']
49
- else
50
- nil
51
- end
52
- end
53
-
54
- # Returns true if catch_all is required
55
- def catch_all_required?
56
- catch_all.is_a?(Hash) and catch_all['required']
57
- end
58
-
59
- # Returns a string suitable for catch_all Usage pattern
60
- def catch_all_usage
61
- return nil unless catch_all
62
- catch_all_required? ? catch_all_label : "[#{catch_all_label}]"
63
- end
64
-
65
- # Returns only the names of the Commands
66
- def command_names
67
- commands.map &:name
34
+ def catch_all
35
+ @catch_all ||= CatchAll.from_config options['catch_all']
68
36
  end
69
37
 
70
38
  # Returns an array of the Commands
@@ -76,40 +44,6 @@ module Bashly
76
44
  end
77
45
  end
78
46
 
79
- # Returns a flat array containing all the commands in this tree.
80
- # This includes self + children + grandchildres + ...
81
- def deep_commands
82
- result = []
83
- commands.each do |command|
84
- result << command
85
- if command.commands.any?
86
- result += command.deep_commands
87
- end
88
- end
89
- result
90
- end
91
-
92
- # Returns an array of all the default Args
93
- def default_args
94
- args.select &:default
95
- end
96
-
97
- # If any of this command's subcommands has the default option set to
98
- # true, this default command will be returned, nil otherwise.
99
- def default_command
100
- commands.find { |c| c.default }
101
- end
102
-
103
- # Returns an array of all the default Environment Variables
104
- def default_environment_variables
105
- environment_variables.select &:default
106
- end
107
-
108
- # Returns an array of all the default Flags
109
- def default_flags
110
- flags.select &:default
111
- end
112
-
113
47
  # Returns an array of EnvironmentVariables
114
48
  def environment_variables
115
49
  return [] unless options["environment_variables"]
@@ -121,7 +55,7 @@ module Bashly
121
55
  # Returns the bash filename that is expected to hold the user code
122
56
  # for this command
123
57
  def filename
124
- "#{action_name.to_underscore}_command.sh"
58
+ options["filename"] || "#{action_name.to_underscore}_command.sh"
125
59
  end
126
60
 
127
61
  # Returns an array of Flags
@@ -165,21 +99,6 @@ module Bashly
165
99
  options['parents'] || []
166
100
  end
167
101
 
168
- # Returns an array of all the required Arguments
169
- def required_args
170
- args.select &:required
171
- end
172
-
173
- # Returns an array of all the required EnvironmentVariables
174
- def required_environment_variables
175
- environment_variables.select &:required
176
- end
177
-
178
- # Returns an array of all the required Flags
179
- def required_flags
180
- flags.select &:required
181
- end
182
-
183
102
  # Returns trus if this is the root command (no parents)
184
103
  def root_command?
185
104
  parents.empty?
@@ -198,7 +117,7 @@ module Bashly
198
117
  result << arg.usage_string
199
118
  end
200
119
  result << "[options]" unless flags.empty?
201
- result << catch_all_usage if catch_all
120
+ result << catch_all.usage_string if catch_all.enabled?
202
121
  result.join " "
203
122
  end
204
123
 
@@ -215,16 +134,6 @@ module Bashly
215
134
  Bashly::ConfigValidator.new(options).validate
216
135
  end
217
136
 
218
- # Returns an array of all the args with a whitelist
219
- def whitelisted_args
220
- args.select &:allowed
221
- end
222
-
223
- # Returns an array of all the flags with a whitelist arg
224
- def whitelisted_flags
225
- flags.select &:allowed
226
- end
227
-
228
137
  end
229
138
  end
230
139
  end
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.7.1"
2
+ VERSION = "0.7.5"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  # :command.catch_all_filter
2
- % if catch_all_required?
2
+ % if catch_all.required?
3
3
  if [[ ${#other_args[@]} -eq 0 ]]; then
4
- printf "<%= strings[:missing_required_argument] % { arg: catch_all_label, usage: usage_string } %>\n"
4
+ printf "<%= strings[:missing_required_argument] % { arg: catch_all.label, usage: usage_string } %>\n"
5
5
  exit 1
6
6
  fi
7
7
  % end
@@ -1,3 +1,3 @@
1
- echo "# this file is located in '<%= Settings.source_dir %>/root_command.sh'"
1
+ echo "# this file is located in '<%= "#{Settings.source_dir}/#{filename}" %>'"
2
2
  echo "# you can edit it freely and regenerate (it will not be overwritten)"
3
3
  inspect_args
@@ -7,6 +7,7 @@ parse_requirements() {
7
7
  <%= render(:fixed_flags_filter).indent 2 %>
8
8
  <%= render(:environment_variables_filter).indent 2 %>
9
9
  <%= render(:dependencies_filter).indent 2 %>
10
+ <%= render(:user_filter).indent 2 %>
10
11
  <%= render(:command_filter).indent 2 %>
11
12
  <%= render(:parse_requirements_while).indent 2 %>
12
13
  <%= render(:required_args_filter).indent 2 %>
@@ -9,7 +9,7 @@
9
9
  % condition = "elif"
10
10
  % end
11
11
  else
12
- % if catch_all
12
+ % if catch_all.enabled?
13
13
  other_args+=("$1")
14
14
  shift
15
15
  % else
@@ -17,7 +17,7 @@ else
17
17
  exit 1
18
18
  % end
19
19
  fi
20
- % elsif catch_all
20
+ % elsif catch_all.enabled?
21
21
  other_args+=("$1")
22
22
  shift
23
23
  % else
@@ -7,8 +7,8 @@ while [[ $# -gt 0 ]]; do
7
7
 
8
8
  % end
9
9
 
10
- -* )
11
- % if catch_all
10
+ -?* )
11
+ % if catch_all.enabled?
12
12
  other_args+=("$1")
13
13
  shift
14
14
  ;;
@@ -1,4 +1,4 @@
1
1
  # :command.root_command
2
2
  root_command() {
3
- <%= load_user_file("root_command.sh").indent 2 %>
3
+ <%= load_user_file(filename).indent 2 %>
4
4
  }
@@ -37,7 +37,7 @@
37
37
  printf "<%= strings[:options] %>\n"
38
38
  <%= render(:usage_fixed_flags).indent 4 %>
39
39
  <%= render(:usage_flags).indent 4 if flags.any? %>
40
- <%= render(:usage_args).indent 4 if args.any? or catch_all_help %>
40
+ <%= render(:usage_args).indent 4 if args.any? or catch_all.help %>
41
41
  <%= render(:usage_environment_variables).indent 4 if environment_variables.any? %>
42
42
  <%= render(:usage_examples).indent 4 if examples %>
43
43
  <%= render(:footer).indent 4 if footer %>
@@ -6,9 +6,9 @@ printf "<%= strings[:arguments] %>\n"
6
6
  <%= arg.render(:usage) %>
7
7
  % end
8
8
  % end
9
- % if catch_all_help
9
+ % if catch_all.help
10
10
 
11
- echo " <%= catch_all_label %>"
12
- printf "<%= catch_all_help.wrap(76).indent(4).sanitize_for_print %>\n"
11
+ echo " <%= catch_all.label %>"
12
+ printf "<%= catch_all.help.wrap(76).indent(4).sanitize_for_print %>\n"
13
13
  echo
14
14
  % end
@@ -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
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.1
4
+ version: 0.7.5
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-11-17 00:00:00.000000000 Z
11
+ date: 2022-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.2'
33
+ version: '0.3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.2'
40
+ version: '0.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mister_bin
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +84,7 @@ files:
84
84
  - lib/bashly/commands/preview.rb
85
85
  - lib/bashly/commands/validate.rb
86
86
  - lib/bashly/concerns/asset_helper.rb
87
+ - lib/bashly/concerns/command_scopes.rb
87
88
  - lib/bashly/concerns/completions.rb
88
89
  - lib/bashly/concerns/renderable.rb
89
90
  - lib/bashly/config.rb
@@ -103,6 +104,7 @@ files:
103
104
  - lib/bashly/refinements/compose_refinements.rb
104
105
  - lib/bashly/script/argument.rb
105
106
  - lib/bashly/script/base.rb
107
+ - lib/bashly/script/catch_all.rb
106
108
  - lib/bashly/script/command.rb
107
109
  - lib/bashly/script/environment_variable.rb
108
110
  - lib/bashly/script/flag.rb
@@ -153,6 +155,7 @@ files:
153
155
  - lib/bashly/views/command/usage_examples.erb
154
156
  - lib/bashly/views/command/usage_fixed_flags.erb
155
157
  - lib/bashly/views/command/usage_flags.erb
158
+ - lib/bashly/views/command/user_filter.erb
156
159
  - lib/bashly/views/command/user_lib.erb
157
160
  - lib/bashly/views/command/version_command.erb
158
161
  - lib/bashly/views/command/whitelist_filter.erb
@@ -186,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
189
  - !ruby/object:Gem::Version
187
190
  version: '0'
188
191
  requirements: []
189
- rubygems_version: 3.2.25
192
+ rubygems_version: 3.3.7
190
193
  signing_key:
191
194
  specification_version: 4
192
195
  summary: Bash Command Line Tool Generator