nub 0.0.56 → 0.0.57

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +121 -61
  3. data/lib/nub/commander.rb +2 -2
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6840a65c5b757eb9cf92cdbfd1548577f2a0abf4b91470477cb133a048259372
4
- data.tar.gz: 3c5dd5de7ce42a2a2ba91b4ac2d5aa6cf773cda0320723bdd13f79ddbd918de8
3
+ metadata.gz: 8ce123bdfd67999eff41bd51cf0fb9f495e7ca3905a0943407291a2be9cff5d7
4
+ data.tar.gz: 14c438fe160de88062825296ef1c2a212b926c78e1608c8e99b965d640d850a2
5
5
  SHA512:
6
- metadata.gz: 20051bea8cd2af4aa22c09683673e3a99c6deb0b3e166c6e18175c7e87d96035ce3497b38337de3956274879ad52a47cb172bd80eee7f3be7b2030278c4ddb84
7
- data.tar.gz: eddef00f72ad07ab8b384317113633d5256d489221f8411128e0db86dbee7da51c514264b93c8c3d749f0ae391d9d2f4d93396fd5806988c254118f44bc14f12
6
+ metadata.gz: c833de5c3599e0695376d0bed75366ae12f44349a0854cbc7d354ec0467ad15b16630859ab25be563fa74cb00a91021f3299b3aa688046185c1782013ab50ef9
7
+ data.tar.gz: 69fb2df991e50a62c18033d12c30af8ded19305f7e41a5d00411c536eac98215965326fe79d21fa65514ba346876c077026681830e6685497c61f4e456d5b313
data/README.md CHANGED
@@ -19,6 +19,9 @@ Collection of ruby utils I've used in several of my projects and wanted re-usabl
19
19
  * [Allowed Values](#allowed-values)
20
20
  * [Global Options](#global-options)
21
21
  * [Configuration](#configuration)
22
+ * [Named Option Examples](#named-option-examples)
23
+ * [Positional Option Examples](#positional-option-examples)
24
+ * [Chained Command Expression Examples](#chained-command-expression-examples)
22
25
  * [Help](#help)
23
26
  * [Examples](#examples)
24
27
  * [Indicators](#indicators)
@@ -38,7 +41,7 @@ Run: `bundle install --system`
38
41
  ## Commander <a name="commander"></a>
39
42
  Commander was created mainly because all available options parsers seemed overly complicated and
40
43
  overweight and partly because I enjoyed understanding every bit going into it. Commander offers
41
- ***git*** like command syntax that is becoming so popular.
44
+ ***git*** or ***kubectl*** like command syntax.
42
45
 
43
46
  There are two kinds of paramaters that commander deals with ***commands*** and ***options***.
44
47
 
@@ -53,19 +56,20 @@ sub-command, which follow the same rules in a recursive fashion as any command,
53
56
  Command options modify how the command behaves.
54
57
 
55
58
  #### Chained Commands <a name="chained-commands"></a>
56
- The chained command expressions allow a cleaner multi-command type expression with reusable options.
59
+ Chained command expressions allow a cleaner multi-command type expression with reusable options.
57
60
 
58
61
  Whenever more than one command is used in the command line expression the expression is interpreted
59
62
  as being a ***chained command expression*** a.k.a ***chained commands***. Chained commands are
60
63
  executed left to right, such that you can execute the first command then the second command or more
61
64
  in a single command line expression. Each command in a chained command expression may have its own
62
- specific options (those coming after the command but before the next command) or if options are
63
- omitted the options from the next command will be used in the order they are given to satisfy the
64
- options of the command before. Only options of the same type and position will be used.
65
+ specific options (those coming after the command but before the next command) which are taken into
66
+ account for the command as usual. However if options are omitted the options from the next command
67
+ will be used in the order they are given to satisfy the options of the command before. Only options
68
+ of the same type and position will be used.
65
69
 
66
70
  ### Options <a name="options"></a>
67
71
  Options are additional parameters that are given that modify the behavior of a command. There are
68
- two kinds of options available for use, ***positional*** and ***named***.
72
+ two kinds of options available for use ***positional*** and ***named***.
69
73
 
70
74
  #### Positional Options <a name="positional-options"></a>
71
75
  Positional options are identified by the absence of preceding dash/dashes and are interpreted
@@ -105,75 +109,131 @@ properly.
105
109
  Example ruby configuration:
106
110
  ```ruby
107
111
  if __FILE__ == $0
108
- examples = "Clean all: sudo ./#{app} clean all\n".colorize(:green)
109
-
110
- # Creates a new instance of commander
111
- cmdr = Commander.new(examples:examples)
112
-
113
- # Add global options
114
- cmdr.add_global([
115
- Option.new('-d|--debug', 'Debug output')
112
+ # Create examples for app
113
+ app = 'reduce'
114
+ examples = "Full ISO Build: sudo ./#{app} clean build all -p personal\n".colorize(:green)
115
+ examples += "Rebuild initramfs: sudo ./#{app} clean build initramfs,iso -p personal\n".colorize(:green)
116
+ examples += "Rebuild multiboot: sudo ./#{app} clean build multiboot,iso -p personal\n".colorize(:green)
117
+ examples += "Clean pacman dbs: sudo ./#{app} clean --pacman\n".colorize(:green)
118
+ examples += "Build k8snode deployment: sudo ./#{app} clean build iso -d k8snode -p personal\n".colorize(:green)
119
+ examples += "Pack k8snode deployment: ./#{app} pack k8snode\n".colorize(:green)
120
+ examples += "Deploy nodes: sudo ./#{app} deploy k8snode 10,11,12\n".colorize(:green)
121
+ examples += "Deploy container: sudo ./#{app} deploy build --run\n".colorize(:green)
122
+
123
+ # Create a new instance of commander
124
+ cmdr = Commander.new(app:app, version:'0.0.1', examples:examples)
125
+ cmdr.add_global('-p|--profile=PROFILE', 'Profile to use', type:String)
126
+ cmdr.add('info', 'List build info')
127
+ cmdr.add('list', 'List out components', nodes:[
128
+ Option.new(nil, 'Components to list', type:Array, allowed:{
129
+ all: 'List all components',
130
+ boxes: 'List all boxes',
131
+ isos: 'List all isos',
132
+ images: 'List all docker images'
133
+ }),
134
+ Option.new('--raw', "Produce output suitable for automation"),
116
135
  ])
117
-
118
- # Create two commands with a chainable positional option
119
- cmdr.add('clean', 'Clean build', options:[
120
- Option.new(nil, 'Clean given components', allowed:['all', 'iso'])
136
+ cmdr.add('clean', 'Clean ISO components', nodes:[
137
+ Option.new(nil, 'Components to clean', type:Array, allowed:{
138
+ all: 'Clean all components including deployments',
139
+ initramfs: 'Clean initramfs image',
140
+ multiboot: 'Clean grub multiboot image',
141
+ iso: 'Clean bootable ISO'
142
+ }),
143
+ Option.new('--pacman', "Clean pacman repos"),
144
+ Option.new('--cache', "Clean pacman/ruby package cache"),
145
+ Option.new('--vms', "Clean VMs that are no longer deployed"),
146
+ Option.new('-d|--deployments=DEPLOYMENTS', "Deployments to clean", type:Array)
147
+ ])
148
+ cmdr.add('build', 'Build ISO components', nodes:[
149
+ Option.new(nil, 'Components to build', type:Array, allowed:{
150
+ all: 'Build all components including deployments',
151
+ initramfs: 'Build initramfs image',
152
+ multiboot: 'Build grub multiboot image',
153
+ iso: 'Clean bootable ISO',
154
+ }),
155
+ Option.new('-d|--deployments=DEPLOYMENTS', "Deployments to build", type:Array)
121
156
  ])
122
- cmdr.add('build', 'Build components', options:[
123
- Option.new(nil, 'Build given components')
157
+ cmdr.add('pack', 'Pack ISO deployments into vagrant boxes', nodes:[
158
+ Option.new(nil, "Deployments to pack", type:Array, required:true),
159
+ Option.new('--disk-size=DISK_SIZE', "Set the disk size in MB e.g. 10000", type:String),
160
+ Option.new('--force', "Pack the given deployment/s even if they already exist")
124
161
  ])
162
+ cmdr.add('deploy', 'Deploy VMs or containers', nodes:[
163
+ Option.new(nil, "Deployments to pack", type:Array, required:true),
164
+ Option.new(nil, "Comma delimited list of last octet IPs (e.g. 10,11,12", type:Array),
165
+ Option.new('-n|--name=NAME', "Give a name to the nodes being deployed", type:String),
166
+ Option.new('-f|--force', "Deploy the given deployment/s even if they already exist"),
167
+ Option.new('-r|--run', "Run the container with defaults"),
168
+ Option.new('-e|--exec=CMD', "Specific command to run in container", type:String),
169
+ Option.new('--ipv6', "Enable IPv6 on the given nodes"),
170
+ Option.new('--vagrantfile', "Export the Vagrantfile only"),
171
+ ])
172
+
173
+ # Invoke commander parse
125
174
  cmdr.parse!
126
175
 
127
- debug = cmdr[:global][:debug]
128
- clean(cmdr[:clean][:clean0], debug:debug) if cmdr[:clean]
129
- build(cmdr[:build][:build0], debug:debug) if cmdr[:build]
176
+ # Execute 'info' command
177
+ reduce.info if cmdr[:info]
178
+
179
+ # Execute 'list' command
180
+ reduce.list(cmdr[:list][:list0]) if cmdr[:list]
181
+
182
+ # Execute 'clean' command
183
+ reduce.clean(cmdr[:clean][:clean0], deployments: cmdr[:clean][:deployments],
184
+ pacman: cmdr[:clean][:pacman], cache: cmdr[:clean][:cache], vms: cmdr[:vms]) if cmdr[:clean]
185
+
186
+ # Execute 'build' command
187
+ reduce.build(cmdr[:clean][:clean0], deployments: cmdr[:clean][:deployments]) if cmdr[:build]
188
+
189
+ # Execute 'pack' command
190
+ reduce.pack(cmdr[:pack][:pack0], disksize: cmdr[:pack][:disksize], force: cmdr[:pack][:force]) if cmdr[:pack]
191
+
192
+ # Execute 'deploy' command
193
+ reduce.deploy(cmdr[:deploy][:pack0], nodes: cmdr[:deploy][:deploy1], name: cmdr[:deploy][:name],
194
+ run: cmdr[:deploy][:run], exec: cmdr[:deploy][:exec], ipv6: cmdr[:ipv6],
195
+ vagrantfile: cmdr[:vagrantfile], force: cmdr[:force]) if cmdr[:deploy]
130
196
  end
131
197
  ```
132
198
 
133
- Example command line expressions:
199
+ #### Named Option Examples <a name="named-option-examples"></a>
134
200
  ```bash
135
- # Chained commands 'clean' and 'build' share the 'all' positional option, thus 'clean' will be
136
- # executed first with the 'all' option then 'build' will be executed second with the 'all' option.
137
- ./app clean build all
138
- # Chained commands 'clean' and 'build' with their own specific 'all' positional option which is
139
- # exactly equivalent to the previous usage
140
- ./app clean all build all
141
- ```
201
+ # The parameter '-d' coming after the command 'clean' is a named option using short hand form with
202
+ # an input type of Array without any checking as configured above
203
+ ./app clean -d base
142
204
 
143
- Example ruby configuration:
144
- ```ruby
145
- # Creates a new instance of commander with app settings as given
146
- cmdr = Commander.new('app-name', 'app-version', 'examples')
147
- # Create command with a positional argument
148
- cmdr.add('clean', 'Clean build', options:[
149
- Option.new(nil, 'Clean given components', allowed:['all', 'iso', 'image']),,,,
150
- Option.new('-d|--debug', 'Debug mode'),
151
- Option.new('-s|--skip=COMPONENT', 'Skip the given components', allowed:['iso', 'image'], type:String)
152
- ])
153
- # Create command with a single positional option with an allowed check for value
154
- cmdr.add('build', 'Build components', options:[
155
- Option.new(nil, 'Build given components', allowed:['all', 'iso', 'image'])
156
- ])
157
- cmdr.parse!
205
+ # This is a variation using long form which is exactly equivalent
206
+ ./app clean --deployments base
207
+
208
+ # This is a variation using long form with assignement syntax which is also exactly equivalent
209
+ ./app clean --deployments=base
210
+
211
+ # This is a variation providing multiple values for the array named parameter 'deployments'
212
+ ./app clean -d base,lite,heavy
158
213
  ```
159
214
 
160
- Example command line expressions:
215
+ #### Positional Option Examples <a name="positional-option-examples"></a>
161
216
  ```bash
162
- # The parameter 'all' coming after the command 'clean' is a positional option with a default type of
163
- # String that is checked against the optional 'allowed' values configuration
217
+ # The parameter 'all' coming after the command 'clean' is a positional array option with a default
218
+ # type of String that is checked against the configured allowed values ['all', 'initramfs',
219
+ # 'multiboot', 'ios'].
164
220
  ./app clean all
165
- # The parameter '-d' coming after the command 'clean' is a named option using short hand form with
166
- # an input type defaulted to Flag (i.e. a simple flag)
167
- ./app clean -d
168
- # The parameter '--debug' coming after the command 'clean' is a named option using long hand form with
169
- # an input type defaulted to Flag (i.e. a simple flag); exactly equivalent to the former expression
170
- ./app clean --debug
171
- # The parameter '-s' coming after the command 'clean' is a named option using short hand form with
172
- # an input value 'iso' of type String
173
- ./app clean -s iso
174
- # The parameter '--skip' coming after the command 'clean' is a named option using long hand form
175
- # with an input value 'iso' of type String; exactly equivalent to the former expression
176
- ./app clean --skip=iso
221
+
222
+ # This is a variation of the previous command line expression with multiple values specified for the
223
+ # array.
224
+ ./app clean initramfs,multiboot,iso
225
+ ```
226
+
227
+ #### Chained Command Expression Examples <a name="chained-command-expression-examples"></a>
228
+ ```bash
229
+ # Chained commands 'clean' and 'build' share the 'all' positional option. Additionally there is one
230
+ # global option '-p personal'. Thus 'clean' will be executed first with the 'all' option in the
231
+ # context of '-p personal' then the 'build' command will be executed second with the 'all' option
232
+ # in the context of '-p personal'.
233
+ ./app clean build all -p standard
234
+
235
+ # The above chained command is exactly equivalent to its expanded counter part below
236
+ ./app clean all build all -p personal
177
237
  ```
178
238
 
179
239
  ### Help <a name="help"></a>
data/lib/nub/commander.rb CHANGED
@@ -538,7 +538,7 @@ class Commander
538
538
  match.value = arg[@value_regex, 1]
539
539
 
540
540
  # Set symbol converting dashes to underscores for named options
541
- if (match.opt = options.find{|x| x.short == short || x.long == long})
541
+ if (match.opt = options.find{|x| (short && short == x.short) || (long && long == x.long)})
542
542
  match.sym = match.opt.to_sym
543
543
  end
544
544
  end
@@ -551,7 +551,7 @@ class Commander
551
551
  short = x[@short_regex, 1]
552
552
  long = x[@long_regex, 1]
553
553
  value = x[@value_regex, 1]
554
- if short == arg.short || long == arg.long
554
+ if (short && short == arg.short) || (long && long == arg.long)
555
555
  match.opt = arg
556
556
  match.value = value
557
557
  match.sym = match.opt.to_sym
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.56
4
+ version: 0.0.57
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Crummett