hammer_cli 2.4.0 → 2.5.0

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: ef5d5eb556461a6873fe0b3b05bcc8a30aea17f88719b3c10c25106c73224884
4
- data.tar.gz: 564721c9765ccd22b82fee81eea83be8b29da7ee0e415fd492deece64ca55b53
3
+ metadata.gz: 8a632fb8b3ddc1914f0110af4371d152d31e0efe042453512c55dd1384b8bafc
4
+ data.tar.gz: 76029ef771f18e0096ffdc18f897b1758d09c58277065dce55907f625f13d77e
5
5
  SHA512:
6
- metadata.gz: efde2a000ba9e27da2a466496232399da3861bb69705631ca9113ecc88920cc0af9ff344536c858fe4fbb77e60fe886582919885983d03b4235da70b0e80a6dd
7
- data.tar.gz: a2673ec7bb6c5ed621c7a068e67962fec2c038f99b12abe1f0f19fa85fad3711598aaa3abf52e7896e72db938f74c7726b350e8bebcd5eaf04c6ef02806c96f5
6
+ metadata.gz: 6777ff43f35fb9b29332e3f02ed68320a5a0f526da5c1a0256f714223ceed72c6d09f3982d0df252be82e2e7ea754fd6105d202f68eebac030d9e6fc6a3db6b6
7
+ data.tar.gz: 0e7ddb3ea2aaf2080ab8b796c9eb0f68d747a0d290a57bb84e53386de86e17cb51dfbf266fccce3bee71c38123ce0aa67773aaca963fa8001840a56a8a03d467
data/doc/release_notes.md CHANGED
@@ -1,5 +1,10 @@
1
1
  Release notes
2
2
  =============
3
+ ### 2.5.0 (2021-05-04)
4
+ * Better family assignment for options, [#30996](http://projects.theforeman.org/issues/30996)
5
+ * Bump to 2.5.0-develop
6
+ * Right usage in help output for aliases, [#31563](http://projects.theforeman.org/issues/31563)
7
+
3
8
  ### 2.4.0 (2021-02-01)
4
9
  * Expand path for bash completion file, [#30639](http://projects.theforeman.org/issues/30639)
5
10
  * Remove release notes written twice
@@ -190,18 +190,9 @@ module HammerCLI
190
190
 
191
191
  option_builder.build(builder_params).each do |option|
192
192
  # skip switches that are already defined
193
- next if option.nil? or option.switches.any? {|s| find_option(s) }
194
-
195
- if option.respond_to?(:referenced_resource)
196
- # Collect options that don't have family, but related to this parent.
197
- children = find_options(
198
- referenced_resource: option.referenced_resource.to_s,
199
- aliased_resource: option.aliased_resource.to_s
200
- ).select { |o| o.family.nil? || o.family.head.nil? }
201
- children.each do |child|
202
- option.family.adopt(child) if option.family
203
- end
204
- end
193
+ next if option.nil? || option.switches.any? { |s| find_option(s) }
194
+
195
+ adjust_family(option) if option.respond_to?(:family)
205
196
  declared_options << option
206
197
  block ||= option.default_conversion_block
207
198
  define_accessors_for(option, &block)
@@ -411,6 +402,32 @@ module HammerCLI
411
402
 
412
403
  private
413
404
 
405
+ def self.adjust_family(option)
406
+ # Collect options that should share the same family
407
+ # If those options have family, adopt the current one
408
+ # Else adopt those options to the family of the current option
409
+ # NOTE: this shouldn't rewrite any options,
410
+ # although options from similar family could be adopted (appended)
411
+ options = find_options(
412
+ aliased_resource: option.aliased_resource.to_s
413
+ ).select { |o| o.family.nil? || o.family.formats.include?(option.value_formatter.class) }.group_by do |o|
414
+ next :to_skip if option.family.children.include?(o)
415
+ next :to_adopt if o.family.nil? || o.family.head.nil?
416
+ next :to_skip if o.family.children.include?(option)
417
+ # If both family heads handle the same switch
418
+ # then `option` is probably from similar family and can be adopted
419
+ next :adopt_by if option.family.head.nil? || o.family.head.handles?(option.family.head.long_switch)
420
+
421
+ :to_skip
422
+ end
423
+ options[:to_adopt]&.each do |child|
424
+ option.family&.adopt(child)
425
+ end
426
+ options[:adopt_by]&.map(&:family)&.uniq&.each do |family|
427
+ family.adopt(option)
428
+ end
429
+ end
430
+
414
431
  def self.inherited_output_definition
415
432
  od = nil
416
433
  if superclass.respond_to? :output_definition
@@ -5,7 +5,7 @@ module HammerCLI
5
5
  class OptionFamily
6
6
  attr_reader :children
7
7
 
8
- IDS_REGEX = /\s?([Ii][Dd][s]?)\W|([Ii][Dd][s]?\Z)/
8
+ IDS_REGEX = /(\A[Ii][Dd][s]?)|\s([Ii][Dd][s]?)\W|([Ii][Dd][s]?\Z)/
9
9
 
10
10
  def initialize(options = {})
11
11
  @all = []
@@ -13,26 +13,32 @@ module HammerCLI
13
13
  @options = options
14
14
  @creator = options[:creator] || Class.new(HammerCLI::Apipie::Command)
15
15
  @prefix = options[:prefix]
16
- @description = options[:description]
17
16
  @root = options[:root] || options[:aliased_resource] || options[:referenced_resource]
18
17
  end
19
18
 
20
19
  def description
21
20
  types = all.map(&:type).map { |s| s.split('_').last.to_s }
22
- .map(&:capitalize).join('/')
23
- @description ||= @parent.help[1].gsub(IDS_REGEX) { |w| w.gsub(/\w+/, types) }
21
+ .map(&:downcase).join('/')
22
+ parent_desc = @parent.help[1].gsub(IDS_REGEX) { |w| w.gsub(/\w+/, types) }
23
+ desc = parent_desc.strip.empty? ? @options[:description] : parent_desc
24
24
  if @options[:deprecation].class <= String
25
- format_deprecation_msg(@description, _('Deprecated: %{deprecated_msg}') % { deprecated_msg: @options[:deprecation] })
25
+ format_deprecation_msg(desc, _('Deprecated: %{deprecated_msg}') % { deprecated_msg: @options[:deprecation] })
26
26
  elsif @options[:deprecation].class <= Hash
27
27
  full_msg = @options[:deprecation].map do |flag, msg|
28
28
  _('%{flag} is deprecated: %{deprecated_msg}') % { flag: flag, deprecated_msg: msg }
29
29
  end.join(', ')
30
- format_deprecation_msg(@description, full_msg)
30
+ format_deprecation_msg(desc, full_msg)
31
31
  else
32
- @description
32
+ desc
33
33
  end
34
34
  end
35
35
 
36
+ def formats
37
+ return [@options[:format].class] if @options[:format]
38
+
39
+ all.map(&:value_formatter).map(&:class).uniq
40
+ end
41
+
36
42
  def switch
37
43
  return if @parent.nil? && @children.empty?
38
44
  return @parent.help_lhs.strip if @children.empty?
@@ -67,6 +73,9 @@ module HammerCLI
67
73
  end
68
74
 
69
75
  def adopt(child)
76
+ raise ArgumentError, 'Parent cannot be a child within the same family' if child == @parent
77
+ raise ArgumentError, 'Child is already in the family' if @children.include?(child)
78
+
70
79
  child.family = self
71
80
  @children << child
72
81
  end
@@ -103,9 +112,7 @@ module HammerCLI
103
112
  max_len.downto(0) do |curr_len|
104
113
  0.upto(max_len - curr_len) do |start|
105
114
  root = shortest[start, curr_len]
106
- if switches.all? { |switch| switch.include?(root) }
107
- return root[2..-1].chomp('-')
108
- end
115
+ return root[2..-1].chomp('-') if switches.all? { |switch| switch.include?(root) }
109
116
  end
110
117
  end
111
118
  end
@@ -97,7 +97,7 @@ module HammerCLI
97
97
  history.push(line)
98
98
 
99
99
  line = HammerCLI::CompleterLine.new(line)
100
- ShellMainCommand.run('', line, context) unless line.empty?
100
+ ShellMainCommand.run('hammer', line, context) unless line.empty?
101
101
  end
102
102
  rescue Interrupt; end
103
103
 
@@ -121,7 +121,7 @@ module HammerCLI
121
121
  bits = path.split(' ')
122
122
  parent_command = HammerCLI::MainCommand
123
123
  new_path = (bits[1..-1] || []).each_with_object([]) do |bit, names|
124
- subcommand = parent_command.find_subcommand(bit, fuzzy: false)
124
+ subcommand = parent_command.find_subcommand(bit)
125
125
  next if subcommand.nil?
126
126
 
127
127
  names << if subcommand.names.size > 1
@@ -1,5 +1,5 @@
1
1
  module HammerCLI
2
2
  def self.version
3
- @version ||= Gem::Version.new "2.4.0"
3
+ @version ||= Gem::Version.new "2.5.0"
4
4
  end
5
5
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/man/hammer.1.gz CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hammer_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Bačovský
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-02-01 00:00:00.000000000 Z
12
+ date: 2021-05-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: clamp
@@ -145,37 +145,37 @@ dependencies:
145
145
  version: 0.2.0
146
146
  description: 'Hammer cli provides universal extendable CLI interface for ruby apps
147
147
 
148
- '
148
+ '
149
149
  email: mbacovsk@redhat.com
150
150
  executables:
151
151
  - hammer
152
152
  - hammer-complete
153
153
  extensions: []
154
154
  extra_rdoc_files:
155
- - doc/commands_extension.md
156
- - doc/release_notes.md
157
- - doc/design.png
158
155
  - doc/commands_modification.md
159
- - doc/installation.md
160
- - doc/development_tips.md
161
- - doc/writing_a_plugin.md
162
- - doc/output.md
156
+ - doc/creating_apipie_commands.md
157
+ - doc/design.png
158
+ - doc/design.uml
163
159
  - doc/developer_docs.md
160
+ - doc/development_tips.md
161
+ - doc/help_modification.md
162
+ - doc/i18n.md
164
163
  - doc/installation_deb.md
165
- - doc/option_normalizers.md
166
- - doc/installation_rpm.md
167
164
  - doc/installation_gem.md
168
- - doc/help_modification.md
169
- - doc/creating_commands.md
170
- - doc/installation_source.md
171
165
  - doc/option_builders.md
172
- - doc/i18n.md
166
+ - doc/option_normalizers.md
167
+ - doc/output.md
173
168
  - doc/review_checklist.md
174
- - doc/creating_apipie_commands.md
175
- - doc/design.uml
169
+ - doc/writing_a_plugin.md
170
+ - doc/commands_extension.md
171
+ - doc/creating_commands.md
172
+ - doc/installation_rpm.md
173
+ - doc/installation_source.md
174
+ - doc/installation.md
175
+ - doc/release_notes.md
176
176
  - config/cli.modules.d/module_config_template.yml
177
- - config/cli_config.template.yml
178
177
  - config/hammer.completion
178
+ - config/cli_config.template.yml
179
179
  - README.md
180
180
  files:
181
181
  - LICENSE
@@ -399,70 +399,70 @@ signing_key:
399
399
  specification_version: 4
400
400
  summary: Universal command-line interface
401
401
  test_files:
402
- - test/unit/messages_test.rb
403
- - test/unit/exception_handler_test.rb
404
- - test/unit/modules_test.rb
405
- - test/unit/connection_test.rb
406
- - test/unit/completer_test.rb
407
- - test/unit/csv_parser_test.rb
408
- - test/unit/option_builder_test.rb
409
- - test/unit/test_helper.rb
410
- - test/unit/utils_test.rb
411
- - test/unit/apipie/command_test.rb
412
- - test/unit/apipie/option_builder_test.rb
413
- - test/unit/apipie/test_helper.rb
402
+ - test/functional/defaults_test.rb
403
+ - test/functional/help_test.rb
404
+ - test/functional/nil_values_test.rb
405
+ - test/functional/test_helper.rb
406
+ - test/test_helper.rb
414
407
  - test/unit/apipie/api_connection_test.rb
408
+ - test/unit/apipie/command_test.rb
415
409
  - test/unit/apipie/option_definition_test.rb
416
- - test/unit/command_extensions_test.rb
417
- - test/unit/main_test.rb
418
- - test/unit/options/processor_list_test.rb
419
- - test/unit/options/option_family_test.rb
420
- - test/unit/options/validators/dsl_test.rb
421
- - test/unit/options/sources/command_line_test.rb
422
- - test/unit/options/sources/saved_defaults_test.rb
423
- - test/unit/options/matcher_test.rb
424
- - test/unit/options/option_collector_test.rb
425
- - test/unit/options/normalizers_test.rb
426
- - test/unit/options/option_definition_test.rb
427
- - test/unit/settings_test.rb
428
- - test/unit/history_test.rb
410
+ - test/unit/apipie/test_helper.rb
411
+ - test/unit/apipie/option_builder_test.rb
412
+ - test/unit/bash_test.rb
413
+ - test/unit/ca_cert_manager_test.rb
414
+ - test/unit/completer_test.rb
415
+ - test/unit/connection_test.rb
416
+ - test/unit/csv_parser_test.rb
429
417
  - test/unit/defaults_test.rb
430
- - test/unit/logger_test.rb
431
- - test/unit/output/formatters_test.rb
432
- - test/unit/output/record_collection_test.rb
433
- - test/unit/output/dsl_test.rb
434
- - test/unit/output/definition_test.rb
435
- - test/unit/output/output_test.rb
436
- - test/unit/output/field_filter_test.rb
437
- - test/unit/output/fields_test.rb
438
- - test/unit/output/adapter/table_test.rb
439
- - test/unit/output/adapter/json_test.rb
440
- - test/unit/output/adapter/abstract_test.rb
441
- - test/unit/output/adapter/yaml_test.rb
442
- - test/unit/output/adapter/csv_test.rb
443
- - test/unit/output/adapter/base_test.rb
444
- - test/unit/abstract_test.rb
445
- - test/unit/i18n_test.rb
418
+ - test/unit/exception_handler_test.rb
446
419
  - test/unit/fixtures/apipie/architectures.json
447
420
  - test/unit/fixtures/apipie/documented.json
448
- - test/unit/fixtures/defaults/defaults_dashed.yml
449
- - test/unit/fixtures/defaults/defaults.yml
450
- - test/unit/fixtures/json_input/valid.json
451
- - test/unit/fixtures/json_input/invalid.json
452
421
  - test/unit/fixtures/certs/ca_cert.pem
453
422
  - test/unit/fixtures/certs/non_ca_cert.pem
454
- - test/unit/bash_test.rb
455
- - test/unit/help/definition/section_test.rb
456
- - test/unit/help/definition/list_test.rb
457
- - test/unit/help/definition/text_test.rb
423
+ - test/unit/fixtures/defaults/defaults.yml
424
+ - test/unit/fixtures/defaults/defaults_dashed.yml
425
+ - test/unit/fixtures/json_input/invalid.json
426
+ - test/unit/fixtures/json_input/valid.json
458
427
  - test/unit/help/definition/abstract_item_test.rb
428
+ - test/unit/help/definition/list_test.rb
459
429
  - test/unit/help/definition/note_test.rb
430
+ - test/unit/help/definition/section_test.rb
431
+ - test/unit/help/definition/text_test.rb
460
432
  - test/unit/help/definition_test.rb
461
- - test/unit/help/builder_test.rb
462
433
  - test/unit/help/text_builder_test.rb
463
- - test/unit/ca_cert_manager_test.rb
464
- - test/functional/help_test.rb
465
- - test/functional/test_helper.rb
466
- - test/functional/nil_values_test.rb
467
- - test/functional/defaults_test.rb
468
- - test/test_helper.rb
434
+ - test/unit/help/builder_test.rb
435
+ - test/unit/history_test.rb
436
+ - test/unit/i18n_test.rb
437
+ - test/unit/logger_test.rb
438
+ - test/unit/main_test.rb
439
+ - test/unit/messages_test.rb
440
+ - test/unit/modules_test.rb
441
+ - test/unit/option_builder_test.rb
442
+ - test/unit/options/matcher_test.rb
443
+ - test/unit/options/normalizers_test.rb
444
+ - test/unit/options/option_collector_test.rb
445
+ - test/unit/options/option_definition_test.rb
446
+ - test/unit/options/processor_list_test.rb
447
+ - test/unit/options/sources/command_line_test.rb
448
+ - test/unit/options/sources/saved_defaults_test.rb
449
+ - test/unit/options/validators/dsl_test.rb
450
+ - test/unit/options/option_family_test.rb
451
+ - test/unit/output/adapter/abstract_test.rb
452
+ - test/unit/output/adapter/base_test.rb
453
+ - test/unit/output/adapter/csv_test.rb
454
+ - test/unit/output/adapter/json_test.rb
455
+ - test/unit/output/adapter/table_test.rb
456
+ - test/unit/output/adapter/yaml_test.rb
457
+ - test/unit/output/dsl_test.rb
458
+ - test/unit/output/field_filter_test.rb
459
+ - test/unit/output/fields_test.rb
460
+ - test/unit/output/formatters_test.rb
461
+ - test/unit/output/output_test.rb
462
+ - test/unit/output/record_collection_test.rb
463
+ - test/unit/output/definition_test.rb
464
+ - test/unit/settings_test.rb
465
+ - test/unit/test_helper.rb
466
+ - test/unit/utils_test.rb
467
+ - test/unit/abstract_test.rb
468
+ - test/unit/command_extensions_test.rb