lino 2.2.0.pre.5 → 2.2.0.pre.6

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: 729c96dd84a7a44337298eb3de557d061565d5f4defc5bd2077431e20f0917cc
4
- data.tar.gz: 03c7697d78175ad6e2135540d2babeee039a9cdfd77cbcd789137db66561aa80
3
+ metadata.gz: 9aefe3408616b3ae2841a469c5968f05a3d93f069b481ab3a311b37c5c99a19c
4
+ data.tar.gz: 36aab763064d14623437733908fdf4dcc1662431aa74ef5b296d8966799e6713
5
5
  SHA512:
6
- metadata.gz: 95af24c97c8d11bdbcdd44be3f78a72e0474fa8665f3bf3b67546caf34f6e93c7ba971b94df2efc8ae9a9b6f3e831a17c1dd04e07416fd54d48d9dd5ffed12e3
7
- data.tar.gz: 151036608c99015ea9494e6ec17b21cb0055e6616d34669ca54009fe7b033b72de5323a240972763d512395ed3374a4d2134865f9ff89db535b5f5ca5bd9ae01
6
+ metadata.gz: a0492eb20f00aa07778fe583f1ae8e59516b2ca15a745a5c1f754401db2c6ab5c16f6ee5804b0517c434180a4dab376d499c6d881e7dac1db9a6433e2e6b8aa1
7
+ data.tar.gz: d3d77fe67e292480d87d323887ecd93292149ab7cb3a510b32c9accd721d3c465b8a12cfa7b84c8ad9b2a8310c5702efc39fb91c19a787a1a1d2e299061701be
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lino (2.2.0.pre.5)
4
+ lino (2.2.0.pre.6)
5
5
  hamster (~> 3.0)
6
6
  open4 (~> 1.3)
7
7
 
data/README.md CHANGED
@@ -41,10 +41,13 @@ command_line.execute
41
41
  ### `Lino::CommandLineBuilder`
42
42
 
43
43
  The `CommandLineBuilder` allows a number of different styles of commands to be
44
- built:
44
+ built.
45
+
46
+ #### Flags
47
+
48
+ Flags can be added with `#with_flag`:
45
49
 
46
50
  ```ruby
47
- # commands with flags
48
51
  Lino::CommandLineBuilder.for_command('ls')
49
52
  .with_flag('-l')
50
53
  .with_flag('-a')
@@ -52,8 +55,24 @@ Lino::CommandLineBuilder.for_command('ls')
52
55
  .to_s
53
56
 
54
57
  # => ls -l -a
58
+ ```
55
59
 
56
- # commands with options
60
+ or `#with_flags`:
61
+
62
+ ```ruby
63
+ Lino::CommandLineBuilder.for_command('ls')
64
+ .with_flags(%w[-l -a])
65
+ .build
66
+ .to_s
67
+
68
+ # => ls -l -a
69
+ ```
70
+
71
+ #### Options
72
+
73
+ Options with values can be added with `#with_option`:
74
+
75
+ ```ruby
57
76
  Lino::CommandLineBuilder.for_command('gpg')
58
77
  .with_option('--recipient', 'tobyclemson@gmail.com')
59
78
  .with_option('--sign', './doc.txt')
@@ -61,8 +80,11 @@ Lino::CommandLineBuilder.for_command('gpg')
61
80
  .to_s
62
81
 
63
82
  # => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
83
+ ```
64
84
 
65
- # ... or alternatively
85
+ or `#with_options`, either as a hash:
86
+
87
+ ```ruby
66
88
  Lino::CommandLineBuilder.for_command('gpg')
67
89
  .with_options({
68
90
  '--recipient' => 'tobyclemson@gmail.com',
@@ -72,8 +94,11 @@ Lino::CommandLineBuilder.for_command('gpg')
72
94
  .to_s
73
95
 
74
96
  # => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
97
+ ```
75
98
 
76
- # ... or alternatively
99
+ or as an array:
100
+
101
+ ```ruby
77
102
  Lino::CommandLineBuilder.for_command('gpg')
78
103
  .with_options(
79
104
  [
@@ -85,16 +110,27 @@ Lino::CommandLineBuilder.for_command('gpg')
85
110
  .to_s
86
111
 
87
112
  # => gpg --recipient tobyclemson@gmail.com --sign ./doc.txt
113
+ ```
114
+
115
+ Some commands allow options to be repeated:
88
116
 
89
- # commands with an option repeated multiple times
117
+ ```ruby
90
118
  Lino::CommandLineBuilder.for_command('example.sh')
91
119
  .with_repeated_option('--opt', ['file1.txt', nil, '', 'file2.txt'])
92
120
  .build
93
121
  .to_s
94
122
 
95
123
  # => example.sh --opt file1.txt --opt file2.txt
124
+ ```
125
+
126
+ > Note: `lino` ignores `nil` or empty option values in the resulting command
127
+ > line.
96
128
 
97
- # commands with arguments
129
+ #### Arguments
130
+
131
+ Arguments can be added using `#with_argument`:
132
+
133
+ ```ruby
98
134
  Lino::CommandLineBuilder.for_command('diff')
99
135
  .with_argument('./file1.txt')
100
136
  .with_argument('./file2.txt')
@@ -102,16 +138,28 @@ Lino::CommandLineBuilder.for_command('diff')
102
138
  .to_s
103
139
 
104
140
  # => diff ./file1.txt ./file2.txt
141
+ ```
105
142
 
106
- # ... or alternatively
143
+ or `#with_arguments`, as an array:
144
+
145
+ ```ruby
107
146
  Lino::CommandLineBuilder.for_command('diff')
108
147
  .with_arguments(['./file1.txt', nil, '', './file2.txt'])
109
148
  .build
110
149
  .to_s
111
150
 
112
151
  # => diff ./file1.txt ./file2.txt
152
+ ```
153
+
154
+ > Note: `lino` ignores `nil` or empty argument values in the resulting command
155
+ > line.
156
+
157
+ #### Option Separators
113
158
 
114
- # commands with custom option separator
159
+ By default, `lino` separates option values from the option by a space. This
160
+ can be overridden globally using `#with_option_separator`:
161
+
162
+ ```ruby
115
163
  Lino::CommandLineBuilder.for_command('java')
116
164
  .with_option_separator(':')
117
165
  .with_option('-splash', './images/splash.jpg')
@@ -120,44 +168,132 @@ Lino::CommandLineBuilder.for_command('java')
120
168
  .to_s
121
169
 
122
170
  # => java -splash:./images/splash.jpg ./application.jar
171
+ ```
172
+
173
+ The option separator can be overridden on an option by option basis:
123
174
 
124
- # commands using a subcommand style
175
+ ```ruby
176
+ Lino::CommandLineBuilder.for_command('java')
177
+ .with_option('-splash', './images/splash.jpg', separator: ':')
178
+ .with_argument('./application.jar')
179
+ .build
180
+ .to_s
181
+
182
+ # => java -splash:./images/splash.jpg ./application.jar
183
+ ```
184
+
185
+ > Note: `#with_options` supports separator overriding when the options are
186
+ > passed as an array of hashes and a `separator` key is included in the
187
+ > hash.
188
+
189
+ > Note: `#with_repeated_option` also supports the `separator` named parameter.
190
+
191
+ > Note: option specific separators take precedence over the global option
192
+ > separator
193
+
194
+ #### Option Quoting
195
+
196
+ By default, `lino` does not quote option values. This can be overridden
197
+ globally using `#with_option_quoting`:
198
+
199
+ ```ruby
200
+ Lino::CommandLineBuilder.for_command('gpg')
201
+ .with_option_quoting('"')
202
+ .with_option('--sign', 'some file.txt')
203
+ .build
204
+ .to_s
205
+
206
+ # => gpg --sign "some file.txt"
207
+ ```
208
+
209
+ The option quoting can be overridden on an option by option basis:
210
+
211
+ ```ruby
212
+ Lino::CommandLineBuilder.for_command('java')
213
+ .with_option('-splash', './images/splash.jpg', quoting: '"')
214
+ .with_argument('./application.jar')
215
+ .build
216
+ .to_s
217
+
218
+ # => java -splash "./images/splash.jpg" ./application.jar
219
+ ```
220
+
221
+ > Note: `#with_options` supports quoting overriding when the options are
222
+ > passed as an array of hashes and a `quoting` key is included in the
223
+ > hash.
224
+
225
+ > Note: `#with_repeated_option` also supports the `quoting` named parameter.
226
+
227
+ > Note: option specific quoting take precedence over the global option
228
+ > quoting
229
+
230
+ #### Subcommands
231
+
232
+ Subcommands can be added using `#with_subcommand`:
233
+
234
+ ```ruby
125
235
  Lino::CommandLineBuilder.for_command('git')
126
236
  .with_flag('--no-pager')
127
- .with_subcommand('log') do |sub|
128
- sub.with_option('--since', '2016-01-01')
129
- end
237
+ .with_subcommand('log')
130
238
  .build
131
239
  .to_s
132
240
 
133
- # => git --no-pager log --since 2016-01-01
241
+ # => git --no-pager log
242
+ ```
134
243
 
135
- # commands with multiple levels of subcommand
244
+ Multi-level subcommands can be added using multiple `#with_subcommand`
245
+ invocations:
246
+
247
+ ```ruby
136
248
  Lino::CommandLineBuilder.for_command('gcloud')
137
249
  .with_subcommand('sql')
138
250
  .with_subcommand('instances')
139
251
  .with_subcommand('set-root-password')
140
- .with_subcommand('some-database') do |sub|
141
- sub.with_option('--password', 'super-secure')
142
- end
252
+ .with_subcommand('some-database')
143
253
  .build
144
254
  .to_s
145
-
146
- # => gcloud sql instances set-root-password some-database --password super-secure
147
255
 
148
- # ... or alternatively
256
+ # => gcloud sql instances set-root-password some-database
257
+ ```
258
+
259
+ or using `#with_subcommands`:
260
+
261
+ ```ruby
149
262
  Lino::CommandLineBuilder.for_command('gcloud')
150
263
  .with_subcommands(
151
264
  %w[sql instances set-root-password some-database]
152
- ) do |sub|
153
- sub.with_option('--password', 'super-secure')
154
- end
265
+ )
155
266
  .build
156
267
  .to_s
157
268
 
158
- # => gcloud sql instances set-root-password some-database --password super-secure
269
+ # => gcloud sql instances set-root-password some-database
270
+ ```
271
+
272
+ Subcommands also support options via `#with_flag`, `#with_flags`,
273
+ `#with_option`, `#with_options` and `#with_repeated_option` just like commands,
274
+ via a block, for example:
275
+
276
+ ```ruby
277
+ Lino::CommandLineBuilder.for_command('git')
278
+ .with_flag('--no-pager')
279
+ .with_subcommand('log') do |sub|
280
+ sub.with_option('--since', '2016-01-01')
281
+ end
282
+ .build
283
+ .to_s
284
+
285
+ # => git --no-pager log --since 2016-01-01
286
+ ```
287
+
288
+ > Note: `#with_subcommands` also supports a block, which applies in the context
289
+ > of the last subcommand in the passed array.
290
+
291
+ #### Environment Variables
292
+
293
+ Command lines can be prefixed with environment variables using
294
+ `#with_environment_variable`:
159
295
 
160
- # commands controlled by environment variables
296
+ ```ruby
161
297
  Lino::CommandLineBuilder.for_command('node')
162
298
  .with_environment_variable('PORT', '3030')
163
299
  .with_environment_variable('LOG_LEVEL', 'debug')
@@ -166,31 +302,73 @@ Lino::CommandLineBuilder.for_command('node')
166
302
  .to_s
167
303
 
168
304
  # => PORT=3030 LOG_LEVEL=debug node ./server.js
305
+ ```
306
+
307
+ or `#with_environment_variables`, either as a hash:
308
+
309
+ ```ruby
310
+ Lino::CommandLineBuilder.for_command('node')
311
+ .with_environment_variables({
312
+ 'PORT' => '3030',
313
+ 'LOG_LEVEL' => 'debug'
314
+ })
315
+ .build
316
+ .to_s
317
+
318
+ # => PORT=3030 LOG_LEVEL=debug node ./server.js
319
+ ```
169
320
 
170
- # note: by default, options are placed after the command, before all subcommands
171
- # and arguments
321
+ or as an array:
172
322
 
173
- # this can be expressed explicitly
323
+ ```ruby
324
+ Lino::CommandLineBuilder.for_command('node')
325
+ .with_environment_variables(
326
+ [
327
+ { name: 'PORT', value: '3030' },
328
+ { name: 'LOG_LEVEL', value: 'debug' }
329
+ ]
330
+ )
331
+ .build
332
+ .to_s
333
+
334
+ # => PORT=3030 LOG_LEVEL=debug node ./server.js
335
+ ```
336
+
337
+ #### Option Placement
338
+
339
+ By default, `lino` places top-level options after the command, before all
340
+ subcommands and arguments.
341
+
342
+ This is equivalent to calling `#with_options_after_command`:
343
+
344
+ ```ruby
174
345
  Lino::CommandLineBuilder.for_command('gcloud')
175
346
  .with_options_after_command
176
347
  .with_option('--password', 'super-secure')
177
- .with_subcommands(%w[sql instances set-root-password some-database])
348
+ .with_subcommands(%w[sql instances set-root-password])
178
349
  .build
179
350
  .to_s
180
351
 
181
- # => gcloud --password super-secure sql instances set-root-password some-database
352
+ # => gcloud --password super-secure sql instances set-root-password
353
+ ```
354
+
355
+ Alternatively, top-level options can be placed after all subcommands using
356
+ `#with_options_after_subcommands`:
182
357
 
183
- # options can also come after subcommands
358
+ ```ruby
184
359
  Lino::CommandLineBuilder.for_command('gcloud')
185
360
  .with_options_after_subcommands
186
361
  .with_option('--password', 'super-secure')
187
- .with_subcommands(%w[sql instances set-root-password some-database])
362
+ .with_subcommands(%w[sql instances set-root-password])
188
363
  .build
189
364
  .to_s
190
365
 
191
- # => gcloud sql instances set-root-password some-database --password super-secure
366
+ # => gcloud sql instances set-root-password --password super-secure
367
+ ```
368
+
369
+ or, after all arguments, using `#with_options_after_arguments`:
192
370
 
193
- # options can also come after arguments, although usages of this are rare
371
+ ```ruby
194
372
  Lino::CommandLineBuilder.for_command('ls')
195
373
  .with_options_after_arguments
196
374
  .with_flag('-l')
@@ -201,6 +379,59 @@ Lino::CommandLineBuilder.for_command('ls')
201
379
  # => ls /some/directory -l
202
380
  ```
203
381
 
382
+ #### Appliables
383
+
384
+ Command and subcommand builders both support passing 'appliables' that are
385
+ applied to the builder allowing an operation to be encapsulated in an object.
386
+
387
+ Given an appliable type:
388
+
389
+ ```ruby
390
+ class AppliableOption
391
+ def initialize(option, value)
392
+ @option = option
393
+ @value = value
394
+ end
395
+
396
+ def apply(builder)
397
+ builder.with_option(@option, @value)
398
+ end
399
+ end
400
+ ```
401
+
402
+ an instance of the appliable can be applied using `#with_appliable`:
403
+
404
+ ```ruby
405
+ Lino::CommandLineBuilder.for_command('gpg')
406
+ .with_appliable(AppliableOption.new('--recipient', 'tobyclemson@gmail.com'))
407
+ .with_flag('--sign')
408
+ .with_argument('/some/file.txt')
409
+ .build
410
+ .to_s
411
+
412
+ # => gpg --recipient tobyclemson@gmail.com --sign /some/file.txt
413
+ ```
414
+
415
+ or multiple with `#with_appliables`:
416
+
417
+ ```ruby
418
+ Lino::CommandLineBuilder.for_command('gpg')
419
+ .with_appliables([
420
+ AppliableOption.new('--recipient', 'user@example.com'),
421
+ AppliableOption.new('--output', '/signed.txt')
422
+ ])
423
+ .with_flag('--sign')
424
+ .with_argument('/file.txt')
425
+ .build
426
+ .to_s
427
+
428
+ # => gpg --recipient user@example.com --output /signed.txt --sign /file.txt
429
+ ```
430
+
431
+ > Note: an 'appliable' is any object that has an `#apply` method.
432
+
433
+ > Note: `lino` ignores `nil` or empty appliables in the resulting command line.
434
+
204
435
  ### `Lino::CommandLine`
205
436
 
206
437
  A `CommandLine` can be executed using the `#execute` method:
@@ -113,6 +113,17 @@ module Lino
113
113
  )
114
114
  end
115
115
 
116
+ def with_environment_variables(environment_variables)
117
+ return self if missing?(environment_variables)
118
+
119
+ environment_variables.entries.inject(self) do |s, var|
120
+ s.with_environment_variable(
121
+ var.include?(:name) ? var[:name] : var[0],
122
+ var.include?(:value) ? var[:value] : var[1]
123
+ )
124
+ end
125
+ end
126
+
116
127
  def build
117
128
  components = formatted_components
118
129
  command_line = SELECTORS[@option_placement]
data/lib/lino/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lino
4
- VERSION = '2.2.0.pre.5'
4
+ VERSION = '2.2.0.pre.6'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lino
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0.pre.5
4
+ version: 2.2.0.pre.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toby Clemson