nub 0.0.56 → 0.0.57

Sign up to get free protection for your applications and to get access to all the features.
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