lino 2.3.0 → 2.6.0.pre.2

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: 129071c48c23ef6eb2f555fab54f2bb6ec49384e805c875a1aa041dfa46ab37e
4
- data.tar.gz: 882bee98261d28bf8051ec8a96dd7d5cfb4a89a378a99fe72b2778cce8092257
3
+ metadata.gz: c4c737157f6552423f6fbb2a5b4263e4f2a76b543d6f7ea15408988caeca61ff
4
+ data.tar.gz: 20257769cf4a2807dc6a826e1e22ca5b52ecb1c650f8ed69662f787c013c2b64
5
5
  SHA512:
6
- metadata.gz: 18a48edeab746a5783c5a24b32ecdbcddd31cf859a059c3fb63923b8822297ecbd88d07390099290e82fcb080e74a9447f1d9e04159564fb466f231aa3d8aa8b
7
- data.tar.gz: 4a5f662b61a8c8069f9c8388cec9d511d3fe0f7165c4f707630d8e507ec6db2abedab7f805777e0a99fda78b2e5f124bd010e173a98f8e1a1e103b2f31e80503
6
+ metadata.gz: 58d4387c603f527dec478c0ee57ded0af915da0111042ea8a16d10d54050755322ee1f6849fd3b427b783feb4116f6c75fe2ab56c38bcef21d782ed650b99db5
7
+ data.tar.gz: 11d9561cb8c69833c035da08e04c5afb78ac54a90db6c1c2b1c59c752ebb199b0eb89d613d7ecdb60bb7c70b9d8afcffee3b7b3bfa7d024c3806da58dd89ac71
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lino (2.3.0)
4
+ lino (2.6.0.pre.2)
5
5
  hamster (~> 3.0)
6
6
  open4 (~> 1.3)
7
7
 
@@ -133,4 +133,4 @@ DEPENDENCIES
133
133
  simplecov (~> 0.16)
134
134
 
135
135
  BUNDLED WITH
136
- 2.2.15
136
+ 2.2.16
data/README.md CHANGED
@@ -379,6 +379,33 @@ Lino::CommandLineBuilder.for_command('ls')
379
379
  # => ls /some/directory -l
380
380
  ```
381
381
 
382
+ The option placement can be overridden on an option by option basis:
383
+
384
+ ```ruby
385
+ Lino::CommandLineBuilder.for_command('gcloud')
386
+ .with_options_after_subcommands
387
+ .with_option('--log-level', 'debug', placement: :after_command)
388
+ .with_option('--password', 'super-secure')
389
+ .with_subcommands(%w[sql instances set-root-password])
390
+ .build
391
+ .to_s
392
+
393
+ # => gcloud --log-level debug sql instances set-root-password \
394
+ # --password super-secure
395
+ ```
396
+
397
+ The `:placement` keyword argument accepts placement values of `:after_command`,
398
+ `:after_subcommands` and `:after_arguments`.
399
+
400
+ > Note: `#with_options` supports placement overriding when the options are
401
+ > passed as an array of hashes and a `placement` key is included in the
402
+ > hash.
403
+
404
+ > Note: `#with_repeated_option` also supports the `placement` named parameter.
405
+
406
+ > Note: option specific placement take precedence over the global option
407
+ > placement
408
+
382
409
  #### Appliables
383
410
 
384
411
  Command and subcommand builders both support passing 'appliables' that are
@@ -10,15 +10,6 @@ require_relative 'appliables'
10
10
  module Lino
11
11
  # rubocop:disable Metrics/ClassLength
12
12
  class CommandLineBuilder
13
- SELECTORS = {
14
- after_command:
15
- %i[environment_variables command options subcommands arguments],
16
- after_subcommands:
17
- %i[environment_variables command subcommands options arguments],
18
- after_arguments:
19
- %i[environment_variables command subcommands arguments options]
20
- }.freeze
21
-
22
13
  include Lino::Utilities
23
14
  include Lino::Options
24
15
  include Lino::Appliables
@@ -49,9 +40,12 @@ module Lino
49
40
  @option_quoting = option_quoting
50
41
  @option_placement = option_placement
51
42
  end
43
+
52
44
  # rubocop:enable Metrics/ParameterLists
53
45
 
54
46
  def with_subcommand(subcommand, &block)
47
+ return self if missing?(subcommand)
48
+
55
49
  with(
56
50
  subcommands: @subcommands.add(
57
51
  (block || ->(sub) { sub }).call(
@@ -62,6 +56,8 @@ module Lino
62
56
  end
63
57
 
64
58
  def with_subcommands(subcommands, &block)
59
+ return self if missing?(subcommands)
60
+
65
61
  without_block = subcommands[0...-1]
66
62
  with_block = subcommands.last
67
63
 
@@ -78,16 +74,20 @@ module Lino
78
74
  with(option_quoting: character)
79
75
  end
80
76
 
77
+ def with_option_placement(option_placement)
78
+ with(option_placement: option_placement)
79
+ end
80
+
81
81
  def with_options_after_command
82
- with(option_placement: :after_command)
82
+ with_option_placement(:after_command)
83
83
  end
84
84
 
85
85
  def with_options_after_subcommands
86
- with(option_placement: :after_subcommands)
86
+ with_option_placement(:after_subcommands)
87
87
  end
88
88
 
89
89
  def with_options_after_arguments
90
- with(option_placement: :after_arguments)
90
+ with_option_placement(:after_arguments)
91
91
  end
92
92
 
93
93
  def with_argument(argument)
@@ -126,16 +126,29 @@ module Lino
126
126
 
127
127
  def build
128
128
  components = formatted_components
129
- command_line = SELECTORS[@option_placement]
130
- .inject([]) { |c, key| c << components[key] }
131
- .reject(&:empty?)
132
- .join(' ')
129
+ command_line =
130
+ component_paths
131
+ .collect { |path| path.inject(components) { |c, p| c && c[p] } }
132
+ .reject(&:empty?)
133
+ .join(' ')
133
134
 
134
135
  CommandLine.new(command_line)
135
136
  end
136
137
 
137
138
  private
138
139
 
140
+ def component_paths
141
+ [
142
+ %i[environment_variables],
143
+ %i[command],
144
+ %i[options after_command],
145
+ %i[subcommands],
146
+ %i[options after_subcommands],
147
+ %i[arguments],
148
+ %i[options after_arguments]
149
+ ]
150
+ end
151
+
139
152
  def formatted_components
140
153
  {
141
154
  environment_variables: formatted_environment_variables,
@@ -152,13 +165,24 @@ module Lino
152
165
  end
153
166
  end
154
167
 
155
- def formatted_options
168
+ def formatted_options_with_placement(placement)
156
169
  map_and_join(
157
- @options,
170
+ options_with_placement(placement),
158
171
  &(quote_with(@option_quoting) >> join_with(@option_separator))
159
172
  )
160
173
  end
161
174
 
175
+ def formatted_options
176
+ %i[
177
+ after_command
178
+ after_subcommands
179
+ after_arguments
180
+ ].inject({}) do |options, placement|
181
+ options
182
+ .merge({ placement => formatted_options_with_placement(placement) })
183
+ end
184
+ end
185
+
162
186
  def formatted_subcommands
163
187
  map_and_join(@subcommands) do |sub|
164
188
  sub.build(@option_separator, @option_quoting)
@@ -172,6 +196,13 @@ module Lino
172
196
  )
173
197
  end
174
198
 
199
+ def options_with_placement(placement)
200
+ @options.select { |o| o[:placement] == placement } +
201
+ if @option_placement == placement
202
+ @options.select { |o| o[:placement].nil? }
203
+ end
204
+ end
205
+
175
206
  def with(**replacements)
176
207
  CommandLineBuilder.new(**state.merge(replacements))
177
208
  end
@@ -189,5 +220,6 @@ module Lino
189
220
  }
190
221
  end
191
222
  end
223
+
192
224
  # rubocop:enable Metrics/ClassLength
193
225
  end
data/lib/lino/options.rb CHANGED
@@ -6,14 +6,21 @@ module Lino
6
6
  module Options
7
7
  include Lino::Utilities
8
8
 
9
- def with_option(option, value, separator: nil, quoting: nil)
9
+ def with_option(
10
+ option,
11
+ value,
12
+ separator: nil,
13
+ quoting: nil,
14
+ placement: nil
15
+ )
10
16
  return self if missing?(value)
11
17
 
12
18
  with(options: @options.add(
13
19
  {
14
20
  components: [option, value],
15
21
  separator: separator,
16
- quoting: quoting
22
+ quoting: quoting,
23
+ placement: placement
17
24
  }
18
25
  ))
19
26
  end
@@ -23,17 +30,30 @@ module Lino
23
30
 
24
31
  options.entries.inject(self) do |s, entry|
25
32
  s.with_option(
26
- entry.include?(:option) ? entry[:option] : entry[0],
27
- entry.include?(:value) ? entry[:value] : entry[1],
28
- separator: (entry.include?(:separator) ? entry[:separator] : nil),
29
- quoting: (entry.include?(:quoting) ? entry[:quoting] : nil)
33
+ or_nth(entry, :option, 0),
34
+ or_nth(entry, :value, 1),
35
+ separator: or_nil(entry, :separator),
36
+ quoting: or_nil(entry, :quoting),
37
+ placement: or_nil(entry, :placement)
30
38
  )
31
39
  end
32
40
  end
33
41
 
34
- def with_repeated_option(option, values, separator: nil, quoting: nil)
42
+ def with_repeated_option(
43
+ option,
44
+ values,
45
+ separator: nil,
46
+ quoting: nil,
47
+ placement: nil
48
+ )
35
49
  values.inject(self) do |s, value|
36
- s.with_option(option, value, separator: separator, quoting: quoting)
50
+ s.with_option(
51
+ option,
52
+ value,
53
+ separator: separator,
54
+ quoting: quoting,
55
+ placement: placement
56
+ )
37
57
  end
38
58
  end
39
59
 
@@ -41,5 +41,13 @@ module Lino
41
41
  components
42
42
  end
43
43
  end
44
+
45
+ def or_nil(enumerable, key)
46
+ enumerable.include?(key) ? enumerable[key] : nil
47
+ end
48
+
49
+ def or_nth(enumerable, key, index)
50
+ enumerable.include?(key) ? enumerable[key] : enumerable[index]
51
+ end
44
52
  end
45
53
  end
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.3.0'
4
+ VERSION = '2.6.0.pre.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lino
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.6.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toby Clemson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-05 00:00:00.000000000 Z
11
+ date: 2021-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hamster
@@ -244,9 +244,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
244
  version: '2.6'
245
245
  required_rubygems_version: !ruby/object:Gem::Requirement
246
246
  requirements:
247
- - - ">="
247
+ - - ">"
248
248
  - !ruby/object:Gem::Version
249
- version: '0'
249
+ version: 1.3.1
250
250
  requirements: []
251
251
  rubygems_version: 3.0.1
252
252
  signing_key: