bashly 0.3.7 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36db0864b7a077abc473fbad4aa91d14b7428e914be51b537f583f1dc2f97490
4
- data.tar.gz: 1e6c19c9cb0b05e09287b3c4e0986fa1c6d1d001f5d03e4c9fd70a72dfe768dc
3
+ metadata.gz: 7e2d8e44019822a048ede2fadd9da870df078afad2931470748912b25acfb93f
4
+ data.tar.gz: 84738b8835be3af778b0df351154c2a73c966ee906317f61534c8100a17da9f8
5
5
  SHA512:
6
- metadata.gz: 7d63a0ebf4158eaeb220a13b6f2ac4ea4c092f930281450cb7cf8d9e85fe495c46e5fa504fb77df19fba3a8e47c71027c6a713f349d108b24f6c930090bdbf8a
7
- data.tar.gz: fca3133104b49a68468aacf5a01ef28ca8374df6e1b177bf380fbb6dd6bcc618bf69c1f7022745b34789965abc0534fab2960a7cb57906ce6ba636ae2705cc50
6
+ metadata.gz: 653e9a5a685d321837472cb2522f93aeabc0ed0de479f97ca35dcbb1d08e2bd997d50e17653c464ce201388f6b21ac59fa4b9d28a01beed5d5119beb8b278e1b
7
+ data.tar.gz: 79c111478814fb30246a214511946331c7a581196187c41ef6bc249be3858123786bba3596484b27d493288714fb9d257fc18e7b4432b0f77effe8ed7baa740b
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,25 +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:
28
46
 
29
- Prerequisites
30
- --------------------------------------------------
47
+ ```shell
48
+ $ alias bashly='docker run --rm -it --volume "$PWD:/app" dannyben/bashly'
49
+ ```
50
+
51
+ ## Prerequisites
31
52
 
32
53
  The bash scripts generated by bashly require bash 4 or higher due to heavy
33
54
  use of associative arrays.
34
55
 
35
56
 
36
- What is Bashly
37
- --------------------------------------------------
57
+ ## What is Bashly
38
58
 
39
59
  Bashly is a command line application (written in Ruby) that lets you generate
40
60
  feature-rich bash command line tools.
@@ -61,9 +81,9 @@ Bahsly is responsible for:
61
81
  - **Color output**.
62
82
  - **Config file management** (INI format).
63
83
  - **YAML parsing**.
84
+ - and more.
64
85
 
65
- Usage
66
- --------------------------------------------------
86
+ ## Usage
67
87
 
68
88
  In an empty directory, create a sample configuration file by running
69
89
 
@@ -93,9 +113,46 @@ Finally, edit the files in the `src` folder. Each of your script's commands
93
113
  get their own file. Once you edit, run `bashly generate` again to merge the
94
114
  content from your functions back into the script.
95
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`.
130
+
131
+ You can now access these variables by modifying `sec/root_command.sh` like
132
+ this:
133
+
96
134
 
97
- Examples
98
- --------------------------------------------------
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
99
156
 
100
157
  The `bashly.yml` file can be set up to generate two types of scripts:
101
158
 
@@ -123,8 +180,7 @@ See the [examples](examples) folder for more examples.
123
180
 
124
181
 
125
182
 
126
- Configuration Reference
127
- --------------------------------------------------
183
+ ## Configuration Reference
128
184
 
129
185
  The `bashly.yml` configuration file consists of these types:
130
186
 
@@ -204,17 +260,21 @@ set.
204
260
  `required` | Specify if this variable is required.
205
261
 
206
262
 
207
- Real World Examples
208
- --------------------------------------------------
263
+ ## Real World Examples
209
264
 
210
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
211
268
 
212
269
 
213
- Contributing / Support
214
- --------------------------------------------------
270
+ ## Contributing / Support
215
271
 
216
272
  If you experience any issue, have a question or a suggestion, or if you wish
217
273
  to contribute, feel free to [open an issue][issues].
218
274
 
219
275
  [issues]: https://github.com/DannyBen/bashly/issues
220
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
+
@@ -3,14 +3,18 @@ module Bashly
3
3
  class Generate < Base
4
4
  help "Generate the bash script and required files"
5
5
 
6
- usage "bashly generate [--force]"
6
+ usage "bashly generate [--force --wrap FUNCTION]"
7
7
  usage "bashly generate (-h|--help)"
8
8
 
9
9
  option "-f --force", "Overwrite existing files"
10
+ option "-w --wrap FUNCTION", "Wrap the entire script in a function so it can also be sourced"
10
11
 
11
12
  environment "BASHLY_SOURCE_DIR", "The path containing the bashly configuration and source files [default: src]"
12
13
  environment "BASHLY_TARGET_DIR", "The path to use for creating the bash script [default: .]"
13
14
 
15
+ example "bashly generate --force"
16
+ example "bashly generate --wrap my_function"
17
+
14
18
  def run
15
19
  create_user_files
16
20
  create_master_script
@@ -54,12 +58,15 @@ module Bashly
54
58
  end
55
59
 
56
60
  def create_master_script
57
- master_script = command.render('master_script').lint
58
- File.write master_script_path, master_script
61
+ File.write master_script_path, script.code
59
62
  FileUtils.chmod "+x", master_script_path
60
63
  say "created !txtgrn!#{master_script_path}"
61
64
  end
62
65
 
66
+ def script
67
+ @script ||= Models::Script.new(command, args['--wrap'])
68
+ end
69
+
63
70
  def master_script_path
64
71
  "#{Settings.target_dir}/#{command.name}"
65
72
  end
@@ -11,7 +11,8 @@ module Bashly
11
11
  def run
12
12
  config = Config.new "#{Settings.source_dir}/bashly.yml"
13
13
  command = Models::Command.new(config)
14
- puts command.render 'master_script'
14
+ script = Models::Script.new command
15
+ puts script.code
15
16
  end
16
17
  end
17
18
  end
@@ -158,7 +158,7 @@ module Bashly
158
158
  args.each do |arg|
159
159
  result << arg.usage_string
160
160
  end
161
- result << "[options]"
161
+ result << "[options]" unless flags.empty?
162
162
  result.join " "
163
163
  end
164
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
@@ -0,0 +1,33 @@
1
+ module Bashly
2
+ module Models
3
+ class Script
4
+ include Renderable
5
+
6
+ attr_reader :command, :function_name
7
+
8
+ def initialize(command, function_name = nil)
9
+ @command, @function_name = command, function_name
10
+ end
11
+
12
+ def code
13
+ if function_name
14
+ result = [header, render('wrapper')].join "\n"
15
+ else
16
+ result = [header, body].join "\n"
17
+ end
18
+
19
+ result.lint
20
+ end
21
+
22
+ private
23
+
24
+ def header
25
+ @header ||= render('header')
26
+ end
27
+
28
+ def body
29
+ @body ||= command.render('master_script')
30
+ end
31
+ end
32
+ end
33
+ end
@@ -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
+ }
@@ -21,7 +21,7 @@ help_flag_text: Show this help
21
21
  version_flag_text: Show version number
22
22
 
23
23
  # Error messages
24
- flag_requires_an_argument: "%{long} requires an argument: %{usage}"
24
+ flag_requires_an_argument: "%{name} requires an argument: %{usage}"
25
25
  invalid_argument: "invalid argument: %s"
26
26
  invalid_flag: "invalid option: %s"
27
27
  missing_required_argument: "missing required argument: %{arg}\\nusage: %{usage}"
@@ -1,3 +1,3 @@
1
1
  module Bashly
2
- VERSION = "0.3.7"
2
+ VERSION = "0.4.1"
3
3
  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
  }
@@ -1,7 +1,3 @@
1
- #!/usr/bin/env bash
2
- # This script was generated by bashly (https://github.com/DannyBen/bashly)
3
- # Modifying it manually is not recommended
4
-
5
1
  <%= render :root_command if commands.empty? %>
6
2
  <%= render :version_command %>
7
3
  <%= render :usage %>
@@ -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
  ;;
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # This script was generated by bashly (https://github.com/DannyBen/bashly)
3
+ # Modifying it manually is not recommended
@@ -0,0 +1,6 @@
1
+ # :script.wrapper
2
+ <%= function_name %>() {
3
+ <%= body.indent 2 %>
4
+ }
5
+
6
+ (return 0 2>/dev/null) || <%= function_name %> "$@"
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.7
4
+ version: 0.4.1
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-17 00:00:00.000000000 Z
11
+ date: 2021-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -80,6 +80,7 @@ files:
80
80
  - lib/bashly/models/command.rb
81
81
  - lib/bashly/models/environment_variable.rb
82
82
  - lib/bashly/models/flag.rb
83
+ - lib/bashly/models/script.rb
83
84
  - lib/bashly/polyfills/hash.rb
84
85
  - lib/bashly/settings.rb
85
86
  - lib/bashly/templates/bashly.yml
@@ -123,6 +124,8 @@ files:
123
124
  - lib/bashly/views/environment_variable/usage.erb
124
125
  - lib/bashly/views/flag/case.erb
125
126
  - lib/bashly/views/flag/usage.erb
127
+ - lib/bashly/views/script/header.erb
128
+ - lib/bashly/views/script/wrapper.erb
126
129
  homepage: https://github.com/dannyben/bashly
127
130
  licenses:
128
131
  - MIT
@@ -142,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
145
  - !ruby/object:Gem::Version
143
146
  version: '0'
144
147
  requirements: []
145
- rubygems_version: 3.0.3
148
+ rubygems_version: 3.2.3
146
149
  signing_key:
147
150
  specification_version: 4
148
151
  summary: Bash Command Line Tool Generator