bashly 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +53 -64
  3. data/lib/bashly/cli.rb +1 -0
  4. data/lib/bashly/commands/add.rb +62 -0
  5. data/lib/bashly/commands/base.rb +10 -0
  6. data/lib/bashly/commands/generate.rb +1 -4
  7. data/lib/bashly/commands/init.rb +3 -13
  8. data/lib/bashly/commands/preview.rb +1 -3
  9. data/lib/bashly/concerns/asset_helper.rb +7 -0
  10. data/lib/bashly/concerns/renderable.rb +4 -0
  11. data/lib/bashly/message_strings.rb +36 -0
  12. data/lib/bashly/models/base.rb +2 -0
  13. data/lib/bashly/models/command.rb +21 -8
  14. data/lib/bashly/templates/bashly.yml +10 -0
  15. data/lib/bashly/templates/lib/colors.sh +32 -0
  16. data/lib/bashly/templates/lib/config.sh +93 -0
  17. data/lib/bashly/templates/lib/sample_function.sh +13 -0
  18. data/lib/bashly/templates/minimal.yml +3 -0
  19. data/lib/bashly/templates/strings.yml +19 -0
  20. data/lib/bashly/version.rb +1 -1
  21. data/lib/bashly/views/command/master_script.erb +1 -0
  22. data/lib/bashly/views/command/parse_args_case.erb +2 -2
  23. data/lib/bashly/views/command/parse_args_while.erb +1 -1
  24. data/lib/bashly/views/command/required_args_filter.erb +1 -2
  25. data/lib/bashly/views/command/required_flags_filter.erb +1 -1
  26. data/lib/bashly/views/command/usage.erb +6 -4
  27. data/lib/bashly/views/command/usage_args.erb +1 -1
  28. data/lib/bashly/views/command/usage_commands.erb +2 -2
  29. data/lib/bashly/views/command/usage_environment_variables.erb +7 -0
  30. data/lib/bashly/views/command/usage_examples.erb +6 -0
  31. data/lib/bashly/views/command/usage_fixed_flags.erb +2 -2
  32. data/lib/bashly/views/command/user_lib.erb +6 -0
  33. data/lib/bashly/views/flag/case.erb +1 -1
  34. data/lib/bashly.rb +3 -1
  35. metadata +13 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e4dbc588718b280b13a81c8adbd2f4f86da7ec536baf3666d58592bfb2854ac5
4
- data.tar.gz: 867936a132914810eb18cfb6b3ce10d36844c1e20ed348279374d4c2f2311bc7
3
+ metadata.gz: 728137708fa1cabea46440dcc99eaded654fbf3f522d86f4bea6b47cb10ce823
4
+ data.tar.gz: eccdb7dc7bb05af0780a16f2f15f8fff7748127946c7243df720cd8d347bfe68
5
5
  SHA512:
6
- metadata.gz: a1d3adacfcc29c6d74a0bbaa9ff339ce6150d1035588d2641f9094c486a572111c205e1d233bd9023e44e56c1f2c8e223488d34b5c3427f67b1291c7478598f5
7
- data.tar.gz: 70884518d2343dd3915f03ecd0cf46809324c1a026fc28f9245ae57bd7e2587a5fb4a9a6e7a4cd5137b9d8110a28bb415658de48c7eb63d58e3b27bd4cb64403
6
+ metadata.gz: 261c3c410b87b9b0693d60dddad9f88aeeaa55160c8ef624366783a76771227c0076fc0aad4f9357220f50a53ab0902323e78287eb3222b40ebe5cafe871a088
7
+ data.tar.gz: 7164422d5e1027abc69b77b57380ffefb574575f5eaf6362ba8bc5fcad8894135cd7a382b444b3c54cabc6f05ba519d8fa06bcfa503a714feb85bcac031f12f7
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
- Bashly - Bash CLI Generator
1
+ <div align='center'>
2
+ <img src='bashly-logo.svg' width=300>
3
+
4
+ Bashly - Bash CLI Framework and Generator
2
5
  ==================================================
3
6
 
4
- Create beautiful bash scripts from simple YAML configuration.
7
+ Create beautiful bash scripts from simple YAML configuration
5
8
 
6
9
  [![Gem Version](https://badge.fury.io/rb/bashly.svg)](https://badge.fury.io/rb/bashly)
7
10
  [![Build Status](https://travis-ci.com/DannyBen/bashly.svg?branch=master)](https://travis-ci.com/DannyBen/bashly)
@@ -11,6 +14,8 @@ Create beautiful bash scripts from simple YAML configuration.
11
14
 
12
15
  ![demo](demo/cast.svg)
13
16
 
17
+ </div>
18
+
14
19
  ---
15
20
 
16
21
  Installation
@@ -19,6 +24,33 @@ Installation
19
24
  $ gem install bashly
20
25
 
21
26
 
27
+ What is Bashly
28
+ --------------------------------------------------
29
+
30
+ Bashly is a command line application (written in Ruby) that lets you generate
31
+ feature-rich bash command line tools.
32
+
33
+ The design intention is to let you focus on your specific code, without
34
+ worrying about command line argument parsing, usage texts, error messages
35
+ and other functions that are usually handled by a framework in any other
36
+ programming language.
37
+
38
+ Bahsly is responsible for:
39
+
40
+ - Generating **usage texts** and help screens, showing your tool's arguments,
41
+ flags and subcommands (works for subcommands also).
42
+ - Parsing the user's command line and extracting:
43
+ - Optional or required **positional arguments**.
44
+ - Optional or required **option flags** (with or without flag arguments).
45
+ - **Subcommands**.
46
+ - Standard flags (like **--help** and **--version**).
47
+ - Providing you with a place to input your code for each of the functions
48
+ your tool performs, and merging it back to the final script.
49
+ - Providing you with additional (optional) framework-style, standard
50
+ library functions:
51
+ - **Color output**.
52
+ - **Config file management** (INI format).
53
+
22
54
  Usage
23
55
  --------------------------------------------------
24
56
 
@@ -61,72 +93,19 @@ contains a `commands` definition, it will generate a script with subcommands.
61
93
 
62
94
  ### Sample configuraiton for a script without subcommands
63
95
 
64
- You can get this script by running `bashly generate --minimal`.
65
-
66
- ```yaml
67
- name: download
68
- help: Sample minimal application without subcommands
69
- version: 0.1.0
70
-
71
- args:
72
- - name: source
73
- required: true
74
- help: URL to download from
75
- - name: target
76
- help: "Target filename (default: same as source)"
77
-
78
- flags:
79
- - long: --force
80
- short: -f
81
- help: Overwrite existing files
82
- ```
83
-
96
+ - Generate this script by running `bashly generate --minimal`
97
+ - [See the initial sample bashly.yml file](examples/minimal/src/bashly.yml)
98
+ - [See the generated bash script](examples/minimal/download)
84
99
 
85
100
  ### Sample configuraiton for a script with subcommands
86
101
 
87
- You can get this script by running `bashly generate`.
102
+ - Generate this script by running `bashly generate`
103
+ - [See the initial sample bashly.yml file](examples/subcommands/src/bashly.yml)
104
+ - [See the generated bash script](examples/subcommands/cli)
88
105
 
89
- ```yaml
90
- name: cli
91
- help: Sample application
92
- version: 0.1.0
93
106
 
94
- commands:
95
- - name: download
96
- short: d
97
- help: Download a file
98
-
99
- args:
100
- - name: source
101
- required: true
102
- help: URL to download from
103
- - name: target
104
- help: "Target filename (default: same as source)"
105
-
106
- flags:
107
- - long: --force
108
- short: -f
109
- help: Overwrite existing files
110
-
111
- - name: upload
112
- short: u
113
- help: Upload a file
114
- args:
115
- - name: source
116
- required: true
117
- help: File to upload
118
-
119
- flags:
120
- - long: --user
121
- short: -u
122
- arg: user
123
- help: Username to use for logging in
124
- required: true
125
- - long: --password
126
- short: -p
127
- arg: password
128
- help: Password to use for logging in
129
- ```
107
+ See the [examples](examples) folder for more examples.
108
+
130
109
 
131
110
 
132
111
  Configuration Reference
@@ -134,7 +113,7 @@ Configuration Reference
134
113
 
135
114
  ### Command options
136
115
 
137
- With the exception of `version` and `commands` (shich define subcommands),
116
+ With the exception of `version` and `commands` (which define subcommands),
138
117
  everything else in this section is suitable both for the main script, and for
139
118
  any subcommand you define using `commands`.
140
119
 
@@ -150,6 +129,16 @@ help: a sample script generated with bashly
150
129
  # The string to display when using --version
151
130
  version: 0.1.0
152
131
 
132
+ # Specify an array of examples to show when using --help
133
+ examples:
134
+ - myscript download
135
+ - myscript download --force
136
+
137
+ # Specify an array of environment variables needed by your script
138
+ # This is used purely for displaying in the help text (when using --help)
139
+ environment_variable:
140
+ VARIABLE_NAME: Variable help text
141
+
153
142
  # Specify the array of subcommands to generate.
154
143
  # Each subcommand will have its own args and flags.
155
144
  # If this is provided, then you cannot provide flags or args for the main
data/lib/bashly/cli.rb CHANGED
@@ -11,6 +11,7 @@ module Bashly
11
11
  runner.route 'init', to: Commands::Init
12
12
  runner.route 'preview', to: Commands::Preview
13
13
  runner.route 'generate', to: Commands::Generate
14
+ runner.route 'add', to: Commands::Add
14
15
 
15
16
  runner
16
17
  end
@@ -0,0 +1,62 @@
1
+ module Bashly
2
+ module Commands
3
+ class Add < Base
4
+ help "Add extra features and customization to your script"
5
+
6
+ usage "bashly add strings [--force]"
7
+ usage "bashly add lib [--force]"
8
+ usage "bashly add config [--force]"
9
+ usage "bashly add colors [--force]"
10
+ usage "bashly add (-h|--help)"
11
+
12
+ option "-f --force", "Overwrite existing files"
13
+
14
+ command "strings", "Copy an additional configuration file to your project, allowing you to customize all the tips and error strings."
15
+ 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."
16
+ command "config", "Add standard functions for handling INI files to the lib directory."
17
+ command "colors", "Add standard functions for printing colorful and formatted text to the lib directory."
18
+
19
+ environment "BASHLY_SOURCE_DIR", "The path to use for creating the configuration file [default: src]"
20
+
21
+ def strings_command
22
+ safe_copy asset("templates/strings.yml"), "#{Settings.source_dir}/bashly-strings.yml"
23
+ end
24
+
25
+ def lib_command
26
+ safe_copy_lib "sample_function.sh"
27
+ end
28
+
29
+ def config_command
30
+ safe_copy_lib "config.sh"
31
+ end
32
+
33
+ def colors_command
34
+ safe_copy_lib "colors.sh"
35
+ end
36
+
37
+ private
38
+ def safe_copy_lib(libfile)
39
+ safe_copy asset("templates/lib/#{libfile}"), "#{Settings.source_dir}/lib/#{libfile}"
40
+ end
41
+
42
+ def safe_copy(source, target)
43
+ if !Dir.exist? Settings.source_dir
44
+ raise InitError, "Directory !txtgrn!#{Settings.source_dir}!txtrst! does not exist\nRun !txtpur!bashly init!txtrst! first"
45
+ end
46
+
47
+ if File.exist? target and !args['--force']
48
+ say "skipped !txtgrn!#{target}!txtrst! (exists)"
49
+ else
50
+ deep_copy source, target
51
+ say "created !txtgrn!#{target}"
52
+ end
53
+ end
54
+
55
+ def deep_copy(source, target)
56
+ target_dir = File.dirname target
57
+ FileUtils.mkdir_p target_dir unless Dir.exist? target_dir
58
+ FileUtils.cp source, target
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,10 @@
1
+ require 'mister_bin'
2
+ require 'fileutils'
3
+
4
+ module Bashly
5
+ module Commands
6
+ class Base < MisterBin::Command
7
+ include AssetHelper
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,6 @@
1
- require 'mister_bin'
2
- require 'fileutils'
3
-
4
1
  module Bashly
5
2
  module Commands
6
- class Generate < MisterBin::Command
3
+ class Generate < Base
7
4
  help "Generate the bash script and required files"
8
5
 
9
6
  usage "bashly generate [--force]"
@@ -1,8 +1,6 @@
1
- require 'mister_bin'
2
-
3
1
  module Bashly
4
2
  module Commands
5
- class Init < MisterBin::Command
3
+ class Init < Base
6
4
  summary "Initialize a new workspace"
7
5
  help "This command will create the source folder, and place a template configuration file in it."
8
6
 
@@ -31,20 +29,12 @@ module Bashly
31
29
 
32
30
  def yaml_content!
33
31
  if args['--minimal']
34
- File.read minimal_template_file
32
+ File.read asset('templates/minimal.yml')
35
33
  else
36
- File.read template_file
34
+ File.read asset('templates/bashly.yml')
37
35
  end
38
36
  end
39
37
 
40
- def template_file
41
- File.expand_path '../templates/bashly.yml', __dir__
42
- end
43
-
44
- def minimal_template_file
45
- File.expand_path '../templates/minimal.yml', __dir__
46
- end
47
-
48
38
  def target_dir
49
39
  @target_dir ||= Settings.source_dir
50
40
  end
@@ -1,8 +1,6 @@
1
- require 'mister_bin'
2
-
3
1
  module Bashly
4
2
  module Commands
5
- class Preview < MisterBin::Command
3
+ class Preview < Base
6
4
  help "Generate the bash script to STDOUT"
7
5
 
8
6
  usage "bashly preview"
@@ -0,0 +1,7 @@
1
+ module Bashly
2
+ module AssetHelper
3
+ def asset(path)
4
+ File.expand_path "../#{path}", __dir__
5
+ end
6
+ end
7
+ end
@@ -5,6 +5,10 @@ module Bashly
5
5
  ERB.new(template, nil, '%-').result(binding)
6
6
  end
7
7
 
8
+ def strings
9
+ @strings ||= MessageStrings.new
10
+ end
11
+
8
12
  private
9
13
 
10
14
  def view_path(view)
@@ -0,0 +1,36 @@
1
+ module Bashly
2
+ class MessageStrings
3
+ include AssetHelper
4
+
5
+ def [](key)
6
+ values[key.to_s]
7
+ end
8
+
9
+ def values
10
+ @values ||= values!
11
+ end
12
+
13
+ private
14
+
15
+ def values!
16
+ defaults = YAML.load_file asset("templates/strings.yml")
17
+ defaults.merge project_strings
18
+ end
19
+
20
+ def project_strings
21
+ @project_strings ||= project_strings!
22
+ end
23
+
24
+ def project_strings!
25
+ if File.exist? project_strings_path
26
+ YAML.load_file project_strings_path
27
+ else
28
+ {}
29
+ end
30
+ end
31
+
32
+ def project_strings_path
33
+ @project_strings_path ||= "#{Settings.source_dir}/bashly-strings.yml"
34
+ end
35
+ end
36
+ end
@@ -8,6 +8,8 @@ module Bashly
8
8
  OPTION_KEYS = %i[
9
9
  arg
10
10
  description
11
+ environment_variables
12
+ examples
11
13
  flags
12
14
  help
13
15
  long
@@ -87,15 +87,28 @@ module Bashly
87
87
  result.join " "
88
88
  end
89
89
 
90
+ # Returns an array of files to include as is inside the script
91
+ # This is meant to provide the user with the ability to add custom
92
+ # functions
93
+ def user_lib
94
+ @user_lib ||= Dir["#{Settings.source_dir}/lib/**/*.sh"]
95
+ end
96
+
97
+ # Raise an exception if there are some serious issues with the command
98
+ # definition.
90
99
  def verify
91
- if commands.any?
92
- if args.any? or flags.any?
93
- raise ConfigurationError, "Error in the !txtgrn!#{full_name}!txtrst! command.\nThe !txtgrn!commands!txtrst! key cannot be at the same level as the !txtgrn!args!txtrst! or !txtgrn!flags!txtrst! keys."
94
- end
95
-
96
- if parent_name
97
- raise ConfigurationError, "Error in the !txtgrn!#{full_name}!txtrst! command.\nNested commands are not supported."
98
- end
100
+ verify_commands if commands.any?
101
+ end
102
+
103
+ private
104
+
105
+ def verify_commands
106
+ if args.any? or flags.any?
107
+ raise ConfigurationError, "Error in the !txtgrn!#{full_name}!txtrst! command.\nThe !txtgrn!commands!txtrst! key cannot be at the same level as the !txtgrn!args!txtrst! or !txtgrn!flags!txtrst! keys."
108
+ end
109
+
110
+ if parent_name
111
+ raise ConfigurationError, "Error in the !txtgrn!#{full_name}!txtrst! command.\nNested commands are not supported."
99
112
  end
100
113
  end
101
114
 
@@ -2,6 +2,9 @@ name: cli
2
2
  help: Sample application
3
3
  version: 0.1.0
4
4
 
5
+ environment_variables:
6
+ API_KEY: Set your API key
7
+
5
8
  commands:
6
9
  - name: download
7
10
  short: d
@@ -19,6 +22,13 @@ commands:
19
22
  short: -f
20
23
  help: Overwrite existing files
21
24
 
25
+ examples:
26
+ - cli download example.com
27
+ - cli download example.com ./output -f
28
+
29
+ environment_variables:
30
+ DEFAULT_TARGET_LOCATION: Set the default location to download to
31
+
22
32
  - name: upload
23
33
  short: u
24
34
  help: Upload a file
@@ -0,0 +1,32 @@
1
+ # ---
2
+ # Color functions
3
+ # This file is a part of Bashly standard library
4
+ #
5
+ # Usage:
6
+ # Use any of the functions below to color or format a portion of a string.
7
+ #
8
+ # echo "before $(red this is red) after"
9
+ # echo "before $(green_bold this is green_bold) after"
10
+ #
11
+ # ---
12
+
13
+ red() { echo -e "\e[31m$*\e[0m" ; }
14
+ green() { echo -e "\e[32m$*\e[0m" ; }
15
+ yellow() { echo -e "\e[33m$*\e[0m" ; }
16
+ blue() { echo -e "\e[34m$*\e[0m" ; }
17
+ magenta() { echo -e "\e[35m$*\e[0m" ; }
18
+ cyan() { echo -e "\e[36m$*\e[0m" ; }
19
+ bold() { echo -e "\e[1m$*\e[0m" ; }
20
+ underlined() { echo -e "\e[4m$*\e[0m" ; }
21
+ red_bold() { echo -e "\e[1;31m$*\e[0m" ; }
22
+ green_bold() { echo -e "\e[1;32m$*\e[0m" ; }
23
+ yellow_bold() { echo -e "\e[1;33m$*\e[0m" ; }
24
+ blue_bold() { echo -e "\e[1;34m$*\e[0m" ; }
25
+ magenta_bold() { echo -e "\e[1;35m$*\e[0m" ; }
26
+ cyan_bold() { echo -e "\e[1;36m$*\e[0m" ; }
27
+ red_underlined() { echo -e "\e[4;31m$*\e[0m" ; }
28
+ green_underlined() { echo -e "\e[4;32m$*\e[0m" ; }
29
+ yellow_underlined() { echo -e "\e[4;33m$*\e[0m" ; }
30
+ blue_underlined() { echo -e "\e[4;34m$*\e[0m" ; }
31
+ magenta_underlined() { echo -e "\e[4;35m$*\e[0m" ; }
32
+ cyan_underlined() { echo -e "\e[4;36m$*\e[0m" ; }
@@ -0,0 +1,93 @@
1
+ # ---
2
+ # Config functions
3
+ # This file is a part of Bashly standard library
4
+ #
5
+ # Usage:
6
+ # - In your script, set the CONFIG_FILE variable. For rxample:
7
+ # CONFIG_FILE=settings.ini.
8
+ # If it is unset, it will default to 'config.ini'.
9
+ # - Use any of the functions below to access the config file.
10
+ # ---
11
+
12
+ # Create a new config file.
13
+ # There is normally no need to use this fucntion, it is used by othe rfunctions
14
+ # as needed.
15
+ config_init() {
16
+ CONFIG_FILE=${CONFIG_FILE:=config.ini}
17
+ [[ -f "$CONFIG_FILE" ]] || touch "$CONFIG_FILE"
18
+ }
19
+
20
+ # Get a value from the config
21
+ # Usage: result=$(config_get hello)
22
+ config_get() {
23
+ key=$1
24
+ regex="^$key\s*=\s*(.+)$"
25
+
26
+ config_init
27
+
28
+ while IFS= read -r line || [ -n "$line" ]; do
29
+ if [[ $line =~ $regex ]]; then
30
+ value="${BASH_REMATCH[1]}"
31
+ break
32
+ fi
33
+ done < "$CONFIG_FILE"
34
+
35
+ echo "$value"
36
+ }
37
+
38
+ # Add or update a key=value pair in the config.
39
+ # Usage: config_set key value
40
+ config_set() {
41
+ key=$1
42
+ shift
43
+ value="$*"
44
+
45
+ config_init
46
+
47
+ regex="^($key)\s*=\s*.+$"
48
+ output=""
49
+ found_key=""
50
+
51
+ while IFS= read -r line || [ -n "$line" ]; do
52
+ newline=$line
53
+ if [[ $line =~ $regex ]]; then
54
+ found_key="${BASH_REMATCH[1]}"
55
+ newline="$key = $value"
56
+ output="$output$newline\n"
57
+ elif [[ $line ]]; then
58
+ output="$output$line\n"
59
+ fi
60
+ done < "$CONFIG_FILE"
61
+
62
+ if [[ -z $found_key ]]; then
63
+ output="$output$key = $value\n"
64
+ fi
65
+
66
+ echo -e "$output" > "$CONFIG_FILE"
67
+ }
68
+
69
+ # Delete a key from teh config.
70
+ # Usage: config_del key
71
+ config_del() {
72
+ key=$1
73
+
74
+ regex="^($key)\s*="
75
+ output=""
76
+
77
+ config_init
78
+
79
+ while IFS= read -r line || [ -n "$line" ]; do
80
+ newline=$line
81
+ if [[ $line ]] && [[ ! $line =~ $regex ]]; then
82
+ output="$output$line\n"
83
+ fi
84
+ done < "$CONFIG_FILE"
85
+
86
+ echo -e "$output" > "$CONFIG_FILE"
87
+ }
88
+
89
+ # Show the config file
90
+ config_show() {
91
+ config_init
92
+ cat "$CONFIG_FILE"
93
+ }
@@ -0,0 +1,13 @@
1
+ # Add any function here that is needed in more than one parts of your
2
+ # application, or that you otherwise wish to extract from the main function
3
+ # scripts.
4
+ #
5
+ # Note that code here should be wrapped inside bash functions, and it is
6
+ # recommended to have a separate file for each function.
7
+ #
8
+ # Subdirectories will also be scanned for *.sh, so you have no reason not
9
+ # to organize your code nearly.
10
+ #
11
+ sample_function() {
12
+ echo "it works"
13
+ }
@@ -14,3 +14,6 @@ flags:
14
14
  short: -f
15
15
  help: Overwrite existing files
16
16
 
17
+ examples:
18
+ - download example.com
19
+ - download example.com ./output -f
@@ -0,0 +1,19 @@
1
+ # Usage captions
2
+ usage: "Usage:"
3
+ options: "Options:"
4
+ arguments: "Arguments:"
5
+ commands: "Commands:"
6
+ examples: "Examples:"
7
+ environment_variables: "Environment Variables:"
8
+
9
+ # Fixed flags help text
10
+ show_this_help: Show this help
11
+ show_version_number: Show version number
12
+
13
+ # Error messages
14
+ flag_requires_an_argument: "%{long} requires an argument: %{usage}"
15
+ invalid_argument: "invalid argument: %{arg}"
16
+ invalid_flag: "invalid option: %{flag}"
17
+ missing_required_argument: "missing required argument: %{arg}\\nusage: %{usage}"
18
+ missing_required_flag: "missing required flag: %{usage}"
19
+
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -6,6 +6,7 @@
6
6
  <%= render :version_command %>
7
7
  <%= render :usage %>
8
8
  <%= render :inspect_args %>
9
+ <%= render :user_lib if user_lib.any? %>
9
10
  <%= render :command_functions %>
10
11
  <%= render :parse_args %>
11
12
  <%= render :initialize %>
@@ -8,10 +8,10 @@
8
8
  <%- condition = "elif" -%>
9
9
  <%- end -%>
10
10
  else
11
- echo "invalid argument: $key"
11
+ echo -e "<%= strings[:invalid_argument] % { arg: "$key" } %>"
12
12
  exit 1
13
13
  fi
14
14
  <%- else -%>
15
- echo "invalid argument: $key"
15
+ echo -e "<%= strings[:invalid_argument] % { arg: "$key" } %>"
16
16
  exit 1
17
17
  <%- end -%>
@@ -8,7 +8,7 @@ while [[ $# -gt 0 ]]; do
8
8
  <%- end -%>
9
9
 
10
10
  -* )
11
- echo "invalid option: $key"
11
+ echo -e "<%= strings[:invalid_flag] % { flag: "$key" } %>"
12
12
  exit 1
13
13
  ;;
14
14
 
@@ -4,8 +4,7 @@ if [[ $1 && $1 != -* ]]; then
4
4
  args[<%= arg.name %>]=$1
5
5
  shift
6
6
  else
7
- echo "missing required argument: <%= arg.name.upcase %>"
8
- echo "Usage: <%= usage_string %>"
7
+ echo -e "<%= strings[:missing_required_argument] % { arg: arg.name.upcase, usage: usage_string } %>"
9
8
  exit 1
10
9
  fi
11
10
 
@@ -4,7 +4,7 @@ argstring="$*"
4
4
  <%- end -%>
5
5
  <%- required_flags.each do |flag| -%>
6
6
  if [[ <%= flag.aliases.map { |a| %Q["$argstring" != *#{a}*] }.join " && " %> ]]; then
7
- echo "missing required flag: <%= flag.usage_string %>"
7
+ echo -e "<%= strings[:missing_required_flag] % { usage: flag.usage_string } %>"
8
8
  exit 1
9
9
  fi
10
10
  <%- end %>
@@ -1,17 +1,19 @@
1
1
  # :command.usage
2
2
  <%= full_name.to_underscore %>_usage() {
3
- echo "<%= caption_string %>"
3
+ echo -e "<%= caption_string %>"
4
4
  echo
5
- echo "Usage:"
6
- echo " <%= usage_string %>"
5
+ echo -e "<%= strings[:usage] %>"
6
+ echo -e " <%= usage_string %>"
7
7
  echo
8
8
  <%= render(:usage_commands).indent 2 if commands.any? %>
9
9
 
10
10
  if [[ -n $long_usage ]]; then
11
- echo "Options:"
11
+ echo -e "<%= strings[:options] %>"
12
12
  <%= render(:usage_fixed_flags).indent 4 %>
13
13
  <%= render(:usage_flags).indent 4 if flags.any? %>
14
14
  <%= render(:usage_args).indent 4 if args.any? %>
15
+ <%= render(:usage_environment_variables).indent 4 if environment_variables %>
16
+ <%= render(:usage_examples).indent 4 if examples %>
15
17
 
16
18
  fi
17
19
  }
@@ -1,5 +1,5 @@
1
1
  # :command.usage_args
2
- echo "Arguments:"
2
+ echo -e "<%= strings[:arguments] %>"
3
3
 
4
4
  <%- args.each do |arg| -%>
5
5
  <%= arg.render(:usage) %>
@@ -1,7 +1,7 @@
1
1
  # :command.usage_commands
2
- echo "Commands:"
2
+ echo -e "<%= strings[:commands] %>"
3
3
  <%- maxlen = command_names.map(&:size).max -%>
4
4
  <%- commands.each do |command| -%>
5
- echo " <%= command.name.ljust maxlen %> <%= command.summary %>"
5
+ echo " <%= command.name.ljust maxlen %> <%= command.summary %>"
6
6
  <%- end -%>
7
7
  echo
@@ -0,0 +1,7 @@
1
+ # :command.usage_environment_variables
2
+ echo -e "<%= strings[:environment_variables] %>"
3
+ <%- environment_variables.each do |name, description| -%>
4
+ echo " <%= name %>"
5
+ echo " <%= description %>"
6
+ <%- end -%>
7
+ echo
@@ -0,0 +1,6 @@
1
+ # :command.usage_examples
2
+ echo -e "<%= strings[:examples] %>"
3
+ <%- examples.each do |example| -%>
4
+ echo " <%= example %>"
5
+ <%- end -%>
6
+ echo
@@ -1,7 +1,7 @@
1
1
  # :command.usage_fixed_flags
2
2
  echo " --help, -h"
3
- echo " Show this help"
3
+ echo -e " <%= strings[:show_this_help] %>"
4
4
  echo
5
5
  echo " --version"
6
- echo " Show version number"
6
+ echo -e " <%= strings[:show_version_number] %>"
7
7
  echo
@@ -0,0 +1,6 @@
1
+ # :command.user_lib
2
+ <%- user_lib.each do |file| -%>
3
+ # <%= ":#{file}" %>
4
+ <%= File.read file %>
5
+
6
+ <%- end -%>
@@ -6,7 +6,7 @@
6
6
  shift
7
7
  shift
8
8
  else
9
- echo "<%= long %> requires an argument: <%= usage_string %>"
9
+ echo -e "<%= strings[:flag_requires_an_argument] % { long: long, usage: usage_string } %>"
10
10
  exit 1
11
11
  fi
12
12
  <%- else -%>
data/lib/bashly.rb CHANGED
@@ -6,8 +6,10 @@ if ENV['BYEBUG']
6
6
  end
7
7
 
8
8
  requires 'bashly/polyfills'
9
+ requires 'bashly/concerns'
10
+
9
11
  requires 'bashly/settings'
10
12
  requires 'bashly/exceptions'
11
- requires 'bashly/concerns'
12
13
  requires 'bashly/models/base'
14
+ requires 'bashly/commands/base'
13
15
  requires 'bashly'
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.1.1
4
+ version: 0.2.0
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: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2019-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -63,14 +63,18 @@ files:
63
63
  - bin/bashly
64
64
  - lib/bashly.rb
65
65
  - lib/bashly/cli.rb
66
+ - lib/bashly/commands/add.rb
67
+ - lib/bashly/commands/base.rb
66
68
  - lib/bashly/commands/generate.rb
67
69
  - lib/bashly/commands/init.rb
68
70
  - lib/bashly/commands/preview.rb
71
+ - lib/bashly/concerns/asset_helper.rb
69
72
  - lib/bashly/concerns/renderable.rb
70
73
  - lib/bashly/config.rb
71
74
  - lib/bashly/exceptions.rb
72
75
  - lib/bashly/extensions/array.rb
73
76
  - lib/bashly/extensions/string.rb
77
+ - lib/bashly/message_strings.rb
74
78
  - lib/bashly/models/argument.rb
75
79
  - lib/bashly/models/base.rb
76
80
  - lib/bashly/models/command.rb
@@ -78,7 +82,11 @@ files:
78
82
  - lib/bashly/polyfills/hash.rb
79
83
  - lib/bashly/settings.rb
80
84
  - lib/bashly/templates/bashly.yml
85
+ - lib/bashly/templates/lib/colors.sh
86
+ - lib/bashly/templates/lib/config.sh
87
+ - lib/bashly/templates/lib/sample_function.sh
81
88
  - lib/bashly/templates/minimal.yml
89
+ - lib/bashly/templates/strings.yml
82
90
  - lib/bashly/version.rb
83
91
  - lib/bashly/views/argument/usage.erb
84
92
  - lib/bashly/views/command/command_filter.erb
@@ -101,8 +109,11 @@ files:
101
109
  - lib/bashly/views/command/usage.erb
102
110
  - lib/bashly/views/command/usage_args.erb
103
111
  - lib/bashly/views/command/usage_commands.erb
112
+ - lib/bashly/views/command/usage_environment_variables.erb
113
+ - lib/bashly/views/command/usage_examples.erb
104
114
  - lib/bashly/views/command/usage_fixed_flags.erb
105
115
  - lib/bashly/views/command/usage_flags.erb
116
+ - lib/bashly/views/command/user_lib.erb
106
117
  - lib/bashly/views/command/version_command.erb
107
118
  - lib/bashly/views/flag/case.erb
108
119
  - lib/bashly/views/flag/usage.erb