bashly 0.8.10 → 0.9.1

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -0
  3. data/bin/bashly +2 -2
  4. data/lib/bashly/cli.rb +2 -3
  5. data/lib/bashly/commands/add.rb +77 -50
  6. data/lib/bashly/commands/base.rb +4 -3
  7. data/lib/bashly/commands/generate.rb +43 -36
  8. data/lib/bashly/commands/init.rb +10 -9
  9. data/lib/bashly/commands/preview.rb +4 -4
  10. data/lib/bashly/commands/validate.rb +8 -7
  11. data/lib/bashly/concerns/asset_helper.rb +1 -1
  12. data/lib/bashly/concerns/completions.rb +24 -15
  13. data/lib/bashly/concerns/renderable.rb +5 -5
  14. data/lib/bashly/concerns/validation_helpers.rb +20 -12
  15. data/lib/bashly/config.rb +1 -1
  16. data/lib/bashly/config_validator.rb +53 -27
  17. data/lib/bashly/deprecation.rb +9 -7
  18. data/lib/bashly/exceptions.rb +1 -1
  19. data/lib/bashly/extensions/array.rb +4 -4
  20. data/lib/bashly/extensions/file.rb +3 -3
  21. data/lib/bashly/extensions/string.rb +6 -6
  22. data/lib/bashly/libraries/base.rb +11 -1
  23. data/lib/bashly/libraries/completions_function.rb +9 -10
  24. data/lib/bashly/libraries/completions_script.rb +7 -8
  25. data/lib/bashly/libraries/completions_yaml.rb +7 -8
  26. data/lib/bashly/libraries/help.rb +36 -0
  27. data/lib/bashly/libraries.yml +11 -9
  28. data/lib/bashly/library.rb +8 -5
  29. data/lib/bashly/message_strings.rb +1 -1
  30. data/lib/bashly/refinements/compose_refinements.rb +2 -2
  31. data/lib/bashly/script/argument.rb +1 -1
  32. data/lib/bashly/script/base.rb +3 -2
  33. data/lib/bashly/script/catch_all.rb +6 -4
  34. data/lib/bashly/script/command.rb +48 -54
  35. data/lib/bashly/script/environment_variable.rb +5 -5
  36. data/lib/bashly/script/flag.rb +7 -7
  37. data/lib/bashly/script/wrapper.rb +6 -5
  38. data/lib/bashly/settings.rb +30 -27
  39. data/lib/bashly/templates/help/help_command.sh +30 -0
  40. data/lib/bashly/templates/lib/colors.sh +2 -2
  41. data/lib/bashly/templates/lib/config.sh +10 -10
  42. data/lib/bashly/templates/lib/yaml.sh +9 -9
  43. data/lib/bashly/templates/settings.yml +3 -0
  44. data/lib/bashly/templates/test/approvals.bash +36 -12
  45. data/lib/bashly/templates/test/approve +14 -9
  46. data/lib/bashly/version.rb +2 -2
  47. data/lib/bashly/views/command/command_fallback.gtx +9 -6
  48. data/lib/bashly/views/command/command_filter.gtx +8 -9
  49. data/lib/bashly/views/command/dependencies_filter.gtx +6 -2
  50. data/lib/bashly/views/command/fixed_flags_filter.gtx +18 -12
  51. data/lib/bashly/views/command/inspect_args.gtx +2 -2
  52. data/lib/bashly/views/command/normalize_input.gtx +1 -1
  53. data/lib/bashly/views/command/parse_requirements_while.gtx +11 -11
  54. data/lib/bashly/views/command/run.gtx +16 -13
  55. data/lib/bashly/views/command/usage_environment_variables.gtx +1 -1
  56. data/lib/bashly/views/flag/case.gtx +1 -1
  57. data/lib/bashly/views/flag/case_no_arg.gtx +1 -1
  58. metadata +10 -8
  59. data/lib/bashly/libraries/completions.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93a8d1b32e641bee6713b57ed0cd3e970c8806273f02f900909553dd391d5b43
4
- data.tar.gz: 4024323aa10f725b947d9b59c4019724bd26a58945ff1436102d57130a677442
3
+ metadata.gz: e1139c7453fff329c05879511103b80b6a89a76896a9d0cb3f5cad016d224b15
4
+ data.tar.gz: acda8a068081a04a32218be7ddfee8cad1612b3dfafd9e1465170fd9cded32db
5
5
  SHA512:
6
- metadata.gz: 81a26b1e7eb07c45f596db2b3f787af3580cfdc9be9490b7b361670decdf582b3eeb996a889f8409631ea4f9470cb81812d73655727189844b833849e543bbb5
7
- data.tar.gz: 3d52eb5364d947bfe5e8a9e3efa626d10da75ddd68f1dff3c279aca4f830f4ef52e17b6b65a95f2b4dfcba1927fecbcc5c9445d6f0e02dc472834f48bcb9284e
6
+ metadata.gz: 61247ecd7b928a4babdbf307004424ffa060c567a16b4eb4b062c59e51eb9812f3469981ead958bb4f08aee8cb7ecd86a32a830f6102211012540eac0b878fd4
7
+ data.tar.gz: 606e5df99d98e9853ed25a7fd516a807a90f1c40d7f19ac2ab1b8f3388a82919dd59af3b291d8de7b866d88cdcb8b1fec7883bd258b80c04f137b1729e58aca1
data/README.md CHANGED
@@ -73,6 +73,13 @@ to contribute, feel free to [open an issue][issues] or
73
73
  Visit the *[How to contribute][contributing]* page for more information.
74
74
 
75
75
 
76
+ ## Stargazers and Forkers
77
+
78
+ [![Stargazers repo roster for @DannyBen/bashly](https://reporoster.com/stars/DannyBen/bashly)](https://github.com/DannyBen/bashly/stargazers)
79
+
80
+ [![Forkers repo roster for @DannyBen/bashly](https://reporoster.com/forks/DannyBen/bashly)](https://github.com/DannyBen/bashly/network/members)
81
+
82
+
76
83
 
77
84
  [issues]: https://github.com/DannyBen/bashly/issues
78
85
  [discussions]: https://github.com/DannyBen/bashly/discussions
data/bin/bashly CHANGED
@@ -9,9 +9,9 @@ begin
9
9
  exit runner.run ARGV
10
10
  rescue Bashly::Interrupt
11
11
  say! "\nGoodbye"
12
- exit 1
12
+ exit 1
13
13
  rescue => e
14
14
  puts e.backtrace.reverse if ENV['DEBUG']
15
15
  say! "!undred!#{e.class}!txtrst!\n#{e.message}"
16
16
  exit 1
17
- end
17
+ end
data/lib/bashly/cli.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  require 'mister_bin'
2
2
 
3
3
  module Bashly
4
- # The CLI class is used by the bashly binary and forwards incoming CLI
4
+ # The CLI class is used by the bashly binary and forwards incoming CLI
5
5
  # commands to the relevant Bashly::Commands class
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
10
  footer: "Help: !txtpur!bashly COMMAND --help!txtrst!\nDocs: !undblu!https://bashly.dannyb.co"
11
11
 
12
12
  runner.route 'init', to: Commands::Init
@@ -18,5 +18,4 @@ module Bashly
18
18
  runner
19
19
  end
20
20
  end
21
-
22
21
  end
@@ -1,40 +1,61 @@
1
1
  module Bashly
2
2
  module Commands
3
3
  class Add < Base
4
- help "Add extra features and customization to your script"
5
-
6
- usage "bashly add colors [--force]"
7
- usage "bashly add comp FORMAT [OUTPUT --force]"
8
- usage "bashly add config [--force]"
9
- usage "bashly add lib [--force]"
10
- usage "bashly add settings [--force]"
11
- usage "bashly add strings [--force]"
12
- usage "bashly add test [--force]"
13
- usage "bashly add validations [--force]"
14
- usage "bashly add yaml [--force]"
15
- usage "bashly add (-h|--help)"
16
-
17
- option "-f --force", "Overwrite existing files"
18
-
19
- 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."
20
- 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."
21
-
22
- command "colors", "Add standard functions for printing colorful and formatted text to the lib directory."
23
- command "comp", "Generate a bash completions script or function."
24
- command "config", "Add standard functions for handling INI files to the lib directory."
25
- command "lib", "Create the additional lib directory for additional user scripts. All *.sh scripts in this folder will be included in the final bash script."
26
- command "settings", "Copy a sample settings.yml file to your project, allowing you to customize some bashly options."
27
- command "strings", "Copy an additional configuration file to your project, allowing you to customize all the tips and error strings."
28
- command "test", "Add approval testing."
29
- command "validations", "Add argument validation functions to the lib directory."
30
- command "yaml", "Add standard functions for reading YAML files to the lib directory."
31
-
32
- example "bashly add strings --force"
33
- example "bashly add comp function"
34
- example "bashly add comp script completions.bash"
35
-
36
- environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
37
- environment "BASHLY_LIB_DIR", "The path to use for creating the library files, relative to the source dir [default: lib]"
4
+ help 'Add extra features and customization to your script'
5
+
6
+ usage 'bashly add colors [--force]'
7
+ usage 'bashly add comp FORMAT [OUTPUT --force]'
8
+ usage 'bashly add config [--force]'
9
+ usage 'bashly add help [--force]'
10
+ usage 'bashly add lib [--force]'
11
+ usage 'bashly add settings [--force]'
12
+ usage 'bashly add strings [--force]'
13
+ usage 'bashly add test [--force]'
14
+ usage 'bashly add validations [--force]'
15
+ usage 'bashly add yaml [--force]'
16
+ usage 'bashly add (-h|--help)'
17
+
18
+ option '-f --force', 'Overwrite existing files'
19
+
20
+ param 'FORMAT', <<~USAGE
21
+ Output format, can be one of:
22
+ function : generate a function file to be included in your script.
23
+ script : generate a standalone bash completions script.
24
+ yaml : generate a yaml compatible with completely.
25
+ USAGE
26
+
27
+ param 'OUTPUT', <<~USAGE
28
+ For the 'comp function' command: Name of the generated function.
29
+ For the 'comp script' or 'comp yaml' commands: path to output file.
30
+ In all cases, this is optional and will have sensible defaults.
31
+ USAGE
32
+
33
+ command 'colors', 'Add standard functions for printing colorful and formatted text to the lib directory.'
34
+ command 'comp', 'Generate a bash completions script or function.'
35
+ command 'config', 'Add standard functions for handling INI files to the lib directory.'
36
+ command 'help', 'Add a help command, in addition to the standard --help flag.'
37
+ command 'lib', <<~USAGE
38
+ Create the lib directory for any additional user scripts.
39
+ All *.sh scripts in this directory will be included in the final bash script.
40
+ Note that if you configured a different partials_extension, then the extensions of the files in this directory need to match.
41
+ USAGE
42
+
43
+ command 'settings', 'Copy a sample settings.yml file to your project, allowing you to customize some ' \
44
+ 'bashly options.'
45
+
46
+ command 'strings', 'Copy an additional configuration file to your project, allowing you to customize all the ' \
47
+ 'tips and error strings.'
48
+
49
+ command 'test', 'Add approval testing.'
50
+ command 'validations', 'Add argument validation functions to the lib directory.'
51
+ command 'yaml', 'Add standard functions for reading YAML files to the lib directory.'
52
+ example 'bashly add strings --force'
53
+ example 'bashly add comp function'
54
+ example 'bashly add comp script completions.bash'
55
+
56
+ environment 'BASHLY_SOURCE_DIR', 'The path containing the bashly configuration and source files [default: src]'
57
+ environment 'BASHLY_LIB_DIR', 'The path to use for creating the library files, relative to the source dir ' \
58
+ '[default: lib]'
38
59
 
39
60
  attr_reader :skip_src_check
40
61
 
@@ -47,9 +68,9 @@ module Bashly
47
68
  output = args['OUTPUT']
48
69
 
49
70
  case format
50
- when "script" then add_lib 'completions_script', output
51
- when "function" then add_lib 'completions', output
52
- when "yaml" then add_lib 'completions_yaml', output
71
+ when 'script' then add_lib 'completions_script', output
72
+ when 'function' then add_lib 'completions', output
73
+ when 'yaml' then add_lib 'completions_yaml', output
53
74
  else raise Error, "Unrecognized format: #{format}"
54
75
  end
55
76
  end
@@ -58,6 +79,10 @@ module Bashly
58
79
  add_lib 'config'
59
80
  end
60
81
 
82
+ def lib_command
83
+ add_lib 'lib'
84
+ end
85
+
61
86
  def settings_command
62
87
  @skip_src_check = true
63
88
  add_lib 'settings'
@@ -67,22 +92,22 @@ module Bashly
67
92
  add_lib 'strings'
68
93
  end
69
94
 
70
- def lib_command
71
- add_lib 'lib'
72
- end
73
-
74
95
  def test_command
75
96
  add_lib 'test'
76
97
  end
77
98
 
78
- def yaml_command
79
- add_lib 'yaml'
99
+ def help_command
100
+ add_lib 'help'
80
101
  end
81
102
 
82
103
  def validations_command
83
104
  add_lib 'validations'
84
105
  end
85
106
 
107
+ def yaml_command
108
+ add_lib 'yaml'
109
+ end
110
+
86
111
  private
87
112
 
88
113
  def add_lib(name, *args)
@@ -93,26 +118,28 @@ module Bashly
93
118
  files_created += 1 if created
94
119
  end
95
120
  message = library.post_install_message
96
- say "\n#{message}" if message and files_created > 0
121
+ say "\n#{message}" if message && files_created.positive?
97
122
  end
98
123
 
99
124
  def safe_write(path, content)
100
- if !skip_src_check and !Dir.exist? Settings.source_dir
101
- raise InitError, "Directory !txtgrn!#{Settings.source_dir}!txtrst! does not exist\nRun !txtpur!bashly init!txtrst! first"
125
+ if !skip_src_check && !Dir.exist?(Settings.source_dir)
126
+ raise InitError, <<~ERROR
127
+ Directory !txtgrn!#{Settings.source_dir}!txtrst! does not exist
128
+ Run !txtpur!bashly init!txtrst! first
129
+ ERROR
102
130
  end
103
131
 
104
- if File.exist? path and !args['--force']
132
+ if File.exist?(path) && !args['--force']
105
133
  say "!txtblu!skipped!txtrst! #{path} (exists)"
106
134
  false
107
-
135
+
108
136
  else
109
137
  File.deep_write path, content
110
138
  say "!txtgrn!created!txtrst! #{path}"
111
139
  true
112
-
140
+
113
141
  end
114
142
  end
115
-
116
143
  end
117
144
  end
118
145
  end
@@ -25,9 +25,10 @@ module Bashly
25
25
  end
26
26
 
27
27
  def show_deprecations
28
- return if config_validator.deprecations.empty? or ENV['BASHLY_HIDE_DEPRECATIONS']
29
- messages = "\n" + config_validator.deprecations.map(&:message).join("\n\n") + "\n\n"
30
- say! messages
28
+ return if config_validator.deprecations.empty? || ENV['BASHLY_HIDE_DEPRECATIONS']
29
+
30
+ messages = config_validator.deprecations.map(&:message).join("\n\n")
31
+ say! "\n#{messages}\n\n"
31
32
  end
32
33
  end
33
34
  end
@@ -3,34 +3,41 @@ require 'filewatcher'
3
3
  module Bashly
4
4
  module Commands
5
5
  class Generate < Base
6
- help "Generate the bash script and required files"
7
-
8
- usage "bashly generate [options]"
9
- usage "bashly generate (-h|--help)"
10
-
11
- option "-f --force", "Overwrite existing files"
12
- option "-q --quiet", "Disable on-screen progress report"
13
- option "-u --upgrade", "Upgrade all added library functions"
14
- option "-w --watch", "Watch the source directory for changes and regenerate on change"
15
- option "-r --wrap FUNCTION", "Wrap the entire script in a function so it can also be sourced"
16
- option "-e --env ENV", "Force the generation environment (see BASHLY_ENV)"
17
-
18
- environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
19
- environment "BASHLY_TARGET_DIR", "The path to use for creating the bash script [default: .]"
20
- environment "BASHLY_LIB_DIR", "The path to use for upgrading library files, relative to the source dir [default: lib]"
21
- environment "BASHLY_STRICT", "When not empty, enable bash strict mode (set -euo pipefail)"
22
- environment "BASHLY_TAB_INDENT", "When not empty, the generated script will use tab indentation instead of spaces (every 2 leading spaces will be converted to a tab character)"
23
- environment "BASHLY_ENV", <<~EOF
6
+ help 'Generate the bash script and required files'
7
+
8
+ usage 'bashly generate [options]'
9
+ usage 'bashly generate (-h|--help)'
10
+
11
+ option '-f --force', 'Overwrite existing files'
12
+ option '-q --quiet', 'Disable on-screen progress report'
13
+ option '-u --upgrade', 'Upgrade all added library functions'
14
+ option '-w --watch', 'Watch the source directory for changes and regenerate on change'
15
+ option '-r --wrap FUNCTION', 'Wrap the entire script in a function so it can also be sourced'
16
+ option '-e --env ENV', 'Force the generation environment (see BASHLY_ENV)'
17
+
18
+ environment 'BASHLY_SOURCE_DIR', 'The path containing the bashly configuration and source ' \
19
+ 'files [default: src]'
20
+
21
+ environment 'BASHLY_TARGET_DIR', 'The path to use for creating the bash script [default: .]'
22
+ environment 'BASHLY_LIB_DIR',
23
+ 'The path to use for upgrading library files, relative to the source dir [default: lib]'
24
+
25
+ environment 'BASHLY_STRICT', 'When not empty, enable bash strict mode (set -euo pipefail)'
26
+ environment 'BASHLY_TAB_INDENT',
27
+ 'When not empty, the generated script will use tab indentation instead of spaces ' \
28
+ '(every 2 leading spaces will be converted to a tab character)'
29
+
30
+ environment 'BASHLY_ENV', <<~HELP
24
31
  Set to 'production' or 'development':
25
32
  - production generate a smaller script, without file markers
26
33
  - development generate with file markers
27
34
 
28
35
  Can be overridden with --env [default: development]
29
- EOF
36
+ HELP
30
37
 
31
- example "bashly generate --force"
32
- example "bashly generate --wrap my_function"
33
- example "bashly g -uw"
38
+ example 'bashly generate --force'
39
+ example 'bashly generate --wrap my_function'
40
+ example 'bashly g -uw'
34
41
 
35
42
  attr_reader :watching
36
43
 
@@ -56,13 +63,12 @@ module Bashly
56
63
 
57
64
  ensure
58
65
  quiet_say "!txtgrn!waiting\n"
59
-
60
66
  end
61
67
  end
62
68
 
63
69
  def generate
64
70
  with_valid_config do
65
- quiet_say "creating !txtgrn!production!txtrst! version" if Settings.production?
71
+ quiet_say 'creating !txtgrn!production!txtrst! version' if Settings.production?
66
72
  generate_all_files
67
73
  quiet_say "run !txtpur!#{master_script_path} --help!txtrst! to test your bash script" unless watching
68
74
  end
@@ -88,12 +94,11 @@ module Bashly
88
94
  def upgrade_libs
89
95
  generated_files.each do |file|
90
96
  content = File.read file
91
-
92
- if content =~ /\[@bashly-upgrade (.+)\]/
93
- args = $1.split ' '
94
- library_name = args.shift
95
- upgrade file, library_name, *args
96
- end
97
+ next unless content =~ /\[@bashly-upgrade (.+)\]/
98
+
99
+ args = $1.split
100
+ library_name = args.shift
101
+ upgrade file, library_name, *args
97
102
  end
98
103
  end
99
104
 
@@ -105,7 +110,8 @@ module Bashly
105
110
  if Library.exist? library_name
106
111
  upgrade! existing_file, library_name, *args
107
112
  else
108
- quiet_say "!txtred!warning!txtrst! not upgrading !txtcyn!#{existing_file}!txtrst!, unknown library '#{library_name}'"
113
+ quiet_say "!txtred!warning!txtrst! not upgrading !txtcyn!#{existing_file}!txtrst!, " \
114
+ "unknown library '#{library_name}'"
109
115
  end
110
116
  end
111
117
 
@@ -124,7 +130,8 @@ module Bashly
124
130
  def create_user_files
125
131
  quiet_say "creating user files in !txtgrn!#{Settings.source_dir}"
126
132
 
127
- create_file "#{Settings.source_dir}/initialize.sh", command.render(:default_initialize_script)
133
+ create_file "#{Settings.source_dir}/initialize.#{Settings.partials_extension}",
134
+ command.render(:default_initialize_script)
128
135
 
129
136
  if command.commands.empty?
130
137
  create_root_command_file
@@ -140,6 +147,7 @@ module Bashly
140
147
  def create_all_command_files
141
148
  command.deep_commands.each do |subcommand|
142
149
  next if subcommand.commands.any?
150
+
143
151
  file = "#{Settings.source_dir}/#{subcommand.filename}"
144
152
  content = subcommand.render :default_script
145
153
  create_file file, content
@@ -147,7 +155,7 @@ module Bashly
147
155
  end
148
156
 
149
157
  def create_file(file, content)
150
- if File.exist? file and !args['--force']
158
+ if File.exist?(file) && !args['--force']
151
159
  quiet_say "!txtblu!skipped!txtrst! #{file} (exists)"
152
160
  else
153
161
  File.deep_write file, content
@@ -157,12 +165,12 @@ module Bashly
157
165
 
158
166
  def create_master_script
159
167
  File.write master_script_path, script.code(tab_indent: Settings.tab_indent)
160
- FileUtils.chmod "+x", master_script_path
168
+ FileUtils.chmod '+x', master_script_path
161
169
  quiet_say "!txtgrn!created!txtrst! #{master_script_path}"
162
170
  end
163
171
 
164
172
  def script
165
- @script ||= Script::Wrapper.new(command, args['--wrap'])
173
+ @script ||= Script::Wrapper.new command, args['--wrap']
166
174
  end
167
175
 
168
176
  def master_script_path
@@ -172,7 +180,6 @@ module Bashly
172
180
  def command
173
181
  @command ||= Script::Command.new config
174
182
  end
175
-
176
183
  end
177
184
  end
178
185
  end
@@ -1,24 +1,25 @@
1
1
  module Bashly
2
2
  module Commands
3
3
  class Init < Base
4
- summary "Initialize a new workspace"
5
- help "This command will create the source folder, and place a template configuration file in it."
4
+ summary 'Initialize a new workspace'
5
+ help 'This command will create the source folder, and place a template configuration file in it.'
6
6
 
7
- usage "bashly init [--minimal]"
8
- usage "bashly init (-h|--help)"
7
+ usage 'bashly init [--minimal]'
8
+ usage 'bashly init (-h|--help)'
9
9
 
10
- option "-m --minimal", "Use a minimal configuration file (without commands)"
10
+ option '-m --minimal', 'Use a minimal configuration file (without commands)'
11
11
 
12
- environment "BASHLY_SOURCE_DIR", "The path to use for creating the configuration file [default: src]"
12
+ environment 'BASHLY_SOURCE_DIR', 'The path to use for creating the configuration file [default: src]'
13
13
 
14
14
  def run
15
- if Dir.exist? target_dir and !Dir.empty? target_dir
15
+ if Dir.exist?(target_dir) && !Dir.empty?(target_dir)
16
16
  raise InitError, "Directory !txtgrn!#{target_dir}!txtrst! already exists and is not empty"
17
17
  end
18
- Dir.mkdir target_dir unless Dir.exist? target_dir
18
+
19
+ FileUtils.mkdir_p target_dir
19
20
  File.write "#{target_dir}/bashly.yml", yaml_content
20
21
  say "!txtgrn!created!txtrst! #{target_dir}/bashly.yml"
21
- say "run !txtpur!bashly generate!txtrst! to create the bash script"
22
+ say 'run !txtpur!bashly generate!txtrst! to create the bash script'
22
23
  end
23
24
 
24
25
  private
@@ -1,12 +1,12 @@
1
1
  module Bashly
2
2
  module Commands
3
3
  class Preview < Base
4
- help "Generate the bash script to STDOUT"
4
+ help 'Generate the bash script to STDOUT'
5
5
 
6
- usage "bashly preview"
7
- usage "bashly preview (-h|--help)"
6
+ usage 'bashly preview'
7
+ usage 'bashly preview (-h|--help)'
8
8
 
9
- environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
9
+ environment 'BASHLY_SOURCE_DIR', 'The path containing the bashly configuration and source files [default: src]'
10
10
 
11
11
  def run
12
12
  with_valid_config do
@@ -1,25 +1,26 @@
1
1
  module Bashly
2
2
  module Commands
3
3
  class Validate < Base
4
- help "Scan the configuration file for errors"
4
+ help 'Scan the configuration file for errors'
5
5
 
6
- usage "bashly validate [--verbose]"
7
- usage "bashly validate (-h|--help)"
6
+ usage 'bashly validate [--verbose]'
7
+ usage 'bashly validate (-h|--help)'
8
8
 
9
- option "-v --verbose", "Show the bashly configuration file prior to validating. This is useful when using split config (import) since it will show the final compiled configuration."
9
+ option '-v --verbose', 'Show the bashly configuration file prior to validating. ' \
10
+ 'This is useful when using split config (import) since it will show the final compiled configuration.'
10
11
 
11
- environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
12
+ environment 'BASHLY_SOURCE_DIR', 'The path containing the bashly configuration and source files [default: src]'
12
13
 
13
14
  def run
14
15
  if args['--verbose']
15
16
  lp config
16
- puts "---"
17
+ puts '---'
17
18
  end
18
19
  validate_config
19
20
  show_deprecations
20
21
  deprecations = config_validator.deprecations
21
22
  if deprecations.empty?
22
- say "!txtgrn!OK"
23
+ say '!txtgrn!OK'
23
24
  else
24
25
  say "!txtred!WARNING!txtrst! Found #{deprecations.count} deprecations"
25
26
  end
@@ -8,4 +8,4 @@ module Bashly
8
8
  File.read asset(path)
9
9
  end
10
10
  end
11
- end
11
+ end
@@ -6,16 +6,14 @@ module Bashly
6
6
  module Completions
7
7
  module Flag
8
8
  def completion_data(command_full_name)
9
- result = {}
10
9
  comps = allowed || completions
10
+ return {} unless comps
11
11
 
12
- if comps
13
- aliases.each do |name|
14
- result["#{command_full_name}*#{name}"] = comps
15
- end
12
+ aliases.to_h do |name|
13
+ prefix = command_full_name
14
+ prefix = "#{prefix}*" unless prefix.end_with? '*'
15
+ ["#{prefix}#{name}", comps]
16
16
  end
17
-
18
- result
19
17
  end
20
18
  end
21
19
 
@@ -23,13 +21,14 @@ module Bashly
23
21
  def completion_data(with_version: true)
24
22
  result = {}
25
23
 
26
- all_full_names.each do |name|
27
- result[name] = completion_words(with_version: with_version)
24
+ completion_full_names.each do |name|
25
+ name = "#{name}*" if name.include? '*'
26
+ result[name] = completion_words with_version: with_version
28
27
  flags.each do |flag|
29
28
  result.merge! flag.completion_data(name)
30
29
  end
31
30
  end
32
-
31
+
33
32
  commands.each do |command|
34
33
  result.merge! command.completion_data(with_version: false)
35
34
  end
@@ -42,13 +41,24 @@ module Bashly
42
41
  end
43
42
 
44
43
  def completion_function(name = nil)
45
- completion_generator.wrapper_function(name)
44
+ completion_generator.wrapper_function name
45
+ end
46
+
47
+ protected
48
+
49
+ def completion_full_names
50
+ if parent_command
51
+ glue = parent_command.global_flags? ? '*' : ' '
52
+ parent_command.completion_full_names.product(aliases).map { |a| a.join glue }
53
+ else
54
+ aliases
55
+ end
46
56
  end
47
57
 
48
58
  private
49
59
 
50
60
  def completion_generator
51
- Completely::Completions.new(completion_data)
61
+ Completely::Completions.new completion_data
52
62
  end
53
63
 
54
64
  def completion_flag_names
@@ -63,14 +73,13 @@ module Bashly
63
73
  trivial_flags = %w[--help -h]
64
74
  trivial_flags += %w[--version -v] if with_version
65
75
  all = (
66
- command_aliases + trivial_flags +
76
+ command_aliases + trivial_flags +
67
77
  completion_flag_names + completion_allowed_args
68
78
  )
69
79
 
70
80
  all += completions if completions
71
81
  all.compact.uniq.sort
72
82
  end
73
-
74
83
  end
75
84
  end
76
- end
85
+ end
@@ -11,7 +11,7 @@ module Bashly
11
11
  end
12
12
 
13
13
  def view_marker(id = nil)
14
- id ||= ":#{caller_locations.first.path}"
14
+ id ||= ":#{caller_locations(1..1).first.path}"
15
15
  "# #{id}" unless Settings.production?
16
16
  end
17
17
 
@@ -23,7 +23,7 @@ module Bashly
23
23
  content = if File.exist? path
24
24
  File.read(path).remove_front_matter
25
25
  elsif placeholder
26
- %q[echo "error: cannot load file"]
26
+ 'echo "error: cannot load file"'
27
27
  else
28
28
  ''
29
29
  end
@@ -38,15 +38,15 @@ module Bashly
38
38
  end
39
39
 
40
40
  def self_views_path
41
- @self_view_path ||= "#{base_views_path}/#{views_subfolder}"
41
+ @self_views_path ||= "#{base_views_path}/#{views_subfolder}"
42
42
  end
43
43
 
44
44
  def base_views_path
45
- @base_views_path ||= File.expand_path("../views/", __dir__)
45
+ @base_views_path ||= File.expand_path '../views/', __dir__
46
46
  end
47
47
 
48
48
  def views_subfolder
49
49
  @views_subfolder ||= self.class.name.split('::').last.to_underscore
50
50
  end
51
51
  end
52
- end
52
+ end