hammer_cli 2.2.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: d903c3dbbe33a2411dfd2e23b781609a40b39b4ed29066cabe35af22335042d5
4
- data.tar.gz: 25acdf29e7a071a945a4c7c2c4745083e0e11e7d12ce098c662054a7d87caeb1
3
+ metadata.gz: 8a632fb8b3ddc1914f0110af4371d152d31e0efe042453512c55dd1384b8bafc
4
+ data.tar.gz: 76029ef771f18e0096ffdc18f897b1758d09c58277065dce55907f625f13d77e
5
5
  SHA512:
6
- metadata.gz: 8a117c635359bc261f70cb67bf33fc2080f15b909981a98f87d7c64235a2ecf686bf1530b5293e60565e5e52cab2ed9bbf17f604816099ada8e11b11a5b7f064
7
- data.tar.gz: 3e296e36f46d6374fc1878a51447cd2fe820104fa5ba191c6bde91a62aff2fd7b76e12743d152ca0eb9457b541e38dd39351da138020501d286c3af071e33b39
6
+ metadata.gz: 6777ff43f35fb9b29332e3f02ed68320a5a0f526da5c1a0256f714223ceed72c6d09f3982d0df252be82e2e7ea754fd6105d202f68eebac030d9e6fc6a3db6b6
7
+ data.tar.gz: 0e7ddb3ea2aaf2080ab8b796c9eb0f68d747a0d290a57bb84e53386de86e17cb51dfbf266fccce3bee71c38123ce0aa67773aaca963fa8001840a56a8a03d467
data/bin/hammer-complete CHANGED
@@ -5,9 +5,7 @@ require 'English'
5
5
  $LOAD_PATH.unshift(File.join(@project_root, 'lib'))
6
6
  HAMMER = ENV['HAMMER'] || File.join(@project_root, 'bin/hammer')
7
7
 
8
- require 'yaml'
9
-
10
- completion_cache_file = ENV['HAMMER_COMPLETION_CACHE'] || '~/.cache/hammer_completion.yml'
8
+ completion_cache_file = ENV['HAMMER_COMPLETION_CACHE'] || '~/.cache/hammer_completion.json'
11
9
  completion_cache_file = File.expand_path(completion_cache_file)
12
10
 
13
11
  # build the cache if it does not exist
@@ -45,7 +45,7 @@
45
45
  #:log_pattern: '[%5l %d %c] %m'
46
46
 
47
47
  # Location of cache for bash completion
48
- :completion_cache_file: '~/.cache/hammer_completion.yml'
48
+ :completion_cache_file: '~/.cache/hammer_completion.json'
49
49
 
50
50
  # SSL auth options
51
51
  #:ssl:
data/doc/installation.md CHANGED
@@ -144,7 +144,7 @@ executable specified in `/etc/bash_completion.d/hammer`.
144
144
 
145
145
  Bash completion for hammer needs pre-built cache that holds description of
146
146
  all subcommands and its parameters. The cache is located by default in
147
- `~/.cache/hammer_completion.yml`. The location can be changed in hammer's
147
+ `~/.cache/hammer_completion.json`. The location can be changed in hammer's
148
148
  config file. The cache can be built manually with
149
149
  `hammer prebuild-bash-completion` or is built automatically when completion is
150
150
  used and the cache is missing (this may cause slight delay). The cache expires
@@ -8,6 +8,7 @@ Clone and install CLI core
8
8
  ```bash
9
9
  $ git clone https://github.com/theforeman/hammer-cli.git
10
10
  $ cd hammer-cli
11
+ $ bundle install
11
12
  $ rake install
12
13
  $ cd ..
13
14
  ```
@@ -17,6 +18,7 @@ clone plugin with foreman commands
17
18
  ```bash
18
19
  $ git clone https://github.com/theforeman/hammer-cli-foreman.git
19
20
  $ cd hammer-cli-foreman
21
+ $ bundle install
20
22
  $ rake install
21
23
  $ cd ..
22
24
  ```
@@ -25,7 +27,8 @@ and optionally other plugins.
25
27
 
26
28
 
27
29
  #### Step 2: enable and configure the plugins
28
- You'll have to copy configuration files to proper locations manually.
29
- Please check our [configuration instructions](installation.md#configuration)
30
+ - Add the plugin as a gem to `Gemfile.local.rb`
31
+ - Copy the configuration files to proper locations manually,
32
+ please check our [configuration instructions](installation.md#configuration)
30
33
  and see how to proceed.
31
34
 
data/doc/release_notes.md CHANGED
@@ -1,5 +1,22 @@
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
+
8
+ ### 2.4.0 (2021-02-01)
9
+ * Expand path for bash completion file, [#30639](http://projects.theforeman.org/issues/30639)
10
+ * Remove release notes written twice
11
+ * Bump to 2.4.0-develop
12
+
13
+ ### 2.3.0 (2020-11-03)
14
+ * Stop sending empty compute attrs param, [#30815](http://projects.theforeman.org/issues/30815)
15
+ * Make fuzzy search work in hammer shell ([PR #335](https://github.com/theforeman/hammer-cli/pull/335)), [#30747](http://projects.theforeman.org/issues/30747)
16
+ * Add details to installation from source doc ([PR #334](https://github.com/theforeman/hammer-cli/pull/334)), [#30666](http://projects.theforeman.org/issues/30666)
17
+ * Bump to 2.3.0-develop
18
+ * Bump to 2.2.0
19
+
3
20
  ### 2.2.0 (2020-08-11)
4
21
  * Update installation_rpm.md ([PR #333](https://github.com/theforeman/hammer-cli/pull/333))
5
22
  * Clean gem_release.ipynb up
@@ -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
@@ -10,11 +10,11 @@ module HammerCLI::Apipie
10
10
  opts = {}
11
11
 
12
12
  params.each do |p|
13
- if p.expected_type == :hash
13
+ if p.expected_type == :hash && !p.params.empty?
14
14
  opts[p.name] = method_options_for_params(p.params, options)
15
15
  else
16
16
  p_name = HammerCLI.option_accessor_name(p.name)
17
- if options.has_key?(p_name)
17
+ if options.key?(p_name)
18
18
  opts[p.name] = options[p_name]
19
19
  elsif respond_to?(p_name, true)
20
20
  opt = send(p_name)
@@ -3,10 +3,12 @@ module HammerCLI
3
3
  class PrebuildCompletionCommand < HammerCLI::AbstractCommand
4
4
  def execute
5
5
  map = HammerCLI::MainCommand.completion_map
6
- cache_file = HammerCLI::Settings.get(:completion_cache_file)
6
+ cache_file = File.expand_path(
7
+ HammerCLI::Settings.get(:completion_cache_file)
8
+ )
7
9
  cache_dir = File.dirname(cache_file)
8
10
  FileUtils.mkdir_p(cache_dir) unless File.directory?(cache_dir)
9
- File.write(File.expand_path(cache_file), map.to_json)
11
+ File.write(cache_file, map.to_json)
10
12
 
11
13
  HammerCLI::EX_OK
12
14
  end
@@ -61,25 +61,6 @@ module HammerCLI
61
61
  label = HighLine.color(label, :bold) if @richtext
62
62
  puts label
63
63
  end
64
-
65
- private
66
-
67
- def expand_invocation_path(path)
68
- bits = path.split(' ')
69
- parent_command = HammerCLI::MainCommand
70
- new_path = (bits[1..-1] || []).each_with_object([]) do |bit, names|
71
- subcommand = parent_command.find_subcommand(bit)
72
- next if subcommand.nil?
73
-
74
- names << if subcommand.names.size > 1
75
- "<#{subcommand.names.join('|')}>"
76
- else
77
- subcommand.names.first
78
- end
79
- parent_command = subcommand.subcommand_class
80
- end
81
- new_path.unshift(bits.first).join(' ')
82
- end
83
64
  end
84
65
  end
85
66
  end
@@ -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
@@ -67,7 +67,7 @@ module HammerCLI
67
67
  def self.default_settings
68
68
  {
69
69
  :use_defaults => true,
70
- :completion_cache_file => '~/.cache/hammer_completion.yml'
70
+ :completion_cache_file => '~/.cache/hammer_completion.json'
71
71
  }
72
72
  end
73
73
 
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  module HammerCLI
2
2
  def self.version
3
- @version ||= Gem::Version.new "2.2.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.2.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: 2020-08-11 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