hammer_cli 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hammer +4 -9
  3. data/config/cli_config.template.yml +12 -6
  4. data/doc/creating_commands.md +38 -0
  5. data/doc/i18n.md +33 -2
  6. data/doc/option_normalizers.md +2 -0
  7. data/doc/release_notes.md +18 -0
  8. data/lib/hammer_cli/abstract.rb +7 -2
  9. data/lib/hammer_cli/apipie/option_builder.rb +1 -1
  10. data/lib/hammer_cli/ca_cert_fetcher.rb +8 -8
  11. data/lib/hammer_cli/clamp.rb +9 -9
  12. data/lib/hammer_cli/context.rb +2 -1
  13. data/lib/hammer_cli/defaults.rb +12 -14
  14. data/lib/hammer_cli/defaults_commands.rb +2 -2
  15. data/lib/hammer_cli/exception_handler.rb +1 -1
  16. data/lib/hammer_cli/help/builder.rb +2 -1
  17. data/lib/hammer_cli/i18n/find_task.rb +41 -0
  18. data/lib/hammer_cli/i18n.rb +4 -0
  19. data/lib/hammer_cli/logger.rb +1 -1
  20. data/lib/hammer_cli/main.rb +12 -11
  21. data/lib/hammer_cli/modules.rb +5 -8
  22. data/lib/hammer_cli/options/normalizers.rb +15 -11
  23. data/lib/hammer_cli/options/option_collector.rb +17 -3
  24. data/lib/hammer_cli/options/option_definition.rb +36 -21
  25. data/lib/hammer_cli/output/adapter/csv.rb +1 -1
  26. data/lib/hammer_cli/output/adapter/table.rb +8 -6
  27. data/lib/hammer_cli/settings.rb +1 -6
  28. data/lib/hammer_cli/shell.rb +2 -2
  29. data/lib/hammer_cli/ssloptions.rb +5 -5
  30. data/lib/hammer_cli/subcommand.rb +51 -26
  31. data/lib/hammer_cli/testing/command_assertions.rb +2 -2
  32. data/lib/hammer_cli/testing/messages.rb +54 -0
  33. data/lib/hammer_cli/validator.rb +9 -9
  34. data/lib/hammer_cli/version.rb +1 -1
  35. data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
  36. data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
  37. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  38. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  39. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  40. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  41. data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
  42. data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
  43. data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
  44. data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
  45. data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
  46. data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
  47. data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
  48. data/man/hammer.1.gz +0 -0
  49. data/test/functional/defaults_test.rb +3 -12
  50. data/test/functional/help_test.rb +1 -1
  51. data/test/functional/nil_values_test.rb +75 -0
  52. data/test/functional/test_helper.rb +10 -0
  53. data/test/reports/TEST-Fields-ContainerField-display-.xml +7 -0
  54. data/test/reports/TEST-Fields-ContainerField-display-blank-is-allowed.xml +15 -0
  55. data/test/reports/TEST-Fields-ContainerField-display-blank-is-not-allowed.xml +15 -0
  56. data/test/reports/TEST-Fields-ContainerField.xml +7 -0
  57. data/test/reports/TEST-Fields-Field-display-.xml +7 -0
  58. data/test/reports/TEST-Fields-Field-display-blank-is-allowed.xml +11 -0
  59. data/test/reports/TEST-Fields-Field-display-blank-is-not-allowed.xml +11 -0
  60. data/test/reports/TEST-Fields-Field-hide-blank-.xml +11 -0
  61. data/test/reports/TEST-Fields-Field-parameters.xml +9 -0
  62. data/test/reports/TEST-Fields-Field.xml +13 -0
  63. data/test/reports/TEST-HammerCLI-AbstractCommand-build-options.xml +15 -0
  64. data/test/reports/TEST-HammerCLI-AbstractCommand-exception-handler.xml +13 -0
  65. data/test/reports/TEST-HammerCLI-AbstractCommand-logging.xml +21 -0
  66. data/test/reports/TEST-HammerCLI-AbstractCommand-option-builder.xml +11 -0
  67. data/test/reports/TEST-HammerCLI-AbstractCommand-options.xml +11 -0
  68. data/test/reports/TEST-HammerCLI-AbstractCommand-output.xml +19 -0
  69. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-remove-subcommand.xml +11 -0
  70. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand-.xml +13 -0
  71. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand.xml +11 -0
  72. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior.xml +7 -0
  73. data/test/reports/TEST-HammerCLI-AbstractCommand.xml +11 -0
  74. data/test/reports/TEST-HammerCLI-Apipie-Command-options.xml +11 -0
  75. data/test/reports/TEST-HammerCLI-Apipie-Command-resource-defined.xml +9 -0
  76. data/test/reports/TEST-HammerCLI-Apipie-Command-setting-resources.xml +19 -0
  77. data/test/reports/TEST-HammerCLI-Apipie-Command.xml +9 -0
  78. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-aliasing-resources.xml +13 -0
  79. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-filtering-options.xml +15 -0
  80. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-required-options.xml +11 -0
  81. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-setting-correct-normalizers.xml +9 -0
  82. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-hash-params.xml +11 -0
  83. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-one-simple-param.xml +15 -0
  84. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder.xml +7 -0
  85. data/test/reports/TEST-HammerCLI-Completer-command-completion.xml +29 -0
  86. data/test/reports/TEST-HammerCLI-Completer-option-value-completion.xml +17 -0
  87. data/test/reports/TEST-HammerCLI-Completer-subcommand-completion.xml +19 -0
  88. data/test/reports/TEST-HammerCLI-Completer.xml +7 -0
  89. data/test/reports/TEST-HammerCLI-CompleterLine-line-complete.xml +25 -0
  90. data/test/reports/TEST-HammerCLI-CompleterLine-splitting-words.xml +29 -0
  91. data/test/reports/TEST-HammerCLI-CompleterLine.xml +7 -0
  92. data/test/reports/TEST-HammerCLI-CompleterWord-complete-.xml +23 -0
  93. data/test/reports/TEST-HammerCLI-CompleterWord-quote.xml +15 -0
  94. data/test/reports/TEST-HammerCLI-CompleterWord-quoted-.xml +13 -0
  95. data/test/reports/TEST-HammerCLI-CompleterWord.xml +7 -0
  96. data/test/reports/TEST-HammerCLI-Connection.xml +21 -0
  97. data/test/reports/TEST-HammerCLI-ExceptionHandler.xml +21 -0
  98. data/test/reports/TEST-HammerCLI-I18n.xml +11 -0
  99. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-password.xml +11 -0
  100. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-username.xml +11 -0
  101. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-verbose.xml +9 -0
  102. data/test/reports/TEST-HammerCLI-MainCommand-loading-context.xml +7 -0
  103. data/test/reports/TEST-HammerCLI-MainCommand.xml +7 -0
  104. data/test/reports/TEST-HammerCLI-Modules-find-by-name.xml +13 -0
  105. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-not-found.xml +13 -0
  106. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-runtime-exception.xml +13 -0
  107. data/test/reports/TEST-HammerCLI-Modules-load-a-module-success.xml +15 -0
  108. data/test/reports/TEST-HammerCLI-Modules-load-a-module.xml +7 -0
  109. data/test/reports/TEST-HammerCLI-Modules-load-all-modules.xml +9 -0
  110. data/test/reports/TEST-HammerCLI-Modules-names.xml +13 -0
  111. data/test/reports/TEST-HammerCLI-Modules.xml +7 -0
  112. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.0.xml +7 -0
  113. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.xml +11 -0
  114. data/test/reports/TEST-HammerCLI-Options-Normalizers-abstract.xml +9 -0
  115. data/test/reports/TEST-HammerCLI-Options-Normalizers-bool.xml +31 -0
  116. data/test/reports/TEST-HammerCLI-Options-Normalizers-datetime.xml +17 -0
  117. data/test/reports/TEST-HammerCLI-Options-Normalizers-enum.xml +15 -0
  118. data/test/reports/TEST-HammerCLI-Options-Normalizers-enumlist.xml +21 -0
  119. data/test/reports/TEST-HammerCLI-Options-Normalizers-json-input.xml +15 -0
  120. data/test/reports/TEST-HammerCLI-Options-Normalizers-key-value-list.xml +17 -0
  121. data/test/reports/TEST-HammerCLI-Options-Normalizers-list.xml +15 -0
  122. data/test/reports/TEST-HammerCLI-Options-Normalizers.xml +7 -0
  123. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-context.xml +9 -0
  124. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-formatters.xml +11 -0
  125. data/test/reports/TEST-HammerCLI-Options-OptionDefinition.xml +7 -0
  126. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-error-messages.xml +15 -0
  127. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-messages.xml +11 -0
  128. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-test-data-for-field.xml +15 -0
  129. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract.xml +17 -0
  130. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection-show-ids.xml +9 -0
  131. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection.xml +27 -0
  132. data/test/reports/TEST-HammerCLI-Output-Adapter-Base.xml +7 -0
  133. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-formatters.xml +11 -0
  134. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-collections.xml +13 -0
  135. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-containers.xml +11 -0
  136. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-ids.xml +11 -0
  137. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection.xml +11 -0
  138. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-message.xml +11 -0
  139. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues.xml +7 -0
  140. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-column-width.xml +15 -0
  141. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-formatters.xml +11 -0
  142. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-handle-ids.xml +11 -0
  143. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-sort-columns.xml +9 -0
  144. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection.xml +11 -0
  145. data/test/reports/TEST-HammerCLI-Output-Adapter-Table.xml +7 -0
  146. data/test/reports/TEST-HammerCLI-Output-Definition-empty-.xml +11 -0
  147. data/test/reports/TEST-HammerCLI-Output-Definition.xml +11 -0
  148. data/test/reports/TEST-HammerCLI-Output-Dsl-collection.xml +13 -0
  149. data/test/reports/TEST-HammerCLI-Output-Dsl-custom-fields.xml +11 -0
  150. data/test/reports/TEST-HammerCLI-Output-Dsl-fields.xml +15 -0
  151. data/test/reports/TEST-HammerCLI-Output-Dsl-label.xml +13 -0
  152. data/test/reports/TEST-HammerCLI-Output-Dsl-path-definition.xml +13 -0
  153. data/test/reports/TEST-HammerCLI-Output-Dsl.xml +9 -0
  154. data/test/reports/TEST-HammerCLI-Output-FieldFilter.xml +13 -0
  155. data/test/reports/TEST-HammerCLI-Output-Formatters-BooleanFormatter.xml +11 -0
  156. data/test/reports/TEST-HammerCLI-Output-Formatters-ColorFormatter.xml +9 -0
  157. data/test/reports/TEST-HammerCLI-Output-Formatters-DateFormatter.xml +11 -0
  158. data/test/reports/TEST-HammerCLI-Output-Formatters-FieldFormatter.xml +13 -0
  159. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterContainer.xml +13 -0
  160. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterLibrary.xml +11 -0
  161. data/test/reports/TEST-HammerCLI-Output-Formatters-KeyValueFormatter.xml +13 -0
  162. data/test/reports/TEST-HammerCLI-Output-Formatters-ListFormatter.xml +13 -0
  163. data/test/reports/TEST-HammerCLI-Output-Formatters-LongTextFormatter.xml +13 -0
  164. data/test/reports/TEST-HammerCLI-Output-Output-adapters.xml +17 -0
  165. data/test/reports/TEST-HammerCLI-Output-Output-data.xml +15 -0
  166. data/test/reports/TEST-HammerCLI-Output-Output-formatters.xml +9 -0
  167. data/test/reports/TEST-HammerCLI-Output-Output-messages.xml +19 -0
  168. data/test/reports/TEST-HammerCLI-Output-Output.xml +7 -0
  169. data/test/reports/TEST-HammerCLI-Output-RecordCollection.xml +13 -0
  170. data/test/reports/TEST-HammerCLI-Settings-load-from-paths.xml +15 -0
  171. data/test/reports/TEST-HammerCLI-Settings.xml +25 -0
  172. data/test/reports/TEST-HammerCLI-ShellHistory-loading-old-history.xml +11 -0
  173. data/test/reports/TEST-HammerCLI-ShellHistory-saving-history.xml +15 -0
  174. data/test/reports/TEST-HammerCLI-ShellHistory.xml +7 -0
  175. data/test/reports/TEST-MiniTest-Spec.xml +7 -0
  176. data/test/reports/TEST-String-camelize.xml +11 -0
  177. data/test/reports/TEST-String-formatting.xml +17 -0
  178. data/test/reports/TEST-String-indent.xml +11 -0
  179. data/test/reports/TEST-String-interactive-.xml +13 -0
  180. data/test/reports/TEST-String.xml +7 -0
  181. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint-exist-.xml +13 -0
  182. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint.xml +7 -0
  183. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint-exist-.xml +13 -0
  184. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint.xml +7 -0
  185. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-exist-.xml +9 -0
  186. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-rejected.xml +13 -0
  187. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-required.xml +13 -0
  188. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint.xml +7 -0
  189. data/test/reports/TEST-constraints.xml +7 -0
  190. data/test/unit/abstract_test.rb +10 -1
  191. data/test/unit/apipie/option_builder_test.rb +6 -0
  192. data/test/unit/defaults_test.rb +12 -5
  193. data/test/unit/exception_handler_test.rb +1 -1
  194. data/test/unit/fixtures/apipie/documented.json +10 -1
  195. data/test/unit/help/builder_test.rb +16 -1
  196. data/test/unit/messages_test.rb +7 -0
  197. data/test/unit/modules_test.rb +4 -15
  198. data/test/unit/options/normalizers_test.rb +21 -1
  199. data/test/unit/options/option_collector_test.rb +10 -4
  200. data/test/unit/output/adapter/csv_test.rb +29 -0
  201. data/test/unit/output/adapter/table_test.rb +27 -0
  202. data/test/unit/validator_test.rb +4 -4
  203. metadata +353 -53
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f466081646f301304855a180aec480a3c90e1653
4
- data.tar.gz: b33e6d9d98d4746890ffd72080cd6f3bf272dd3b
3
+ metadata.gz: 0aa589ebe2589ead222c05b6b8a1de324f3efdb5
4
+ data.tar.gz: 1068b381dbe8685c2a1d7bc0168513f5e48ccce9
5
5
  SHA512:
6
- metadata.gz: 659186808832cd2531ef847a046eded3270789a73a052c8565c0cadbde7de977fe3b3d18bfb2d362ed2458dc4dd8f4ce826a828f78eafceb2815f727b5ee2395
7
- data.tar.gz: dceeed449044ee96e0fe969bdf4ed2906c6b27b6de91988f70a83ec72a65d218d7e3ef720ced4195420a5697ca9369e1786afc992bac6020d9f7fae597295297
6
+ metadata.gz: c7153a9ebaab813ef8ea1061461efd60c1e357f5445187762203aed5055bb1e38eac86d787f4bec013e5cc78e84afd40fbb3ac81cef8a3b1844732356a7f864f
7
+ data.tar.gz: ff4d24d0067d7e500ee573bfb82531637c67f557d1ef9745d4b2587ed31e9edbac0aa6d47eb79778e97658627495f3327b5cac0626d56ea04dfd8a27c7c1b8ba
data/bin/hammer CHANGED
@@ -29,6 +29,7 @@ class PreParser < Clamp::Command
29
29
  option ["--show-ids"], :flag, "Show ids of associated resources"
30
30
  option ["--csv"], :flag, "Output as CSV (same as --output=csv)"
31
31
  option ["--output"], "ADAPTER", "Set output format"
32
+ option ["--no-headers"], :flag, "Hide headers from output"
32
33
  option ["--csv-separator"], "SEPARATOR", "Character to separate the values"
33
34
  option ["--autocomplete"], "LINE", "Get list of possible endings"
34
35
  option ["--verify-ssl"], "VERIFY_SSL", "Configure SSL verification of remote system" do |value|
@@ -52,15 +53,8 @@ end
52
53
  # load user's settings
53
54
  require 'hammer_cli/settings'
54
55
 
55
- CFG_PATH_LEGACY = ['~/.foreman/', '/etc/foreman/', "#{::RbConfig::CONFIG['sysconfdir']}/foreman/"].uniq
56
- HammerCLI::Settings.load_from_paths CFG_PATH_LEGACY
57
- if HammerCLI::Settings.path_history.empty?
58
- CFG_PATH = ['~/.hammer/', '/etc/hammer/', "#{::RbConfig::CONFIG['sysconfdir']}/hammer/"].uniq
59
- HammerCLI::Settings.load_from_paths CFG_PATH
60
- else
61
- warn _("Warning: Legacy config paths detected, move the following files")
62
- HammerCLI::Settings.path_history.each { |p| warn " #{p} -> #{p.gsub('hammer.modules.d', 'cli.modules.d').gsub('foreman/', 'hammer/')}"}
63
- end
56
+ CFG_PATH = ['~/.hammer/', '/etc/hammer/', "#{::RbConfig::CONFIG['sysconfdir']}/hammer/"].uniq
57
+ HammerCLI::Settings.load_from_paths CFG_PATH
64
58
 
65
59
  CFG_PATH_LOCAL = ['./config/']
66
60
 
@@ -86,6 +80,7 @@ HammerCLI::Settings.load({
86
80
  :host => preparser.server,
87
81
  :interactive => preparser.interactive,
88
82
  :verbose => preparser.verbose? || preparser.debug?,
83
+ :no_headers => preparser.no_headers?,
89
84
  :reload_cache => preparser.reload_cache?,
90
85
  :verify_ssl => preparser.verify_ssl,
91
86
  :ssl_ca_file => preparser.ssl_ca_file,
@@ -8,7 +8,8 @@
8
8
  :history_file: '~/.hammer/history'
9
9
  # Mark translated strings with X characters (for developers)
10
10
  #:mark_translated: false
11
-
11
+ # Hide headers from output of list actions
12
+ # :no_headers: true
12
13
 
13
14
  # Enable/disable color output of logger in Clamp commands
14
15
  :watch_plain: false
@@ -34,23 +35,28 @@
34
35
 
35
36
  # SSL auth options
36
37
  #:ssl:
37
- # Path to a ca file
38
+ # Path to a CA file in PEM format, mutually exclusive with :ssl_ca_path:
38
39
  #:ssl_ca_file: '/path/to/ca_certificate.pem'
39
40
 
40
- # Path to a direcotry with ca file
41
+ # Path to a direcotry with CA files, mutually exclusive with :ssl_ca_file:
42
+ # The directory should contain one certificate per file in PEM format, with a file name of the form hash.N
43
+ # The hash can be obtained via the -hash option of the openssl x509 command. See the OpenSSL documentation
44
+ # for more information.
41
45
  #:ssl_ca_path: '/path/to/ca'
42
46
 
43
47
  # Turn SSL verification on/off
44
48
  #:verify_ssl: true
45
49
 
46
- # Path to a client certificate
50
+ # Path to a client certificate, DER- or PEM-encoded certificates are supported
47
51
  #:ssl_client_cert: '/path/to/cert.crt'
48
52
 
49
53
  # Path to a client key
50
54
  #:ssl_client_key: '/path/to/cert.key'
51
55
 
52
- # Enable standard authentication in addition to client certificate authentication
56
+ # Enable standard authentication in addition to client certificate authentication.
57
+ # Switch to false if you want to rely on certificates only.
53
58
  #:ssl_with_basic_auth: true
54
59
 
55
- # local CA cert store path
60
+ # Local CA cert store path where hammer stores certificates fetched from the server.
61
+ # Certs from the local storage are used only when neither :ssl_ca_file: nor :ssl_ca_path: is cofigured.
56
62
  #:local_ca_store_path: '~/.hammer/certs'
@@ -129,6 +129,22 @@ $ hammer hello --name 'Foreman'
129
129
  Hello Foreman!
130
130
  ```
131
131
 
132
+ #### Nil values ####
133
+ To unset some option (i.e. to set it to nil value) use preset value `NIL`:
134
+ ```
135
+ $ hammer hello --name NIL
136
+ Hello World!
137
+ ```
138
+
139
+ When the `NIL` value collides with a real value being used it can be redefined using
140
+ environment variable `HAMMER_NIL`:
141
+ ```
142
+ $ HAMMER_NIL=NULL hammer hello --name NIL
143
+ Hello NIL!
144
+ ```
145
+
146
+ Note that the normalizers are not called for a NIL values even when defined for the option.
147
+
132
148
  #### Deprecated options
133
149
  To mark an option as deprecated use the `:deprecated` option as follows:
134
150
  ```ruby
@@ -226,6 +242,28 @@ option "--attributes", "ATTRIBUTES", "Values of various attributes",
226
242
  ```
227
243
  `--attributes="material=unoptanium,thickness=3"` -> `{'material' => 'unoptanium', 'thickness' => '3'}`
228
244
 
245
+ ### Advanced option evaluation
246
+
247
+ Sometimes it is necessary to tune the option values based on other parameters given on CLI.
248
+ An example could be setting default values based on other options, values lookup in a DB, etc.
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,
251
+ `HammerCLI::Options::Sources::SavedDefaults` adding defaults managed by the `defaults` command.
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.
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
259
+ (before the command's `execute` method is invoked). The order is as follows:
260
+ 1. parse
261
+ 1. option normalization
262
+ 1. option validation (run against normalized raw options as given on CLI)
263
+ 1. option sources execution
264
+ 1. `execute` invocation
265
+
266
+
229
267
  ### Adding subcommands
230
268
  Commands in the CLI can be structured into a tree of parent commands (nodes) and subcommands (leaves).
231
269
  Neither the number of subcommands nor the nesting is limited. Please note that no parent command
data/doc/i18n.md CHANGED
@@ -46,7 +46,6 @@ HammerCLI::I18n.add_domain(HammerCLIAwesomePlugin::I18n::LocaleDomain.new)
46
46
  ```
47
47
 
48
48
  Then you have to export strings, translate them and place the files in a directory structure.
49
- Inspiration on how to export the translations can be found in hammer's [Rakefile](../Rakefile).
50
49
 
51
50
  Typical directory structure for translation files look like this:
52
51
  ```
@@ -62,6 +61,29 @@ locale
62
61
  └── hammer-cli-awesome.pot
63
62
  ```
64
63
 
64
+ You can re-use Rake tasks and Makefile targets for extracting translations and integration with transifex that hammer provides.
65
+ To do that, add following lines to the plugin's Rakefile:
66
+ ```ruby
67
+ require "hammer_cli_awesome/version"
68
+ require "hammer_cli_awesome/i18n"
69
+ require "hammer_cli/i18n/find_task"
70
+ HammerCLI::I18n::FindTask.define(HammerCLIAwesome::I18n::LocaleDomain.new, HammerCLIAwesome.version)
71
+ ```
72
+
73
+ and create `locale/Makefile` with following content:
74
+ ```make
75
+ DOMAIN = hammer-cli-awesome
76
+ VERSION = $(shell bundle exec ruby -e 'require "rubygems"; spec = Gem::Specification::load("../hammer_cli_awesome.gemspec"); puts spec.version')
77
+ MAIN_MAKEFILE = $(shell bundle exec ruby -e 'require "hammer_cli"; puts HammerCLI::I18n.main_makefile')
78
+
79
+ include $(MAIN_MAKEFILE)
80
+ ```
81
+
82
+ Make sure you have a project created in [transifex](www.transifex.com) and correct configuration stored in your plugins repository ([example config file](../.tx/config)).
83
+
84
+
85
+ Calling `make -C ./locale tx-update` will then extract new strings, update `.po` and `.mo` files and commit the changes.
86
+
65
87
 
66
88
  ### Translation tips
67
89
 
@@ -96,5 +118,14 @@ puts _("TODO:") +
96
118
  ```
97
119
 
98
120
 
99
- 4) Try setting `:mark_translated: true` to identify gaps in your translations.
121
+ 4) It's recommended to use punctuation at the end of sentences.
122
+ ```ruby
123
+ # CORRECT
124
+ puts _("Hello %s") % name
125
+ # RECOMMENDED
126
+ puts _("Hello %s.") % name
127
+ ```
128
+
129
+
130
+ 5) Try setting `:mark_translated: true` to identify gaps in your translations.
100
131
  This will wrap all translated strings with angle brackets '>message<'.
@@ -47,6 +47,8 @@ def format(bool)
47
47
  end
48
48
  ```
49
49
 
50
+ Note: the `format` is not called when `NIL` (value reserved for nil) is used.
51
+
50
52
 
51
53
  #### Value completion
52
54
 
data/doc/release_notes.md CHANGED
@@ -1,6 +1,24 @@
1
1
  Release notes
2
2
  =============
3
3
 
4
+ ### 0.12.0 (2018-02-19)
5
+ * Tests for message formats ([PR #266](https://github.com/theforeman/hammer-cli/pull/266)) ([#7451](http://projects.theforeman.org/issues/7451))
6
+ * Pin clamp version to < 1.2.0 ([#22554](http://projects.theforeman.org/issues/22554))
7
+ * Fix "unknown version" message ([#7451](http://projects.theforeman.org/issues/7451))
8
+ * Remove legacy Gemfile code for Ruby < 2.0 ([#22549](http://projects.theforeman.org/issues/22549))
9
+ * Allow hiding headers from output of list actions ([PR #253](https://github.com/theforeman/hammer-cli/pull/253)) ([#20978](http://projects.theforeman.org/issues/20978))
10
+ * Review whitespace in extracted strings ([#7451](http://projects.theforeman.org/issues/7451))
11
+ * Matches user prefix in output messages for CA certs ([#21707](http://projects.theforeman.org/issues/21707))
12
+ * Make option sources overridable ([#21768](http://projects.theforeman.org/issues/21768))
13
+ * Allow empty parameters in hammer ([PR #260](https://github.com/theforeman/hammer-cli/pull/260)) ([#17252](http://projects.theforeman.org/issues/17252))
14
+ * Shareable locale Makefile and Rakefile definitions ([PR #249](https://github.com/theforeman/hammer-cli/pull/249)) ([#20513](http://projects.theforeman.org/issues/20513))
15
+ * Support for deprecating commands ([#20804](http://projects.theforeman.org/issues/20804))
16
+ * Remove legacy config code ([#20611](http://projects.theforeman.org/issues/20611))
17
+ * Number normalizers for Integer params ([#21013](http://projects.theforeman.org/issues/21013))
18
+ * More detailed description of ssl options ([PR #248](https://github.com/theforeman/hammer-cli/pull/248)) ([#12401](http://projects.theforeman.org/issues/12401))
19
+ * Consistant capitalization in hammer help ([#19511](http://projects.theforeman.org/issues/19511))
20
+ * Saving defaults from hammer shell ([PR #244](https://github.com/theforeman/hammer-cli/pull/244)) ([#19676](http://projects.theforeman.org/issues/19676))
21
+
4
22
  ### 0.11.0 (2017-08-01)
5
23
  * Add full-help command ([#20181](http://projects.theforeman.org/issues/20181))
6
24
  * Replace CSV parser in List Normalizer ([#17135](http://projects.theforeman.org/issues/17135))
@@ -240,10 +240,15 @@ module HammerCLI
240
240
  end
241
241
 
242
242
  def option_collector
243
- @option_collector ||= HammerCLI::Options::OptionCollector.new(self.class.recognised_options, [
243
+ @option_collector ||= HammerCLI::Options::OptionCollector.new(self.class.recognised_options, option_sources)
244
+ end
245
+
246
+
247
+ def option_sources
248
+ [
244
249
  HammerCLI::Options::Sources::CommandLine.new(self),
245
250
  HammerCLI::Options::Sources::SavedDefaults.new(context[:defaults], logger)
246
- ])
251
+ ]
247
252
  end
248
253
 
249
254
  private
@@ -71,7 +71,7 @@ module HammerCLI::Apipie
71
71
  elsif param.validator =~ /Must be one of: (.*)\./
72
72
  allowed = $1.split(/,\ ?/).map { |val| val.gsub(/<[^>]*>/i,'') }
73
73
  opts[:format] = HammerCLI::Options::Normalizers::Enum.new(allowed)
74
- elsif param.expected_type.to_s == 'number' || param.validator =~ /Number/i
74
+ elsif param.expected_type.to_s == 'numeric' || param.validator =~ /Number/i || param.validator =~ /Integer/i
75
75
  opts[:format] = HammerCLI::Options::Normalizers::Number.new
76
76
  end
77
77
  opts[:attribute_name] = HammerCLI.option_accessor_name(param.name)
@@ -4,7 +4,7 @@ module HammerCLI
4
4
  def fetch_ca_cert(service_uri, ca_store_path)
5
5
  begin
6
6
  uri = URI.parse(service_uri)
7
- raise URI::InvalidURIError.new(_("Unable to find hostname in #{service_uri}")) if uri.host.nil?
7
+ raise URI::InvalidURIError.new(_("Unable to find hostname in %s.") % service_uri) if uri.host.nil?
8
8
  raise URI::InvalidURIError.new(scheme_error(uri)) unless uri.scheme == 'https'
9
9
  ca_cert_manager = HammerCLI::CACertManager.new(ca_store_path)
10
10
  raw_cert = HammerCLI::CertDownloader.new.download(uri)
@@ -17,7 +17,7 @@ module HammerCLI
17
17
  deb_update_cmd = "update-ca-certificates"
18
18
  cert_file = ca_cert_manager.cert_file_name(uri)
19
19
 
20
- puts _("CA certificate for %{uri} was stored to %{file}") % {:uri => service_uri, :file => cert_file}
20
+ puts _("CA certificate for %{uri} was stored to %{file}.") % {:uri => service_uri, :file => cert_file}
21
21
  puts _("Now hammer can use the downloaded certificate to verify SSL connection to the server.")
22
22
  puts _("It will be used automatically when ssl_ca_path and ssl_ca_file options are not set.")
23
23
  puts
@@ -31,12 +31,12 @@ module HammerCLI
31
31
 
32
32
  if File.directory?(rh_install_path)
33
33
  puts cert_install_msg
34
- puts " $ install #{cert_file} #{rh_install_path}"
35
- puts " $ #{rh_update_cmd}"
34
+ puts " # install #{cert_file} #{rh_install_path}"
35
+ puts " # #{rh_update_cmd}"
36
36
  elsif File.directory?(deb_install_path)
37
37
  puts cert_install_msg
38
- puts " $ install #{cert_file} #{deb_install_path}"
39
- puts " $ #{deb_update_cmd}"
38
+ puts " # install #{cert_file} #{deb_install_path}"
39
+ puts " # #{deb_update_cmd}"
40
40
  end
41
41
  puts
42
42
  return HammerCLI::EX_OK
@@ -52,7 +52,7 @@ module HammerCLI
52
52
  $stderr.puts _("To see the actual chain you can use openssl command")
53
53
  $stderr.puts " $ openssl s_client -showcerts -connect #{uri.host}:#{uri.port} </dev/null"
54
54
  $stderr.puts
55
- $stderr.puts _("You can also download the certificate manually and store it as #{cert_file}")
55
+ $stderr.puts _("You can also download the certificate manually and store it as %s.") % cert_file
56
56
  $stderr.puts _("If you choose any other location set the ssl_ca_path or ssl_ca_file configuration options appropriately.")
57
57
  return HammerCLI::EX_SOFTWARE
58
58
  rescue StandardError => e
@@ -60,7 +60,7 @@ module HammerCLI
60
60
  msg = [_('Fetching the CA certificate failed:')]
61
61
 
62
62
  if e.is_a?(OpenSSL::SSL::SSLError) && e.message.include?('unknown protocol')
63
- msg << _('The service at the given URI does not accept SSL connections')
63
+ msg << _('The service at the given URI does not accept SSL connections.')
64
64
  msg << scheme_error if uri.scheme == 'http'
65
65
  else
66
66
  msg << e.message
@@ -2,14 +2,14 @@ require 'clamp'
2
2
 
3
3
  if Clamp.respond_to?(:messages=)
4
4
  Clamp.messages = {
5
- :too_many_arguments => _("too many arguments"),
6
- :option_required => _("option '%<option>s' is required"),
7
- :option_or_env_required => _("option '%<option>s' (or env %<env>s) is required"),
8
- :option_argument_error => _("option '%<switch>s': %<message>s"),
9
- :parameter_argument_error => _("parameter '%<param>s': %<message>s"),
10
- :env_argument_error => _("%<env>s: %<message>s"),
11
- :unrecognised_option => _("Unrecognised option '%<switch>s'"),
12
- :no_such_subcommand => _("No such sub-command '%<name>s'"),
13
- :no_value_provided => _("no value provided")
5
+ :too_many_arguments => _("Too many arguments."),
6
+ :option_required => _("Option '%s' is required.") % "%<option>s",
7
+ :option_or_env_required => _("Option '%{opt}' (or env %{env}) is required.") % {:opt => "%<option>s", :env => "%<env>s"},
8
+ :option_argument_error => _("Option '%{swt}': %{msg}.") % {:swt => "%<switch>s", :msg => "%<message>s"},
9
+ :parameter_argument_error => _("Parameter '%{pmt}': %{msg}.") % {:pmt => "%<param>s", :msg => "%<message>s"},
10
+ :env_argument_error => _("%{env}: %{msg}.") % {:env => "%<env>s", :msg => "%<message>s"},
11
+ :unrecognised_option => _("Unrecognised option '%s'.") % "%<switch>s",
12
+ :no_such_subcommand => _("No such sub-command '%s'.") % "%<name>s",
13
+ :no_value_provided => _("No value provided.")
14
14
  }
15
15
  end
@@ -6,7 +6,8 @@ module HammerCLI
6
6
  @context ||= {
7
7
  :defaults => HammerCLI.defaults,
8
8
  :is_tty? => HammerCLI.tty?,
9
- :api_connection => HammerCLI::Connection.new(Logging.logger['Connection'])
9
+ :api_connection => HammerCLI::Connection.new(Logging.logger['Connection']),
10
+ :no_headers => HammerCLI::Settings.get(:ui, :no_headers)
10
11
  }
11
12
  end
12
13
 
@@ -23,20 +23,18 @@ module HammerCLI
23
23
  end
24
24
 
25
25
  def delete_default_from_conf(param)
26
- update_defaults_file do |defaults|
27
- defaults.delete_if { |k,| defaults_match?(k, param) }
28
- end
26
+ @defaults_settings.delete_if { |k,| defaults_match?(k, param) }
27
+ update_defaults_file
29
28
  end
30
29
 
31
30
  def add_defaults_to_conf(default_options, provider)
32
31
  create_default_file if defaults_settings.empty?
33
- update_defaults_file do |defaults|
34
- default_options.each do |key, value|
35
- key = switch_to_name(key).to_sym
36
- defaults.delete_if { |k,| defaults_match?(k, key) }
37
- defaults[key] = (value ? {:value => value} : {:provider => provider})
38
- end
32
+ default_options.each do |key, value|
33
+ key = switch_to_name(key).to_sym
34
+ @defaults_settings.delete_if { |k,| defaults_match?(k, key) }
35
+ @defaults_settings[key] = (value ? {:value => value.to_s} : {:provider => provider.to_s})
39
36
  end
37
+ update_defaults_file
40
38
  end
41
39
 
42
40
  def defaults_set?(param)
@@ -79,11 +77,11 @@ module HammerCLI
79
77
  end
80
78
 
81
79
  def update_defaults_file
82
- conf_file = YAML.load_file(@path)
83
- conf_file[:defaults] ||= {}
84
- yield conf_file[:defaults]
85
- write_to_file conf_file
86
- conf_file
80
+ conf_file_content = {
81
+ :defaults => @defaults_settings
82
+ }
83
+ write_to_file(conf_file_content)
84
+ conf_file_content
87
85
  end
88
86
 
89
87
  private
@@ -101,9 +101,9 @@ module HammerCLI
101
101
  command_name 'add'
102
102
 
103
103
  desc _('Add a default parameter to config')
104
- option "--param-name", "OPTION_NAME", _("The name of the default option (e.g. organization_id)."), :required => true
104
+ option "--param-name", "OPTION_NAME", _("The name of the default option (e.g. organization_id)"), :required => true
105
105
  option "--param-value", "OPTION_VALUE", _("The value for the default option")
106
- option "--provider", "OPTION_PROVIDER", _("The name of the provider providing the value. For list available providers see `hammer defaults providers`.")
106
+ option "--provider", "OPTION_PROVIDER", _("The name of the provider providing the value. For list available providers see `hammer defaults providers`")
107
107
 
108
108
  def execute
109
109
  if option_provider.nil? && option_param_value.nil? || !option_provider.nil? && !option_param_value.nil?
@@ -69,7 +69,7 @@ module HammerCLI
69
69
 
70
70
  def handle_usage_exception(e)
71
71
  print_error (_("Error: %{message}") + "\n\n" +
72
- _("See: '%{path} --help'")) % {:message => e.message, :path => e.command.invocation_path}
72
+ _("See: '%{path} --help'.")) % {:message => e.message, :path => e.command.invocation_path}
73
73
  log_full_error e
74
74
  HammerCLI::EX_USAGE
75
75
  end
@@ -1,3 +1,4 @@
1
+ require 'unicode'
1
2
  module HammerCLI
2
3
  module Help
3
4
  class Builder < Clamp::Help::Builder
@@ -34,7 +35,7 @@ module HammerCLI
34
35
 
35
36
  items.each do |item|
36
37
  label, description = item.help
37
- description.each_line do |line|
38
+ description.gsub(/^(.)/) { Unicode::capitalize($1) }.each_line do |line|
38
39
  puts " %-#{label_width}s %s" % [label, line]
39
40
  label = ''
40
41
  end
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+
3
+ module HammerCLI
4
+ module I18n
5
+ class FindTask
6
+ include Rake::DSL
7
+
8
+ def initialize(domain, version)
9
+ @domain = domain
10
+ @version = version
11
+ end
12
+
13
+ def define
14
+ namespace :gettext do
15
+ task :setup do
16
+ require 'gettext/tools/task'
17
+
18
+ GetText::Tools::Task.define do |task|
19
+ task.package_name = @domain.domain_name
20
+ task.package_version = @version.to_s
21
+ task.domain = @domain.domain_name
22
+ task.mo_base_directory = @domain.locale_dir
23
+ task.po_base_directory = @domain.locale_dir
24
+ task.files = @domain.translated_files
25
+ task.msgmerge_options='--no-fuzzy-matching'
26
+ end
27
+ end
28
+
29
+ desc "Update pot file"
30
+ task :find => [:setup] do
31
+ Rake::Task["gettext:po:update"].invoke
32
+ end
33
+ end
34
+ end
35
+
36
+ def self.define(domain, version)
37
+ new(domain, version).define
38
+ end
39
+ end
40
+ end
41
+ end
@@ -133,6 +133,10 @@ module HammerCLI
133
133
  end
134
134
  end
135
135
 
136
+ def self.main_makefile
137
+ File.expand_path(File.join(File.dirname(__FILE__), '../../locale/Makefile.def'))
138
+ end
139
+
136
140
  init
137
141
  end
138
142
  end
@@ -55,7 +55,7 @@ module HammerCLI
55
55
  begin
56
56
  FileUtils.mkdir_p(log_dir, :mode => 0750)
57
57
  rescue Errno::EACCES => e
58
- $stderr.puts _("No permissions to create log dir %s") % log_dir
58
+ $stderr.puts _("No permissions to create log dir %s.") % log_dir
59
59
  end
60
60
 
61
61
  filename = "#{log_dir}/hammer.log"
@@ -4,17 +4,17 @@ module HammerCLI
4
4
 
5
5
  class MainCommand < AbstractCommand
6
6
 
7
- option ["-v", "--verbose"], :flag, _("be verbose"), :context_target => :verbose
8
- option ["-d", "--debug"], :flag, _("show debugging output "), :context_target => :debug
9
- option ["-r", "--reload-cache"], :flag, _("force reload of Apipie cache")
7
+ option ["-v", "--verbose"], :flag, _("Be verbose"), :context_target => :verbose
8
+ option ["-d", "--debug"], :flag, _("Show debugging output"), :context_target => :debug
9
+ option ["-r", "--reload-cache"], :flag, _("Force reload of Apipie cache")
10
10
 
11
- option ["-c", "--config"], "CFG_FILE", _("path to custom config file")
11
+ option ["-c", "--config"], "CFG_FILE", _("Path to custom config file")
12
12
 
13
- option ["-u", "--username"], "USERNAME", _("username to access the remote system"),
13
+ option ["-u", "--username"], "USERNAME", _("Username to access the remote system"),
14
14
  :context_target => :username
15
- option ["-p", "--password"], "PASSWORD", _("password to access the remote system"),
15
+ option ["-p", "--password"], "PASSWORD", _("Password to access the remote system"),
16
16
  :context_target => :password
17
- option ["-s", "--server"], "SERVER", _("remote system address"),
17
+ option ["-s", "--server"], "SERVER", _("Remote system address"),
18
18
  :context_target => :uri
19
19
  option ["--verify-ssl"], "VERIFY_SSL", _("Configure SSL verification of remote system"),
20
20
  :format => HammerCLI::Options::Normalizers::Bool.new
@@ -25,7 +25,7 @@ module HammerCLI
25
25
  option ["--ssl-with-basic-auth"], :flag, _("Use standard authentication in addition to client certificate authentication")
26
26
  option ["--fetch-ca-cert"], "SERVER", _("Fetch CA certificate from server and exit")
27
27
 
28
- option "--version", :flag, _("show version") do
28
+ option "--version", :flag, _("Show version") do
29
29
  puts "hammer (%s)" % HammerCLI.version
30
30
  HammerCLI::Modules.names.each do |m|
31
31
  module_version = HammerCLI::Modules.find_by_name(m).version rescue _("unknown version")
@@ -39,7 +39,7 @@ module HammerCLI
39
39
  option ["--interactive"], "INTERACTIVE", _("Explicitly turn interactive mode on/off"),
40
40
  :format => HammerCLI::Options::Normalizers::Bool.new,
41
41
  :context_target => :interactive
42
-
42
+ option ["--no-headers"], :flag, _("Hide headers from output")
43
43
  option ["--csv"], :flag, _("Output as CSV (same as --output=csv)")
44
44
  option ["--output"], "ADAPTER", _("Set output format. One of [%s]") %
45
45
  HammerCLI::Output::Output.adapters.keys.join(', '),
@@ -61,8 +61,9 @@ module HammerCLI
61
61
  context[:adapter] = :csv
62
62
  end
63
63
 
64
+ def option_no_headers=(no_headers)
65
+ context[:no_headers] = :no_headers
66
+ end
64
67
  end
65
68
 
66
69
  end
67
-
68
-
@@ -7,10 +7,7 @@ module HammerCLI
7
7
  end
8
8
 
9
9
  def self.enabled_modules
10
- # legacy modules config
11
- modules = HammerCLI::Settings.get(:modules) || []
12
- logger.warn _("Legacy configuration of modules detected. Check section about configuration in user manual") unless modules.empty?
13
-
10
+ modules = []
14
11
  HammerCLI::Settings.dump.inject(modules) do |names, (mod_name, mod_config)|
15
12
  if is_module_config?(mod_config)
16
13
  mod = ["hammer_cli_#{mod_name}"]
@@ -56,15 +53,15 @@ module HammerCLI
56
53
  begin
57
54
  require_module(name)
58
55
  rescue Exception => e
59
- logger.error "Error while loading module #{name}"
60
- puts _("Warning: An error occured while loading module %s") % name
56
+ logger.error "Error while loading module #{name}."
57
+ puts _("Warning: An error occured while loading module %s.") % name
61
58
  # with ModuleLoadingError we assume the error is already logged by the issuer
62
59
  logger.error e unless e.is_a?(HammerCLI::ModuleLoadingError)
63
60
  raise e
64
61
  end
65
62
 
66
63
  version = find_by_name(name).version
67
- logger.info "Extension module #{name} (#{version}) loaded"
64
+ logger.info "Extension module #{name} (#{version}) loaded."
68
65
  true
69
66
  end
70
67
 
@@ -84,7 +81,7 @@ module HammerCLI
84
81
  end
85
82
  loaded_for_deps = loaded_modules & disabled_modules
86
83
  unless loaded_for_deps.empty?
87
- message = _("Error: Some of the required modules are disabled in configuration: %s ") % loaded_for_deps.join(', ')
84
+ message = _("Error: Some of the required modules are disabled in configuration: %s.") % loaded_for_deps.join(', ')
88
85
  raise HammerCLI::ModuleDisabledButRequired.new(message)
89
86
  end
90
87
  end