lino 2.6.0.pre.1 → 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: 8cdb146f45a3d5a9f7077a61c38653dfed04f3e66620413a45d3a144d1e63b66
4
- data.tar.gz: 021f79a56a5d468ef2e45fbfb2368b33d5a3161de4c3b982133f9bc74b9bf2af
3
+ metadata.gz: c4c737157f6552423f6fbb2a5b4263e4f2a76b543d6f7ea15408988caeca61ff
4
+ data.tar.gz: 20257769cf4a2807dc6a826e1e22ca5b52ecb1c650f8ed69662f787c013c2b64
5
5
  SHA512:
6
- metadata.gz: 8e10b2bba92eb41347729fa3657e9c65c8a7c9a4534a4d1c98fb3bf0529eb331d75a57b20928a946854d1a6e2ffdca043105c0df712e4779d156c553545182be
7
- data.tar.gz: 311f50b183a778d13ca8eaeae22c9a5de60d94b26ca0a521e28445653044c9d2f2ca3d412b07ed783be7534baa35a827772864bd84c1519f8cef85acf6deab4c
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.6.0.pre.1)
4
+ lino (2.6.0.pre.2)
5
5
  hamster (~> 3.0)
6
6
  open4 (~> 1.3)
7
7
 
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,6 +40,7 @@ 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)
@@ -82,16 +74,20 @@ module Lino
82
74
  with(option_quoting: character)
83
75
  end
84
76
 
77
+ def with_option_placement(option_placement)
78
+ with(option_placement: option_placement)
79
+ end
80
+
85
81
  def with_options_after_command
86
- with(option_placement: :after_command)
82
+ with_option_placement(:after_command)
87
83
  end
88
84
 
89
85
  def with_options_after_subcommands
90
- with(option_placement: :after_subcommands)
86
+ with_option_placement(:after_subcommands)
91
87
  end
92
88
 
93
89
  def with_options_after_arguments
94
- with(option_placement: :after_arguments)
90
+ with_option_placement(:after_arguments)
95
91
  end
96
92
 
97
93
  def with_argument(argument)
@@ -130,16 +126,29 @@ module Lino
130
126
 
131
127
  def build
132
128
  components = formatted_components
133
- command_line = SELECTORS[@option_placement]
134
- .inject([]) { |c, key| c << components[key] }
135
- .reject(&:empty?)
136
- .join(' ')
129
+ command_line =
130
+ component_paths
131
+ .collect { |path| path.inject(components) { |c, p| c && c[p] } }
132
+ .reject(&:empty?)
133
+ .join(' ')
137
134
 
138
135
  CommandLine.new(command_line)
139
136
  end
140
137
 
141
138
  private
142
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
+
143
152
  def formatted_components
144
153
  {
145
154
  environment_variables: formatted_environment_variables,
@@ -156,13 +165,24 @@ module Lino
156
165
  end
157
166
  end
158
167
 
159
- def formatted_options
168
+ def formatted_options_with_placement(placement)
160
169
  map_and_join(
161
- @options,
170
+ options_with_placement(placement),
162
171
  &(quote_with(@option_quoting) >> join_with(@option_separator))
163
172
  )
164
173
  end
165
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
+
166
186
  def formatted_subcommands
167
187
  map_and_join(@subcommands) do |sub|
168
188
  sub.build(@option_separator, @option_quoting)
@@ -176,6 +196,13 @@ module Lino
176
196
  )
177
197
  end
178
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
+
179
206
  def with(**replacements)
180
207
  CommandLineBuilder.new(**state.merge(replacements))
181
208
  end
@@ -193,5 +220,6 @@ module Lino
193
220
  }
194
221
  end
195
222
  end
223
+
196
224
  # rubocop:enable Metrics/ClassLength
197
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.6.0.pre.1'
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.6.0.pre.1
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-13 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