hammer_cli 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hammer +5 -4
  3. data/config/cli_config.template.yml +9 -0
  4. data/doc/creating_commands.md +23 -8
  5. data/doc/release_notes.md +9 -0
  6. data/lib/hammer_cli.rb +1 -0
  7. data/lib/hammer_cli/abstract.rb +2 -2
  8. data/lib/hammer_cli/context.rb +3 -5
  9. data/lib/hammer_cli/exception_handler.rb +3 -3
  10. data/lib/hammer_cli/main.rb +6 -1
  11. data/lib/hammer_cli/output/adapter/abstract.rb +1 -0
  12. data/lib/hammer_cli/output/adapter/csv.rb +0 -9
  13. data/lib/hammer_cli/output/adapter/json.rb +1 -9
  14. data/lib/hammer_cli/output/adapter/table.rb +4 -2
  15. data/lib/hammer_cli/output/adapter/tree_structure.rb +36 -4
  16. data/lib/hammer_cli/output/adapter/yaml.rb +1 -9
  17. data/lib/hammer_cli/output/output.rb +22 -6
  18. data/lib/hammer_cli/output/record_collection.rb +2 -1
  19. data/lib/hammer_cli/utils.rb +25 -3
  20. data/lib/hammer_cli/verbosity.rb +5 -0
  21. data/lib/hammer_cli/version.rb +1 -1
  22. data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
  23. data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
  24. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  25. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  26. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  27. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  28. data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
  29. data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
  30. data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
  31. data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
  32. data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
  33. data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
  34. data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
  35. data/test/unit/apipie/command_test.rb +47 -0
  36. data/test/unit/apipie/test_helper.rb +4 -0
  37. data/test/unit/exception_handler_test.rb +1 -2
  38. data/test/unit/history_test.rb +1 -6
  39. data/test/unit/i18n_test.rb +6 -36
  40. data/test/unit/main_test.rb +8 -9
  41. data/test/unit/output/adapter/json_test.rb +59 -0
  42. data/test/unit/output/adapter/yaml_test.rb +59 -0
  43. data/test/unit/output/output_test.rb +173 -1
  44. data/test/unit/utils_test.rb +21 -22
  45. metadata +9 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb545eaee547129bde4d51c6ff709f7af30c61bd
4
- data.tar.gz: 23f8915e5e2c306a2e194ebd7d42162d2f183b95
3
+ metadata.gz: aaf3be9933ac2bf33cd6a7bd3cd0f3d8fe3bf157
4
+ data.tar.gz: 3fd10d78572c35d887f0edc9b46d4382e4454006
5
5
  SHA512:
6
- metadata.gz: 3c9f22f4c7b10e0282f96be42317f0ac2514dba8ad4c2881d46eedeb6ceb01361ba6139c57b51ab382ac255d6a5bc527bde0880ee06d332dc938b7f08317ce4d
7
- data.tar.gz: cba3583a4dff8bf01a9bf1835eb9393ea99eae965e3156a9bb14dafbb8412e49bd59f2b13b717a24453080ff3faeb2c8151f79a4c91e14f1124e9a0b92c1601d
6
+ metadata.gz: 3f18891b02bd45efcddf967b97bc74b58a277c28cfa8d0d22e4e339ecb9f876565e111cdc9bf670d4f122ae68cf858f398a067c75daf147b694de98573947b62
7
+ data.tar.gz: e9dee591bf84da08b467a36f155c97068951d9937e128fbb2d7b42d97af1fdd7f03040321daf5457472d66ddba55fb8677981e6180695ee130bfb1f20c32f8ce
data/bin/hammer CHANGED
@@ -12,7 +12,8 @@ require 'hammer_cli/options/normalizers'
12
12
  # Create fake command instance to use some global args before we start.
13
13
  # Option descriptions are never displayed and thus do not require translation.
14
14
  class PreParser < Clamp::Command
15
- option ["-v", "--verbose"], :flag, "be verbose"
15
+ option ['-v', '--[no-]verbose'], :flag, _('Be verbose (or not). True by default')
16
+ option ['-q', '--quiet'], :flag, _('Completely silent')
16
17
  option ["-d", "--debug"], :flag, "show debugging output"
17
18
  option ["-c", "--config"], "CFG_FILE", "path to custom config file" do |path|
18
19
  File.expand_path path
@@ -80,7 +81,7 @@ HammerCLI::Settings.load({
80
81
  :password => preparser.password,
81
82
  :host => preparser.server,
82
83
  :interactive => preparser.interactive,
83
- :verbose => preparser.verbose? || preparser.debug?,
84
+ :debug => preparser.debug?,
84
85
  :no_headers => preparser.no_headers?,
85
86
  :reload_cache => preparser.reload_cache?,
86
87
  :verify_ssl => preparser.verify_ssl,
@@ -99,10 +100,10 @@ end
99
100
  require 'hammer_cli/logger'
100
101
  logger = Logging.logger['Init']
101
102
 
102
- if preparser.verbose? || preparser.debug?
103
+ if preparser.debug?
103
104
  root_logger = Logging.logger.root
104
105
  root_logger.appenders = root_logger.appenders << ::Logging.appenders.stderr(:layout => HammerCLI::Logger::COLOR_LAYOUT)
105
- root_logger.level = 'debug' if preparser.debug?
106
+ root_logger.level = 'debug'
106
107
  end
107
108
 
108
109
  require 'hammer_cli/version'
@@ -10,6 +10,9 @@
10
10
  #:mark_translated: false
11
11
  # Hide headers from output of list actions
12
12
  # :no_headers: true
13
+ # Choose capitalization for JSON/YAML output.
14
+ # One of: 'downcase', 'capitalize', 'upcase'
15
+ # :capitalization: 'downcase'
13
16
 
14
17
  # Enable/disable color output of logger in Clamp commands
15
18
  :watch_plain: false
@@ -23,6 +26,12 @@
23
26
  # Logging level. One of debug, info, warning, error, fatal
24
27
  :log_level: 'error'
25
28
 
29
+ # Verbosity of the commands. Possible values:
30
+ # 0 - completely silent, errors to stderr. Equals to --quiet.
31
+ # 1 - data, interactive I/O. Equals to --no-verbose.
32
+ # 2 - data, messages, interactive I/O, progress bars. Equals to --verbose.
33
+ :verbosity: 2
34
+
26
35
  #:log_owner: 'foreman'
27
36
  #:log_group: 'foreman'
28
37
 
@@ -244,18 +244,18 @@ option "--attributes", "ATTRIBUTES", "Values of various attributes",
244
244
 
245
245
  ### Advanced option evaluation
246
246
 
247
- Sometimes it is necessary to tune the option values based on other parameters given on CLI.
247
+ Sometimes it is necessary to tune the option values based on other parameters given on CLI.
248
248
  An example could be setting default values based on other options, values lookup in a DB, etc.
249
249
  The right place for this are `OptionSources`. Abstract Hammer command uses two default option sources -
250
- `HammerCLI::Options::Sources::CommandLine` responsible for intial population of the options,
250
+ `HammerCLI::Options::Sources::CommandLine` responsible for intial population of the options,
251
251
  `HammerCLI::Options::Sources::SavedDefaults` adding defaults managed by the `defaults` command.
252
252
 
253
- By overriding `option_sources` method in a command it is possible to add custom option sources
254
- for various tasks to the list. The option sources are evaluated one by one each being given output
255
- of the previous one as its input so the order in which the sources are listed matters.
253
+ By overriding `option_sources` method in a command it is possible to add custom option sources
254
+ for various tasks to the list. The option sources are evaluated one by one each being given output
255
+ of the previous one as its input so the order in which the sources are listed matters.
256
256
 
257
- Option sources are collected only once per command call. The collection is triggered by first call
258
- to the `options` or `all_options` method, but at latest right after the option validation
257
+ Option sources are collected only once per command call. The collection is triggered by first call
258
+ to the `options` or `all_options` method, but at latest right after the option validation
259
259
  (before the command's `execute` method is invoked). The order is as follows:
260
260
  1. parse
261
261
  1. option normalization
@@ -545,6 +545,22 @@ def adapter
545
545
  end
546
546
  ```
547
547
 
548
+ #### Verbosity
549
+ Currently Hammer [defines](https://github.com/theforeman/hammer-cli/blob/master/lib/hammer_cli/verbosity.rb) three basic verbose modes:
550
+ * __QUIET__ - Prints nothing
551
+ * __UNIX__ - Prints data only
552
+ * __VERBOSE__ - Prints data and other messages
553
+
554
+ By default Hammer works in `VERBOSE` mode, but it can be changed with specific option (see `hammer --help`) or in the configuration file.
555
+
556
+ If you want to force some messages to be printed with `print_message` in `UNIX` mode for example, you can specify `verbosity` of this message:
557
+ ```ruby
558
+ class MyCommand < HammerCLI::Apipie::Command
559
+ def execute
560
+ print_message("Hello, %{name}!", { name: 'Jason' }, verbosity: HammerCLI::V_UNIX)
561
+ end
562
+ end
563
+ ```
548
564
 
549
565
  Other useful command features
550
566
  -----------------------------
@@ -631,4 +647,3 @@ The best practice is to place module's configuration into a separate file named
631
647
  the module. In this example it would be `~/.hammer/cli.modules.d/hello_world.yml`.
632
648
 
633
649
  Read more about configuration locations in [the settings howto](installation.md#configuration).
634
-
@@ -1,5 +1,14 @@
1
1
  Release notes
2
2
  =============
3
+ ### 0.14.0 (2018-10-24)
4
+ * Correct the gemspec ([PR #286](https://github.com/theforeman/hammer-cli/pull/286))
5
+ * Use the tty for the interactive output ([PR #289](https://github.com/theforeman/hammer-cli/pull/289)) ([#6935](http://projects.theforeman.org/issues/6935))
6
+ * Remove legacy code for ruby < 2.0 ([#21359](http://projects.theforeman.org/issues/21359))
7
+ * Verbose mode does not work and is inconsistent ([#14725](http://projects.theforeman.org/issues/14725))
8
+ * Enable formatters in json structured output ([PR #288](https://github.com/theforeman/hammer-cli/pull/288)) ([#24980](http://projects.theforeman.org/issues/24980))
9
+ * Hammer JSON output uses inconsistent capitalization ([#17010](http://projects.theforeman.org/issues/17010))
10
+ * Bump clamp dep to >=1.1 ([PR #282](https://github.com/theforeman/hammer-cli/pull/282))
11
+
3
12
  ### 0.14.0 (2018-08-27)
4
13
  * Restore help building ([PR #280](https://github.com/theforeman/hammer-cli/pull/280)) ([#24488](http://projects.theforeman.org/issues/24488))
5
14
  * Shouldn't translate the bool values in description ([#21381](http://projects.theforeman.org/issues/21381))
@@ -1,4 +1,5 @@
1
1
  require 'hammer_cli/i18n'
2
+ require 'hammer_cli/verbosity'
2
3
  require 'hammer_cli/exceptions'
3
4
  require 'hammer_cli/utils'
4
5
  require 'hammer_cli/version'
@@ -165,8 +165,8 @@ module HammerCLI
165
165
  output.print_collection(definition, collection)
166
166
  end
167
167
 
168
- def print_message(msg, msg_params={})
169
- output.print_message(msg, msg_params)
168
+ def print_message(msg, msg_params = {}, options = {})
169
+ output.print_message(msg, msg_params, options)
170
170
  end
171
171
 
172
172
  def self.logger(name=self)
@@ -1,16 +1,14 @@
1
1
  require 'hammer_cli/defaults'
2
2
 
3
3
  module HammerCLI
4
-
5
4
  def self.context
6
5
  @context ||= {
7
6
  :defaults => HammerCLI.defaults,
8
7
  :is_tty? => HammerCLI.tty?,
9
8
  :api_connection => HammerCLI::Connection.new(Logging.logger['Connection']),
10
- :no_headers => HammerCLI::Settings.get(:ui, :no_headers)
9
+ :no_headers => HammerCLI::Settings.get(:ui, :no_headers),
10
+ :capitalization => HammerCLI.capitalization,
11
+ :verbosity => (HammerCLI::Settings.get(:verbosity) || HammerCLI::V_VERBOSE).to_i
11
12
  }
12
13
  end
13
-
14
14
  end
15
-
16
-
@@ -49,8 +49,8 @@ module HammerCLI
49
49
  end
50
50
  end
51
51
 
52
- def print_message(msg)
53
- output.print_message(msg)
52
+ def print_message(msg, options = {})
53
+ output.print_message(msg, nil, options)
54
54
  end
55
55
 
56
56
  def log_full_error(e, message = e.message)
@@ -75,7 +75,7 @@ module HammerCLI
75
75
  end
76
76
 
77
77
  def handle_help_wanted(e)
78
- print_message e.command.help
78
+ print_message e.command.help, verbosity: HammerCLI::V_QUIET
79
79
  HammerCLI::EX_OK
80
80
  end
81
81
 
@@ -4,7 +4,12 @@ module HammerCLI
4
4
 
5
5
  class MainCommand < AbstractCommand
6
6
 
7
- option ["-v", "--verbose"], :flag, _("Be verbose"), :context_target => :verbose
7
+ option ['-v', '--[no-]verbose'], :flag, _('Be verbose (or not). True by default') do |value|
8
+ context[:verbosity] = value == true ? HammerCLI::V_VERBOSE : HammerCLI::V_UNIX
9
+ end
10
+ option ['-q', '--quiet'], :flag, _('Completely silent') do
11
+ context[:verbosity] = HammerCLI::V_QUIET
12
+ end
8
13
  option ["-d", "--debug"], :flag, _("Show debugging output"), :context_target => :debug
9
14
  option ["-r", "--reload-cache"], :flag, _("Force reload of Apipie cache")
10
15
 
@@ -7,6 +7,7 @@ module HammerCLI::Output::Adapter
7
7
  end
8
8
 
9
9
  def initialize(context={}, formatters={})
10
+ context[:verbosity] ||= HammerCLI::V_VERBOSE
10
11
  @context = context
11
12
  @formatters = HammerCLI::Output::Formatters::FormatterLibrary.new(filter_formatters(formatters))
12
13
  @paginate_by_default = true
@@ -1,13 +1,4 @@
1
1
  require 'csv'
2
- if CSV.const_defined? :Reader
3
- # Ruby 1.8 compatible
4
- require 'fastercsv'
5
- Object.send(:remove_const, :CSV)
6
- CSV = FasterCSV
7
- else
8
- # CSV is now FasterCSV in ruby 1.9
9
- end
10
-
11
2
  require File.join(File.dirname(__FILE__), 'wrapper_formatter')
12
3
 
13
4
  module HammerCLI::Output::Adapter
@@ -12,15 +12,7 @@ module HammerCLI::Output::Adapter
12
12
  end
13
13
 
14
14
  def print_message(msg, msg_params={})
15
- id = msg_params["id"] || msg_params[:id]
16
- name = msg_params["name"] || msg_params[:name]
17
-
18
- data = {
19
- :message => msg.format(msg_params)
20
- }
21
- data[:id] = id unless id.nil?
22
- data[:name] = name unless name.nil?
23
-
15
+ data = prepare_message(msg, msg_params)
24
16
  puts JSON.pretty_generate(data)
25
17
  end
26
18
 
@@ -53,8 +53,10 @@ module HammerCLI::Output::Adapter
53
53
  # and there is no --no-headers option
54
54
  output_stream.puts line unless formatted_collection.empty? || @context[:no_headers]
55
55
 
56
- if collection.respond_to?(:meta) && collection.meta.pagination_set? && collection.count < collection.meta.subtotal
57
- pages = (collection.meta.subtotal.to_f/collection.meta.per_page).ceil
56
+ if @context[:verbosity] >= collection.meta.pagination_verbosity &&
57
+ collection.respond_to?(:meta) && collection.meta.pagination_set? &&
58
+ collection.count < collection.meta.subtotal
59
+ pages = (collection.meta.subtotal.to_f / collection.meta.per_page).ceil
58
60
  puts _("Page %{page} of %{total} (use --page and --per-page for navigation).") % {:page => collection.meta.page, :total => pages}
59
61
  end
60
62
  end
@@ -6,12 +6,30 @@ module HammerCLI::Output::Adapter
6
6
  @paginate_by_default = false
7
7
  end
8
8
 
9
+ def tags
10
+ [
11
+ :data
12
+ ]
13
+ end
14
+
9
15
  def prepare_collection(fields, collection)
10
16
  collection.map do |element|
11
17
  render_fields(fields, element)
12
18
  end
13
19
  end
14
20
 
21
+ def prepare_message(msg, msg_params = {})
22
+ id = msg_params['id'] || msg_params[:id]
23
+ name = msg_params['name'] || msg_params[:name]
24
+
25
+ data = {
26
+ capitalize(:message) => msg.format(msg_params)
27
+ }
28
+ data[capitalize(:id)] = id unless id.nil?
29
+ data[capitalize(:name)] = name unless name.nil?
30
+ data
31
+ end
32
+
15
33
  protected
16
34
 
17
35
  def field_filter
@@ -26,7 +44,7 @@ module HammerCLI::Output::Adapter
26
44
  fields.reduce({}) do |hash, field|
27
45
  field_data = data_for_field(field, data)
28
46
  next unless field.display?(field_data)
29
- hash.update(field.label => render_field(field, field_data))
47
+ hash.update(capitalize(field.label) => render_field(field, field_data))
30
48
  end
31
49
  end
32
50
 
@@ -38,15 +56,24 @@ module HammerCLI::Output::Adapter
38
56
  end
39
57
  render_data(field, map_data(fields_data))
40
58
  else
41
- data
59
+ formatter = @formatters.formatter_for_type(field.class)
60
+ parameters = field.parameters
61
+ parameters[:context] = @context
62
+ if formatter
63
+ data = formatter.format(data, field.parameters)
64
+ end
65
+
66
+ return data unless data.is_a?(Hash)
67
+ data.transform_keys { |key| capitalize(key) }
42
68
  end
43
69
  end
44
70
 
45
71
  def render_data(field, data)
72
+ data = data.map! { |d| d.transform_keys { |key| capitalize(key) } if d.is_a?(Hash) }
46
73
  if field.is_a?(Fields::Collection)
47
- if(field.parameters[:numbered])
74
+ if field.parameters[:numbered]
48
75
  numbered_data(data)
49
- else # necislovana kolekce je pole
76
+ else
50
77
  data
51
78
  end
52
79
  else
@@ -69,5 +96,10 @@ module HammerCLI::Output::Adapter
69
96
  end
70
97
  end
71
98
 
99
+ def capitalize(string)
100
+ capitalization = @context[:capitalization]
101
+ return string if capitalization.nil?
102
+ string.send(@context[:capitalization]) unless string.nil?
103
+ end
72
104
  end
73
105
  end
@@ -12,15 +12,7 @@ module HammerCLI::Output::Adapter
12
12
  end
13
13
 
14
14
  def print_message(msg, msg_params={})
15
- id = msg_params["id"] || msg_params[:id]
16
- name = msg_params["name"] || msg_params[:name]
17
-
18
- data = {
19
- :message => msg.format(msg_params)
20
- }
21
- data[:id] = id unless id.nil?
22
- data[:name] = name unless name.nil?
23
-
15
+ data = prepare_message(msg, msg_params)
24
16
  puts YAML.dump(data)
25
17
  end
26
18
 
@@ -8,29 +8,30 @@ module HammerCLI::Output
8
8
  class Output
9
9
 
10
10
  def initialize(context={}, options={})
11
+ context[:verbosity] ||= HammerCLI::V_VERBOSE
11
12
  self.context = context
12
13
  self.default_adapter = options[:default_adapter]
13
14
  end
14
15
 
15
16
  attr_accessor :default_adapter
16
17
 
17
- def print_message(msg, msg_params={})
18
- adapter.print_message(msg.to_s, msg_params)
18
+ def print_message(msg, msg_params = {}, options = {})
19
+ adapter.print_message(msg.to_s, msg_params) if appropriate_verbosity?(:message, options)
19
20
  end
20
21
 
21
- def print_error(msg, details=nil, msg_params={})
22
- adapter.print_error(msg.to_s, details, msg_params)
22
+ def print_error(msg, details=nil, msg_params = {}, options = {})
23
+ adapter.print_error(msg.to_s, details, msg_params) if appropriate_verbosity?(:error, options)
23
24
  end
24
25
 
25
26
  def print_record(definition, record)
26
- adapter.print_record(definition.fields, record)
27
+ adapter.print_record(definition.fields, record) if appropriate_verbosity?(:record)
27
28
  end
28
29
 
29
30
  def print_collection(definition, collection)
30
31
  unless collection.class <= HammerCLI::Output::RecordCollection
31
32
  collection = HammerCLI::Output::RecordCollection.new([collection].flatten(1))
32
33
  end
33
- adapter.print_collection(definition.fields, collection)
34
+ adapter.print_collection(definition.fields, collection) if appropriate_verbosity?(:collection)
34
35
  end
35
36
 
36
37
  def adapter
@@ -66,6 +67,21 @@ module HammerCLI::Output
66
67
  end
67
68
  end
68
69
 
70
+ protected
71
+
72
+ def appropriate_verbosity?(msg_type, options = {})
73
+ default = case msg_type
74
+ when :message
75
+ HammerCLI::V_VERBOSE
76
+ when :error
77
+ HammerCLI::V_QUIET
78
+ when :record, :collection
79
+ HammerCLI::V_UNIX
80
+ end
81
+ msg_verbosity = options[:verbosity] || default
82
+ context[:verbosity] >= msg_verbosity
83
+ end
84
+
69
85
  private
70
86
 
71
87
  attr_accessor :context
@@ -3,7 +3,7 @@ module HammerCLI::Output
3
3
 
4
4
  class MetaData
5
5
 
6
- attr_accessor :total, :subtotal, :page, :per_page, :search, :sort_by, :sort_order
6
+ attr_accessor :total, :subtotal, :page, :per_page, :search, :sort_by, :sort_order, :pagination_verbosity
7
7
 
8
8
  def initialize(options={})
9
9
  @total = options[:total].to_i if options[:total]
@@ -13,6 +13,7 @@ module HammerCLI::Output
13
13
  @search = options[:search]
14
14
  @sort_by = options[:sort_by]
15
15
  @sort_order = options[:sort_order]
16
+ @pagination_verbosity = options[:pagination_verbosity] || HammerCLI::V_VERBOSE
16
17
  end
17
18
 
18
19
  def pagination_set?
@@ -1,7 +1,6 @@
1
+ require 'highline'
1
2
 
2
3
  class String
3
-
4
- # string formatting for ruby 1.8
5
4
  def format(params)
6
5
  if params.is_a? Hash
7
6
  array_params = self.scan(/%[<{]([^>}]*)[>}]/).collect do |name|
@@ -42,6 +41,18 @@ class String
42
41
 
43
42
  end
44
43
 
44
+ class Hash
45
+ # for ruby < 2.5.0
46
+ def transform_keys
47
+ result = {}
48
+ each do |key, value|
49
+ new_key = yield key
50
+ result[new_key] = value
51
+ end
52
+ result
53
+ end
54
+ end
55
+
45
56
  module HammerCLI
46
57
 
47
58
  def self.tty?
@@ -49,7 +60,6 @@ module HammerCLI
49
60
  end
50
61
 
51
62
  def self.interactive?
52
- return false unless tty?
53
63
  return HammerCLI::Settings.get(:_params, :interactive) unless HammerCLI::Settings.get(:_params, :interactive).nil?
54
64
  HammerCLI::Settings.get(:ui, :interactive) != false
55
65
  end
@@ -62,4 +72,16 @@ module HammerCLI
62
72
  path
63
73
  end
64
74
 
75
+ def self.capitalization
76
+ supported = %w[downcase capitalize upcase]
77
+ capitalization = HammerCLI::Settings.get(:ui, :capitalization).to_s
78
+ return nil if capitalization.empty?
79
+ return capitalization if supported.include?(capitalization)
80
+ warn _("Cannot use such capitalization. Try one of %s.") % supported.join(', ')
81
+ nil
82
+ end
83
+
84
+ def self.interactive_output
85
+ @interactive_output ||= HighLine.new($stdin, IO.new(IO.sysopen('/dev/tty', 'w'), 'w'))
86
+ end
65
87
  end
@@ -0,0 +1,5 @@
1
+ module HammerCLI
2
+ V_QUIET = 0
3
+ V_UNIX = 1
4
+ V_VERBOSE = 2
5
+ end
@@ -1,5 +1,5 @@
1
1
  module HammerCLI
2
2
  def self.version
3
- @version ||= Gem::Version.new '0.14.0'
3
+ @version ||= Gem::Version.new '0.15.0'
4
4
  end
5
5
  end
@@ -128,4 +128,51 @@ describe HammerCLI::Apipie::Command do
128
128
 
129
129
  end
130
130
 
131
+ context 'verbosity' do
132
+ class MessagesCommand < HammerCLI::Apipie::Command
133
+ def execute
134
+ messages = %w[quiet unix verbose very_verbose]
135
+ print_message(messages[0], {}, verbosity: HammerCLI::V_QUIET)
136
+ print_message(messages[1], {}, verbosity: HammerCLI::V_UNIX)
137
+ print_message(messages[2], {}, verbosity: HammerCLI::V_VERBOSE)
138
+ print_message(messages[3], {}, verbosity: HammerCLI::V_VERBOSE + 1)
139
+ HammerCLI::EX_OK
140
+ end
141
+ end
142
+
143
+ let(:messages) { %w[quiet unix verbose very_verbose] }
144
+
145
+ it 'should print quiet messages only when hammer verbosity level is V_QUIET' do
146
+ expected_messages = [
147
+ messages[0],
148
+ ''
149
+ ].join("\n")
150
+ expected_result = success_result(expected_messages)
151
+ result = run_cmd([], { :verbosity => HammerCLI::V_QUIET }, MessagesCommand)
152
+ assert_cmd(expected_result, result)
153
+ end
154
+
155
+ it 'should print quiet + no-verbose messages only when hammer verbosity level is V_UNIX' do
156
+ expected_messages = [
157
+ messages[0],
158
+ messages[1],
159
+ ''
160
+ ].join("\n")
161
+ expected_result = success_result(expected_messages)
162
+ result = run_cmd([], { :verbosity => HammerCLI::V_UNIX }, MessagesCommand)
163
+ assert_cmd(expected_result, result)
164
+ end
165
+
166
+ it 'should print quiet + no-verbose + verbose messages only when hammer verbosity level is V_VERBOSE' do
167
+ expected_messages = [
168
+ messages[0],
169
+ messages[1],
170
+ messages[2],
171
+ ''
172
+ ].join("\n")
173
+ expected_result = success_result(expected_messages)
174
+ result = run_cmd([], { :verbosity => HammerCLI::V_VERBOSE }, MessagesCommand)
175
+ assert_cmd(expected_result, result)
176
+ end
177
+ end
131
178
  end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+
3
+ require 'hammer_cli/testing/command_assertions'
4
+ require 'hammer_cli/testing/output_matchers'
@@ -30,7 +30,7 @@ describe HammerCLI::ExceptionHandler do
30
30
  end
31
31
 
32
32
  it "should handle help request" do
33
- output.expects(:print_message).with(cmd.help)
33
+ output.expects(:print_message).with(cmd.help, nil, verbosity: HammerCLI::V_QUIET)
34
34
  handler.handle_exception(Clamp::HelpWanted.new(cmd), :heading => heading)
35
35
 
36
36
  end
@@ -56,4 +56,3 @@ describe HammerCLI::ExceptionHandler do
56
56
  end
57
57
 
58
58
  end
59
-
@@ -1,12 +1,8 @@
1
1
  require 'tempfile'
2
2
 
3
3
  describe HammerCLI::ShellHistory do
4
-
5
4
  before :each do
6
- # Readline::HISOTRY does not implement #clear in Ruby 1.8
7
- while not Readline::HISTORY.empty?
8
- Readline::HISTORY.pop
9
- end
5
+ Readline::HISTORY.clear
10
6
  end
11
7
 
12
8
  let :history_file do
@@ -68,4 +64,3 @@ describe HammerCLI::ShellHistory do
68
64
  end
69
65
 
70
66
  end
71
-
@@ -40,52 +40,23 @@ describe HammerCLI::I18n do
40
40
  let(:domain2) { TestLocaleDomain.new('domain2', true) }
41
41
  let(:unavailable_domain) { TestLocaleDomain.new('domain3', false) }
42
42
 
43
- # skip the tests on older versions of fast_gettext (ruby 2.0)
44
- if FastGettext::VERSION >= '1.2.0'
45
- describe "with fast_gettext >= 1.2.0" do
46
- it "creates base merge repository" do
47
- HammerCLI::I18n.translation_repository.class.must_equal FastGettext::TranslationRepository::Merge
48
- end
49
-
50
- it "registers available domains at gettext" do
51
- repo = mock
52
- FastGettext::TranslationRepository.expects(:build).with(domain1.domain_name,
53
- :path => domain1.locale_dir,
54
- :type => domain1.type,
55
- :report_warning => false).returns(repo)
56
-
57
- HammerCLI::I18n.translation_repository.expects(:add_repo).with(repo)
58
- HammerCLI::I18n.add_domain(domain1)
59
- end
60
-
61
- it "skips registering domains that are not available" do
62
- HammerCLI::I18n.add_domain(domain1)
63
- HammerCLI::I18n.add_domain(domain2)
64
- HammerCLI::I18n.add_domain(unavailable_domain)
65
- HammerCLI::I18n.domains.must_equal [domain1, domain2]
66
- end
67
- end
68
- end
69
-
70
- describe "with fast_gettext < 1.2.0" do
71
- let(:fast_gettext_version) { '1.1.0' }
72
-
73
- it "creates base chain repository" do
74
- HammerCLI::I18n.translation_repository.class.must_equal FastGettext::TranslationRepository::Chain
43
+ describe 'with fast_gettext >= 1.2.0' do
44
+ it 'creates base merge repository' do
45
+ HammerCLI::I18n.translation_repository.class.must_equal FastGettext::TranslationRepository::Merge
75
46
  end
76
47
 
77
- it "registers available domains at gettext" do
48
+ it 'registers available domains at gettext' do
78
49
  repo = mock
79
50
  FastGettext::TranslationRepository.expects(:build).with(domain1.domain_name,
80
51
  :path => domain1.locale_dir,
81
52
  :type => domain1.type,
82
53
  :report_warning => false).returns(repo)
83
54
 
84
- HammerCLI::I18n.translation_repository.chain.expects(:<<).with(repo)
55
+ HammerCLI::I18n.translation_repository.expects(:add_repo).with(repo)
85
56
  HammerCLI::I18n.add_domain(domain1)
86
57
  end
87
58
 
88
- it "skips registering domains that are not available" do
59
+ it 'skips registering domains that are not available' do
89
60
  HammerCLI::I18n.add_domain(domain1)
90
61
  HammerCLI::I18n.add_domain(domain2)
91
62
  HammerCLI::I18n.add_domain(unavailable_domain)
@@ -93,4 +64,3 @@ describe HammerCLI::I18n do
93
64
  end
94
65
  end
95
66
  end
96
-
@@ -41,16 +41,15 @@ describe HammerCLI::MainCommand do
41
41
  end
42
42
 
43
43
 
44
- describe "verbose" do
45
-
46
- it "stores into context" do
47
- cmd.run(["-v"])
48
- context[:verbose].must_equal true
44
+ describe 'verbose' do
45
+ it 'stores verbosity level into context' do
46
+ cmd.run(['-v'])
47
+ context[:verbosity].must_equal HammerCLI::V_VERBOSE
48
+ cmd.run(['--no-verbose'])
49
+ context[:verbosity].must_equal HammerCLI::V_UNIX
50
+ cmd.run(['--quiet'])
51
+ context[:verbosity].must_equal HammerCLI::V_QUIET
49
52
  end
50
-
51
53
  end
52
-
53
54
  end
54
-
55
55
  end
56
-
@@ -245,6 +245,65 @@ describe HammerCLI::Output::Adapter::Json do
245
245
  proc { adapter.print_collection(fields, data) }.must_output(expected_output)
246
246
  end
247
247
 
248
+ context 'capitalization' do
249
+ let(:fields) { [name, surname] }
250
+ let(:raw_hash) { { 'Name' => 'John', 'Surname' => 'Doe' } }
251
+ let(:settings) { HammerCLI::Settings }
252
+ let(:context) { { :capitalization => HammerCLI.capitalization } }
253
+
254
+ it 'should respect selected downcase capitalization' do
255
+ settings.load({ :ui => { :capitalization => :downcase } })
256
+ hash = [raw_hash.transform_keys(&:downcase)]
257
+ expected_output = JSON.pretty_generate(hash) + "\n"
258
+ out, = capture_io do
259
+ adapter.print_collection(fields, data)
260
+ end
261
+ out.must_equal(expected_output)
262
+ end
263
+
264
+ it 'should respect selected capitalize capitalization' do
265
+ settings.load({ :ui => { :capitalization => :capitalize } })
266
+ hash = [raw_hash.transform_keys(&:capitalize)]
267
+ expected_output = JSON.pretty_generate(hash) + "\n"
268
+ out, = capture_io do
269
+ adapter.print_collection(fields, data)
270
+ end
271
+ out.must_equal(expected_output)
272
+ end
273
+
274
+ it 'should respect selected upcase capitalization' do
275
+ settings.load({ :ui => { :capitalization => :upcase } })
276
+ hash = [raw_hash.transform_keys(&:upcase)]
277
+ expected_output = JSON.pretty_generate(hash) + "\n"
278
+ out, = capture_io do
279
+ adapter.print_collection(fields, data)
280
+ end
281
+ out.must_equal(expected_output)
282
+ end
283
+
284
+ it 'should print a warn for not supported capitalization' do
285
+ settings.load({ :ui => { :capitalization => :unsupported } })
286
+ hash = [raw_hash]
287
+ expected_error = "Cannot use such capitalization. Try one of downcase, capitalize, upcase.\n"
288
+ expected_output = JSON.pretty_generate(hash) + "\n"
289
+ out, err = capture_io do
290
+ adapter.print_collection(fields, data)
291
+ end
292
+ out.must_equal(expected_output)
293
+ err.must_equal(expected_error)
294
+ end
295
+
296
+ it "shouldn't change capitalization if wasn't selected" do
297
+ settings.load({ :ui => { :capitalization => nil } })
298
+ hash = [raw_hash]
299
+ expected_output = JSON.pretty_generate(hash) + "\n"
300
+ out, = capture_io do
301
+ adapter.print_collection(fields, data)
302
+ end
303
+ out.must_equal(expected_output)
304
+ end
305
+ end
306
+
248
307
  context "show ids" do
249
308
 
250
309
  let(:context) { {:show_ids => true} }
@@ -242,6 +242,65 @@ describe HammerCLI::Output::Adapter::Yaml do
242
242
  proc { adapter.print_collection(fields, data) }.must_output(expected_output)
243
243
  end
244
244
 
245
+ context 'capitalization' do
246
+ let(:fields) { [name, surname] }
247
+ let(:raw_hash) { { 'Name' => 'John', 'Surname' => 'Doe' } }
248
+ let(:settings) { HammerCLI::Settings }
249
+ let(:context) { { :capitalization => HammerCLI.capitalization } }
250
+
251
+ it 'should respect selected downcase capitalization' do
252
+ settings.load({ :ui => { :capitalization => :downcase } })
253
+ hash = [raw_hash.transform_keys(&:downcase)]
254
+ expected_output = YAML.dump(hash)
255
+ out, = capture_io do
256
+ adapter.print_collection(fields, data)
257
+ end
258
+ out.must_equal(expected_output)
259
+ end
260
+
261
+ it 'should respect selected capitalize capitalization' do
262
+ settings.load({ :ui => { :capitalization => :capitalize } })
263
+ hash = [raw_hash.transform_keys(&:capitalize)]
264
+ expected_output = YAML.dump(hash)
265
+ out, = capture_io do
266
+ adapter.print_collection(fields, data)
267
+ end
268
+ out.must_equal(expected_output)
269
+ end
270
+
271
+ it 'should respect selected upcase capitalization' do
272
+ settings.load({ :ui => { :capitalization => :upcase } })
273
+ hash = [raw_hash.transform_keys(&:upcase)]
274
+ expected_output = YAML.dump(hash)
275
+ out, = capture_io do
276
+ adapter.print_collection(fields, data)
277
+ end
278
+ out.must_equal(expected_output)
279
+ end
280
+
281
+ it 'should print a warn for not supported capitalization' do
282
+ settings.load({ :ui => { :capitalization => :unsupported } })
283
+ hash = [raw_hash]
284
+ expected_error = "Cannot use such capitalization. Try one of downcase, capitalize, upcase.\n"
285
+ expected_output = YAML.dump(hash)
286
+ out, err = capture_io do
287
+ adapter.print_collection(fields, data)
288
+ end
289
+ out.must_equal(expected_output)
290
+ err.must_equal(expected_error)
291
+ end
292
+
293
+ it "shouldn't change capitalization if wasn't selected" do
294
+ settings.load({ :ui => { :capitalization => nil } })
295
+ hash = [raw_hash]
296
+ expected_output = YAML.dump(hash)
297
+ out, = capture_io do
298
+ adapter.print_collection(fields, data)
299
+ end
300
+ out.must_equal(expected_output)
301
+ end
302
+ end
303
+
245
304
  context "show ids" do
246
305
 
247
306
  let(:context) { {:show_ids => true} }
@@ -112,5 +112,177 @@ describe HammerCLI::Output::Output do
112
112
  end
113
113
  end
114
114
 
115
- end
115
+ describe 'verbosity' do
116
+ let(:msg) { "Some message\n" }
117
+ let(:quiet_opts) { { :verbosity => HammerCLI::V_QUIET } }
118
+ let(:no_verbose_opts) { { :verbosity => HammerCLI::V_UNIX } }
119
+ let(:verbose_opts) { { :verbosity => HammerCLI::V_VERBOSE } }
120
+ let(:very_verbose_opts) { { :verbosity => HammerCLI::V_VERBOSE + 1 } }
121
+ let(:data) do
122
+ HammerCLI::Output::RecordCollection.new(
123
+ [{
124
+ :id => 112,
125
+ :name => 'John',
126
+ :surname => 'Doe'
127
+ }]
128
+ )
129
+ end
130
+ let(:id) { Fields::Id.new(:path => [:id], :label => 'Id') }
131
+ let(:name) { Fields::Field.new(:path => [:name], :label => 'Name') }
132
+ let(:surname) { Fields::Field.new(:path => [:surname], :label => 'Surname') }
133
+ let(:definition) { HammerCLI::Output::Definition.new }
134
+ let(:expected_record_output) do
135
+ [
136
+ "Name: John",
137
+ "Surname: Doe",
138
+ "\n"
139
+ ].join("\n")
140
+ end
141
+
142
+ context 'quiet' do
143
+ let(:context) { quiet_opts }
144
+ let(:output) { HammerCLI::Output::Output.new(context) }
145
+
146
+ it 'should not print info messages with higher verbosity level' do
147
+ assert_output('', nil) do
148
+ output.print_message(msg)
149
+ end
150
+ assert_output('', nil) do
151
+ output.print_message(msg, {}, no_verbose_opts)
152
+ end
153
+ assert_output('', nil) do
154
+ output.print_message(msg, {}, verbose_opts)
155
+ end
156
+ end
157
+
158
+ it 'should print message with lower or equal verbosity level' do
159
+ assert_output(msg, nil) do
160
+ output.print_message(msg, {}, quiet_opts)
161
+ end
162
+ end
163
+
164
+ it 'should print error message even when hammer verbosity is level 0' do
165
+ assert_output(nil, msg) do
166
+ output.print_error(msg)
167
+ end
168
+ end
169
+
170
+ it 'should not print error messages with higher verbosity level' do
171
+ assert_output(nil, '') do
172
+ output.print_error(msg, nil, {}, verbose_opts)
173
+ end
174
+ end
175
+
176
+ it 'should not print record data' do
177
+ definition.append([id, name, surname])
178
+ assert_output('', nil) do
179
+ output.print_record(definition, data.first)
180
+ end
181
+ end
182
+
183
+ it 'should not print collection data' do
184
+ definition.append([id, name, surname])
185
+ assert_output('', nil) do
186
+ output.print_record(definition, data)
187
+ end
188
+ end
189
+ end
190
+
191
+ context 'no-verbose' do
192
+ let(:context) { no_verbose_opts }
193
+ let(:output) { HammerCLI::Output::Output.new(context) }
194
+
195
+ it 'should not print info messages with higher verbosity level' do
196
+ assert_output('', nil) do
197
+ output.print_message(msg)
198
+ end
199
+ assert_output('', nil) do
200
+ output.print_message(msg, {}, verbose_opts)
201
+ end
202
+ end
203
+
204
+ it 'should print message with lower or equal verbosity level' do
205
+ assert_output(msg, nil) do
206
+ output.print_message(msg, {}, quiet_opts)
207
+ end
208
+ assert_output(msg, nil) do
209
+ output.print_message(msg, {}, no_verbose_opts)
210
+ end
211
+ end
116
212
 
213
+ it 'should print error message' do
214
+ assert_output(nil, msg) do
215
+ output.print_error(msg)
216
+ end
217
+ end
218
+
219
+ it 'should not print error messages with higher verbosity level' do
220
+ assert_output(nil, '') do
221
+ output.print_error(msg, nil, {}, verbose_opts)
222
+ end
223
+ end
224
+
225
+ it 'should print record data' do
226
+ definition.append([id, name, surname])
227
+ assert_output(expected_record_output, nil) do
228
+ output.print_record(definition, data.first)
229
+ end
230
+ end
231
+
232
+ it 'should print collection data' do
233
+ definition.append([id, name, surname])
234
+ assert_output(expected_record_output, nil) do
235
+ output.print_record(definition, data)
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'verbose' do
241
+ let(:context) { verbose_opts }
242
+ let(:output) { HammerCLI::Output::Output.new(context) }
243
+ it 'should not print info messages with higher verbosity level' do
244
+ assert_output('', nil) do
245
+ output.print_message(msg, {}, very_verbose_opts)
246
+ end
247
+ end
248
+
249
+ it 'should print message with lower or equal verbosity level' do
250
+ assert_output(msg, nil) do
251
+ output.print_message(msg, {}, quiet_opts)
252
+ end
253
+ assert_output(msg, nil) do
254
+ output.print_message(msg, {}, no_verbose_opts)
255
+ end
256
+ assert_output(msg, nil) do
257
+ output.print_message(msg, {}, verbose_opts)
258
+ end
259
+ end
260
+
261
+ it 'should print error message' do
262
+ assert_output(nil, msg) do
263
+ output.print_error(msg)
264
+ end
265
+ end
266
+
267
+ it 'should not print error messages with higher verbosity level' do
268
+ assert_output(nil, '') do
269
+ output.print_error(msg, nil, {}, very_verbose_opts)
270
+ end
271
+ end
272
+
273
+ it 'should print record data' do
274
+ definition.append([id, name, surname])
275
+ assert_output(expected_record_output, nil) do
276
+ output.print_record(definition, data.first)
277
+ end
278
+ end
279
+
280
+ it 'should print collection data' do
281
+ definition.append([id, name, surname])
282
+ assert_output(expected_record_output, nil) do
283
+ output.print_record(definition, data)
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
@@ -9,41 +9,32 @@ module Constant
9
9
  end
10
10
 
11
11
  describe String do
12
+ context 'formatting' do
13
+ let(:str) { 'AA%<a>s BB%<b>s' }
14
+ let(:curly_str) { 'AA%{a} BB%{b}' }
15
+ let(:pos_str) { 'AA%s BB%s' }
16
+ let(:str_with_percent) { 'Error: AA%<a>s BB%<b>s <%# template error %> verify this %>' }
12
17
 
13
- context "formatting" do
14
-
15
- let(:str) { "AA%<a>s BB%<b>s" }
16
- let(:curly_str) { "AA%{a} BB%{b}" }
17
- let(:pos_str) { "AA%s BB%s" }
18
- let(:str_with_percent) { "Error: AA%<a>s BB%<b>s <%# template error %> verify this %>" }
19
-
20
- it "should not fail without expected parameters" do
18
+ it 'should not fail without expected parameters' do
21
19
  str.format({}).must_equal 'AA BB'
22
20
  end
23
-
24
- it "should replace positional parameters" do
21
+ it 'should replace positional parameters' do
25
22
  pos_str.format(['A', 'B']).must_equal 'AAA BBB'
26
23
  end
27
-
28
- it "should replace named parameters" do
24
+ it 'should replace named parameters' do
29
25
  str.format(:a => 'A', :b => 'B').must_equal 'AAA BBB'
30
26
  end
31
-
32
- it "should replace named parameters with string keys" do
27
+ it 'should replace named parameters with string keys' do
33
28
  str.format('a' => 'A', 'b' => 'B').must_equal 'AAA BBB'
34
29
  end
35
-
36
- it "should replace named parameters marked with curly brackets" do
30
+ it 'should replace named parameters marked with curly brackets' do
37
31
  curly_str.format(:a => 'A', :b => 'B').must_equal 'AAA BBB'
38
32
  end
39
-
40
- it "should not fail due to presence of percent chars in string" do
33
+ it 'should not fail due to presence of percent chars in string' do
41
34
  str_with_percent.format({}).must_equal 'Error: AA BB <%# template error %> verify this %>'
42
35
  end
43
-
44
36
  end
45
37
 
46
-
47
38
  context "camelize" do
48
39
 
49
40
  it "should camelize string with underscores" do
@@ -110,7 +101,16 @@ describe String do
110
101
 
111
102
  end
112
103
 
113
-
104
+ describe Hash do
105
+ context 'transform_keys' do
106
+ let(:hash) { { :one => 'one', :two => 'two', 'three' => 3 } }
107
+ let(:transformed_hash) { { :ONE => 'one', :TWO => 'two', 'THREE' => 3 } }
108
+ it 'should return a new hash with new keys' do
109
+ new_hash = hash.transform_keys(&:upcase)
110
+ new_hash.must_equal transformed_hash
111
+ end
112
+ end
113
+ end
114
114
 
115
115
  describe HammerCLI do
116
116
 
@@ -170,4 +170,3 @@ describe HammerCLI do
170
170
  end
171
171
 
172
172
  end
173
-
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: 0.14.0
4
+ version: 0.15.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: 2018-08-27 00:00:00.000000000 Z
12
+ date: 2018-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: clamp
@@ -17,7 +17,7 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '1.0'
20
+ version: '1.1'
21
21
  - - "<"
22
22
  - !ruby/object:Gem::Version
23
23
  version: 1.2.0
@@ -27,7 +27,7 @@ dependencies:
27
27
  requirements:
28
28
  - - ">="
29
29
  - !ruby/object:Gem::Version
30
- version: '1.0'
30
+ version: '1.1'
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.2.0
@@ -260,6 +260,7 @@ files:
260
260
  - lib/hammer_cli/testing/output_matchers.rb
261
261
  - lib/hammer_cli/utils.rb
262
262
  - lib/hammer_cli/validator.rb
263
+ - lib/hammer_cli/verbosity.rb
263
264
  - lib/hammer_cli/version.rb
264
265
  - locale/ca/LC_MESSAGES/hammer-cli.mo
265
266
  - locale/de/LC_MESSAGES/hammer-cli.mo
@@ -422,6 +423,7 @@ files:
422
423
  - test/unit/apipie/command_test.rb
423
424
  - test/unit/apipie/option_builder_test.rb
424
425
  - test/unit/apipie/option_definition_test.rb
426
+ - test/unit/apipie/test_helper.rb
425
427
  - test/unit/ca_cert_manager_test.rb
426
428
  - test/unit/completer_test.rb
427
429
  - test/unit/connection_test.rb
@@ -468,9 +470,9 @@ files:
468
470
  - test/unit/test_helper.rb
469
471
  - test/unit/utils_test.rb
470
472
  - test/unit/validator_test.rb
471
- homepage: http://github.com/theforeman/hammer-cli
473
+ homepage: https://github.com/theforeman/hammer-cli
472
474
  licenses:
473
- - GPL-3
475
+ - GPL-3.0
474
476
  metadata: {}
475
477
  post_install_message:
476
478
  rdoc_options: []
@@ -661,6 +663,7 @@ test_files:
661
663
  - test/unit/apipie/option_definition_test.rb
662
664
  - test/unit/apipie/command_test.rb
663
665
  - test/unit/apipie/option_builder_test.rb
666
+ - test/unit/apipie/test_helper.rb
664
667
  - test/unit/validator_test.rb
665
668
  - test/unit/options/option_collector_test.rb
666
669
  - test/unit/options/sources/saved_defaults_test.rb