bashly 0.3.6 → 0.4.1rc1

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: ffda5465535e873bf8f7beea1491d33ffd9e417adcd7cd2a79d8798e24fad6e2
4
- data.tar.gz: 4b4f2a5fe32494fd4527b88be16d5f3b414ce46f07eb421397f5f3715da2351e
3
+ metadata.gz: e31810f90eb5199f74dd9fd0dc0aedfb4bfd5dd4f38bc4e36473ab6c3e4f10d2
4
+ data.tar.gz: 5de458e2eea4ec796e44a67cddeabaf848ef069ec2d37ad7ddb1f3cc660bad27
5
5
  SHA512:
6
- metadata.gz: 1fba52e408663920eb145112f9c80bc0a6ce4731f017688ca299c8fad975c4bd4ef2fc8e330cf6e5452f797502a44a43342a95ccf9e95b50935c378a56ade85a
7
- data.tar.gz: 4670e9c1b054c36cbb91d1c2264d37f4011ab8e242b0b47b5e07c85558d463fa806a299fa88f5c6b0aa2b61fc44b4fae7641727549f910aa3c9047b087ebaec1
6
+ metadata.gz: 72a03554e17b648efda96ac0208bd4ee8223680717933a71907994ca3a3db3ffd629ea3572fc27143babb6634a65ad2f0b83fdeaeea2ab01d0c4755ea630f674
7
+ data.tar.gz: eb955f344c428e92b82150b95256f3c9d90e3461353bb6b13cad68eeb17bf5e6220991590aa1d797b447ee5c92f414ef9b5042b13569a284595dac0cadd7babd
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  <div align='center'>
2
2
  <img src='logo.svg' width=280>
3
3
 
4
- Bashly - Bash CLI Framework and Generator
5
- ==================================================
4
+ # Bashly - Bash CLI Framework and Generator
6
5
 
7
6
  Create beautiful bash scripts from simple YAML configuration
8
7
 
@@ -16,18 +15,46 @@ Create beautiful bash scripts from simple YAML configuration
16
15
 
17
16
  </div>
18
17
 
18
+ ## Table of Contents
19
+
20
+ - [Table of Contents](#table-of-contents)
21
+ - [Installation](#installation)
22
+ - [Prerequisites](#prerequisites)
23
+ - [What is Bashly](#what-is-bashly)
24
+ - [Usage](#usage)
25
+ - [Using the input arguemnts in your code](#using-the-input-arguemnts-in-your-code)
26
+ - [Examples](#examples)
27
+ - [Sample configuraiton for a script without commands](#sample-configuraiton-for-a-script-without-commands)
28
+ - [Sample configuraiton for a script with commands](#sample-configuraiton-for-a-script-with-commands)
29
+ - [Configuration Reference](#configuration-reference)
30
+ - [Command options](#command-options)
31
+ - [Argument options](#argument-options)
32
+ - [Flag options](#flag-options)
33
+ - [Environment Variable options](#environment-variable-options)
34
+ - [Real World Examples](#real-world-examples)
35
+ - [Contributing / Support](#contributing--support)
36
+
19
37
  ---
20
38
 
21
- Installation
22
- --------------------------------------------------
39
+ ## Installation
23
40
 
24
41
  ```shell
25
42
  $ gem install bashly
26
43
  ```
27
44
 
45
+ or with Docker:
46
+
47
+ ```shell
48
+ $ alias bashly='docker run --rm -it --volume "$PWD:/app" dannyben/bashly'
49
+ ```
50
+
51
+ ## Prerequisites
52
+
53
+ The bash scripts generated by bashly require bash 4 or higher due to heavy
54
+ use of associative arrays.
28
55
 
29
- What is Bashly
30
- --------------------------------------------------
56
+
57
+ ## What is Bashly
31
58
 
32
59
  Bashly is a command line application (written in Ruby) that lets you generate
33
60
  feature-rich bash command line tools.
@@ -54,9 +81,9 @@ Bahsly is responsible for:
54
81
  - **Color output**.
55
82
  - **Config file management** (INI format).
56
83
  - **YAML parsing**.
84
+ - and more.
57
85
 
58
- Usage
59
- --------------------------------------------------
86
+ ## Usage
60
87
 
61
88
  In an empty directory, create a sample configuration file by running
62
89
 
@@ -86,9 +113,46 @@ Finally, edit the files in the `src` folder. Each of your script's commands
86
113
  get their own file. Once you edit, run `bashly generate` again to merge the
87
114
  content from your functions back into the script.
88
115
 
116
+ ### Using the input arguemnts in your code
117
+
118
+ In order to access the parsed arguments in any of your partial scripts, you
119
+ may simply access the `$args` associative array.
120
+
121
+ For example:
122
+
123
+ 1. Generate a minimal configuration with `bashly init --minimal`
124
+ 2. Generate the bash script with `bashly generate`
125
+ 3. Run the script with `./download hello --force`
126
+
127
+ You will notice that all the arguments of the associative array are printed
128
+ on screen. This is done by the `inspect_args` function that was inserted into
129
+ the generated partial script `src/root_command.sh`.
89
130
 
90
- Examples
91
- --------------------------------------------------
131
+ You can now access these variables by modifying `sec/root_command.sh` like
132
+ this:
133
+
134
+
135
+ ```bash
136
+ # src/root_command.sh
137
+ source_url=${args[source]}
138
+ force=${args[--force]}
139
+
140
+ if [[ $force ]]; then
141
+ echo "downloading $source_url with --force"
142
+ else
143
+ echo "downloading $source_url"
144
+ fi
145
+ ```
146
+
147
+ After editing the file, run `bashly generate` (or `bashly g` for short) and
148
+ run:
149
+
150
+ ```
151
+ $ ./download a --force
152
+ downloading a with --force
153
+ ```
154
+
155
+ ## Examples
92
156
 
93
157
  The `bashly.yml` file can be set up to generate two types of scripts:
94
158
 
@@ -116,8 +180,7 @@ See the [examples](examples) folder for more examples.
116
180
 
117
181
 
118
182
 
119
- Configuration Reference
120
- --------------------------------------------------
183
+ ## Configuration Reference
121
184
 
122
185
  The `bashly.yml` configuration file consists of these types:
123
186
 
@@ -159,6 +222,7 @@ bash function.
159
222
  `name` | The name of the argument.
160
223
  `help` | The message to display when using `--help`. Can have multiple lines.
161
224
  `required` | Specify if this argument is required. Note that once you define an optional argument (without required: true) then you cannot define required arguments after it.
225
+ `default` | The value to use in case it is not provided by the user. Implies that this argument is optional.
162
226
 
163
227
  ### Flag options
164
228
 
@@ -173,6 +237,7 @@ short form).
173
237
  `help` | The text to display when using `--help`. Can have multiple lines.
174
238
  `arg` | If the flag requires an argument, specify its name here.
175
239
  `required` | Specify if this flag is required.
240
+ `default` | The value to use in case it is not provided by the user. Implies that this flag is optional, and only makes sense when the flag has an argument.
176
241
 
177
242
  #### Special handling for -v and -h
178
243
 
@@ -195,17 +260,21 @@ set.
195
260
  `required` | Specify if this variable is required.
196
261
 
197
262
 
198
- Real World Examples
199
- --------------------------------------------------
263
+ ## Real World Examples
200
264
 
201
265
  - [Rush][rush] - a Personal Package Manager
266
+ - [Alf][alf] - a generator for bash aliases and sub-aliases
267
+ - [git-changelog][git-changelog] - a change log generator
202
268
 
203
269
 
204
- Contributing / Support
205
- --------------------------------------------------
270
+ ## Contributing / Support
206
271
 
207
272
  If you experience any issue, have a question or a suggestion, or if you wish
208
273
  to contribute, feel free to [open an issue][issues].
209
274
 
210
275
  [issues]: https://github.com/DannyBen/bashly/issues
211
276
  [rush]: https://github.com/DannyBen/rush-cli
277
+ [alf]: https://github.com/DannyBen/alf
278
+ [git-changelog]: https://github.com/DannyBen/git-changelog
279
+
280
+
@@ -55,12 +55,22 @@ module Bashly
55
55
  result
56
56
  end
57
57
 
58
+ # Returns an array of all the default Args
59
+ def default_args
60
+ args.select &:default
61
+ end
62
+
58
63
  # If any of this command's subcommands has the default option set to
59
64
  # true, this default command will be returned, nil otherwise.
60
65
  def default_command
61
66
  commands.find { |c| c.default }
62
67
  end
63
68
 
69
+ # Returns an array of all the default Flags
70
+ def default_flags
71
+ flags.select &:default
72
+ end
73
+
64
74
  # Returns an array of EnvironmentVariables
65
75
  def environment_variables
66
76
  return [] unless options["environment_variables"]
@@ -148,7 +158,7 @@ module Bashly
148
158
  args.each do |arg|
149
159
  result << arg.usage_string
150
160
  end
151
- result << "[options]"
161
+ result << "[options]" unless flags.empty?
152
162
  result.join " "
153
163
  end
154
164
 
@@ -11,6 +11,10 @@ module Bashly
11
11
  end
12
12
  end
13
13
 
14
+ def name
15
+ long || short
16
+ end
17
+
14
18
  def usage_string(extended: false)
15
19
  result = [aliases.join(", ")]
16
20
  result << arg.upcase if arg
@@ -21,7 +21,7 @@ config_init() {
21
21
  # Usage: result=$(config_get hello)
22
22
  config_get() {
23
23
  key=$1
24
- regex="^$key\s*=\s*(.+)$"
24
+ regex="^$key *= *(.+)$"
25
25
 
26
26
  config_init
27
27
 
@@ -44,7 +44,7 @@ config_set() {
44
44
 
45
45
  config_init
46
46
 
47
- regex="^($key)\s*=\s*.+$"
47
+ regex="^($key) *= *.+$"
48
48
  output=""
49
49
  found_key=""
50
50
 
@@ -71,7 +71,7 @@ config_set() {
71
71
  config_del() {
72
72
  key=$1
73
73
 
74
- regex="^($key)\s*="
74
+ regex="^($key) *="
75
75
  output=""
76
76
 
77
77
  config_init
@@ -100,7 +100,7 @@ config_show() {
100
100
  # done
101
101
  #
102
102
  config_keys() {
103
- regex="^(.*)\s*="
103
+ regex="^([a-zA-Z0-9_\-\/\.]+) *="
104
104
 
105
105
  config_init
106
106
 
@@ -113,3 +113,14 @@ config_keys() {
113
113
  done < "$CONFIG_FILE"
114
114
  echo "${keys[@]}"
115
115
  }
116
+
117
+ # Returns true if the specified key exists in the config file
118
+ # Usage:
119
+ #
120
+ # if config_has_key "key" ; then
121
+ # echo "key exists"
122
+ # fi
123
+ #
124
+ config_has_key() {
125
+ [[ $(config_get "$1") ]]
126
+ }
@@ -6,7 +6,7 @@
6
6
  # recommended to have a separate file for each function.
7
7
  #
8
8
  # Subdirectories will also be scanned for *.sh, so you have no reason not
9
- # to organize your code nearly.
9
+ # to organize your code neatly.
10
10
  #
11
11
  sample_function() {
12
12
  echo "it works"
@@ -14,13 +14,14 @@ group: "%{group} Commands:"
14
14
  command_shortcut: "Shortcut: %{short}"
15
15
  default_command_summary: "%{summary} (default)"
16
16
  required: "(required)"
17
+ default: "Default: %{value}"
17
18
 
18
19
  # Fixed flags help text
19
20
  help_flag_text: Show this help
20
21
  version_flag_text: Show version number
21
22
 
22
23
  # Error messages
23
- flag_requires_an_argument: "%{long} requires an argument: %{usage}"
24
+ flag_requires_an_argument: "%{name} requires an argument: %{usage}"
24
25
  invalid_argument: "invalid argument: %s"
25
26
  invalid_flag: "invalid option: %s"
26
27
  missing_required_argument: "missing required argument: %{arg}\\nusage: %{usage}"
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.3.6"
2
+ VERSION = "0.4.1rc1"
3
3
  end
@@ -1,4 +1,7 @@
1
1
  # :argument.usage
2
2
  echo " <%= name.upcase %>"
3
3
  printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
4
+ <%- if default -%>
5
+ printf " <%= strings[:default] % { value: default } -%>\n"
6
+ <%- end -%>
4
7
  echo
@@ -0,0 +1,7 @@
1
+ # :command.default_assignments
2
+ <%- default_args.each do |arg| -%>
3
+ [[ -n ${args[<%= arg.name %>]} ]] || args[<%= arg.name %>]="<%= arg.default %>"
4
+ <%- end -%>
5
+ <%- default_flags.each do |flag| -%>
6
+ [[ -n ${args[<%= flag.long %>]} ]] || args[<%= flag.long %>]="<%= flag.default %>"
7
+ <%- end -%>
@@ -1,5 +1,10 @@
1
1
  # :command.inspect_args
2
2
  inspect_args() {
3
- echo args:
4
- for k in "${!args[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done
3
+ readarray -t sorted_keys < <(printf '%s\n' "${!args[@]}" | sort)
4
+ if (( ${#args[@]} )); then
5
+ echo args:
6
+ for k in "${sorted_keys[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done
7
+ else
8
+ echo args: none
9
+ fi
5
10
  }
@@ -11,6 +11,7 @@ parse_requirements() {
11
11
  <%= render(:required_args_filter).indent 2 %>
12
12
  <%= render(:required_flags_filter).indent 2 %>
13
13
  <%= render(:parse_requirements_while).indent 2 %>
14
+ <%= render(:default_assignments).indent 2 %>
14
15
  }
15
16
 
16
17
  <%- commands.each do |command| %>
@@ -1,16 +1,16 @@
1
1
  # :flag.case
2
2
  <%= aliases.join " | " %> )
3
3
  <%- if arg -%>
4
- if [[ $2 && $2 != -* ]]; then
5
- args[<%= long %>]="$2"
4
+ if [[ $2 ]]; then
5
+ args[<%= name %>]="$2"
6
6
  shift
7
7
  shift
8
8
  else
9
- printf "%s\n" "<%= strings[:flag_requires_an_argument] % { long: long, usage: usage_string } %>"
9
+ printf "%s\n" "<%= strings[:flag_requires_an_argument] % { name: name, usage: usage_string } %>"
10
10
  exit 1
11
11
  fi
12
12
  <%- else -%>
13
- args[<%= long %>]=1
13
+ args[<%= name %>]=1
14
14
  shift
15
15
  <%- end -%>
16
16
  ;;
@@ -1,4 +1,7 @@
1
1
  # :flag.usage
2
2
  echo " <%= usage_string extended: true %>"
3
3
  printf "<%= help.wrap(76).indent(4).sanitize_for_print %>\n"
4
+ <%- if default -%>
5
+ printf " <%= strings[:default] % { value: default } -%>\n"
6
+ <%- end -%>
4
7
  echo
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.3.6
4
+ version: 0.4.1rc1
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: 2020-02-06 00:00:00.000000000 Z
11
+ date: 2021-02-18 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/views/argument/usage.erb
94
94
  - lib/bashly/views/command/command_filter.erb
95
95
  - lib/bashly/views/command/command_functions.erb
96
+ - lib/bashly/views/command/default_assignments.erb
96
97
  - lib/bashly/views/command/default_initialize_script.erb
97
98
  - lib/bashly/views/command/default_root_script.erb
98
99
  - lib/bashly/views/command/default_script.erb
@@ -137,11 +138,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
138
  version: 2.3.0
138
139
  required_rubygems_version: !ruby/object:Gem::Requirement
139
140
  requirements:
140
- - - ">="
141
+ - - ">"
141
142
  - !ruby/object:Gem::Version
142
- version: '0'
143
+ version: 1.3.1
143
144
  requirements: []
144
- rubygems_version: 3.0.3
145
+ rubygems_version: 3.2.3
145
146
  signing_key:
146
147
  specification_version: 4
147
148
  summary: Bash Command Line Tool Generator