hammer_cli 0.18.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/doc/creating_commands.md +2 -8
  3. data/doc/developer_docs.md +2 -0
  4. data/doc/help_modification.md +35 -4
  5. data/doc/output.md +43 -0
  6. data/doc/release_notes.md +6 -2
  7. data/doc/review_checklist.md +17 -0
  8. data/lib/hammer_cli/help/definition.rb +1 -0
  9. data/lib/hammer_cli/help/definition/abstract_item.rb +2 -1
  10. data/lib/hammer_cli/help/definition/list.rb +5 -2
  11. data/lib/hammer_cli/help/definition/note.rb +30 -0
  12. data/lib/hammer_cli/help/definition/section.rb +0 -1
  13. data/lib/hammer_cli/help/definition/text.rb +3 -1
  14. data/lib/hammer_cli/help/text_builder.rb +7 -2
  15. data/lib/hammer_cli/main.rb +2 -2
  16. data/lib/hammer_cli/output/adapter/abstract.rb +9 -3
  17. data/lib/hammer_cli/output/adapter/base.rb +4 -2
  18. data/lib/hammer_cli/output/adapter/csv.rb +4 -2
  19. data/lib/hammer_cli/output/adapter/table.rb +4 -2
  20. data/lib/hammer_cli/output/adapter/tree_structure.rb +4 -4
  21. data/lib/hammer_cli/output/fields.rb +3 -0
  22. data/lib/hammer_cli/output/formatters.rb +77 -27
  23. data/lib/hammer_cli/output/utils.rb +12 -1
  24. data/lib/hammer_cli/version.rb +1 -1
  25. data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
  26. data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
  27. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  28. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  29. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  30. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  31. data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
  32. data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
  33. data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
  34. data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
  35. data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
  36. data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
  37. data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
  38. data/man/hammer.1.gz +0 -0
  39. data/test/reports/TEST-Fields-ContainerField-display-.xml +7 -0
  40. data/test/reports/TEST-Fields-ContainerField-display-blank-is-allowed.xml +15 -0
  41. data/test/reports/TEST-Fields-ContainerField-display-blank-is-not-allowed.xml +15 -0
  42. data/test/reports/TEST-Fields-ContainerField.xml +7 -0
  43. data/test/reports/TEST-Fields-Field-display-.xml +7 -0
  44. data/test/reports/TEST-Fields-Field-display-blank-is-allowed.xml +11 -0
  45. data/test/reports/TEST-Fields-Field-display-blank-is-not-allowed.xml +11 -0
  46. data/test/reports/TEST-Fields-Field-hide-blank-.xml +11 -0
  47. data/test/reports/TEST-Fields-Field-parameters.xml +9 -0
  48. data/test/reports/TEST-Fields-Field.xml +13 -0
  49. data/test/reports/TEST-HammerCLI-AbstractCommand-build-options.xml +15 -0
  50. data/test/reports/TEST-HammerCLI-AbstractCommand-exception-handler.xml +13 -0
  51. data/test/reports/TEST-HammerCLI-AbstractCommand-logging.xml +21 -0
  52. data/test/reports/TEST-HammerCLI-AbstractCommand-option-builder.xml +11 -0
  53. data/test/reports/TEST-HammerCLI-AbstractCommand-options.xml +11 -0
  54. data/test/reports/TEST-HammerCLI-AbstractCommand-output.xml +19 -0
  55. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-remove-subcommand.xml +11 -0
  56. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand-.xml +13 -0
  57. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand.xml +11 -0
  58. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior.xml +7 -0
  59. data/test/reports/TEST-HammerCLI-AbstractCommand.xml +11 -0
  60. data/test/reports/TEST-HammerCLI-Apipie-Command-options.xml +11 -0
  61. data/test/reports/TEST-HammerCLI-Apipie-Command-resource-defined.xml +9 -0
  62. data/test/reports/TEST-HammerCLI-Apipie-Command-setting-resources.xml +19 -0
  63. data/test/reports/TEST-HammerCLI-Apipie-Command.xml +9 -0
  64. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-aliasing-resources.xml +13 -0
  65. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-filtering-options.xml +15 -0
  66. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-required-options.xml +11 -0
  67. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-setting-correct-normalizers.xml +9 -0
  68. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-hash-params.xml +11 -0
  69. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-one-simple-param.xml +15 -0
  70. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder.xml +7 -0
  71. data/test/reports/TEST-HammerCLI-Completer-command-completion.xml +29 -0
  72. data/test/reports/TEST-HammerCLI-Completer-option-value-completion.xml +17 -0
  73. data/test/reports/TEST-HammerCLI-Completer-subcommand-completion.xml +19 -0
  74. data/test/reports/TEST-HammerCLI-Completer.xml +7 -0
  75. data/test/reports/TEST-HammerCLI-CompleterLine-line-complete.xml +25 -0
  76. data/test/reports/TEST-HammerCLI-CompleterLine-splitting-words.xml +29 -0
  77. data/test/reports/TEST-HammerCLI-CompleterLine.xml +7 -0
  78. data/test/reports/TEST-HammerCLI-CompleterWord-complete-.xml +23 -0
  79. data/test/reports/TEST-HammerCLI-CompleterWord-quote.xml +15 -0
  80. data/test/reports/TEST-HammerCLI-CompleterWord-quoted-.xml +13 -0
  81. data/test/reports/TEST-HammerCLI-CompleterWord.xml +7 -0
  82. data/test/reports/TEST-HammerCLI-Connection.xml +21 -0
  83. data/test/reports/TEST-HammerCLI-ExceptionHandler.xml +21 -0
  84. data/test/reports/TEST-HammerCLI-I18n.xml +11 -0
  85. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-password.xml +11 -0
  86. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-username.xml +11 -0
  87. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-verbose.xml +9 -0
  88. data/test/reports/TEST-HammerCLI-MainCommand-loading-context.xml +7 -0
  89. data/test/reports/TEST-HammerCLI-MainCommand.xml +7 -0
  90. data/test/reports/TEST-HammerCLI-Modules-find-by-name.xml +13 -0
  91. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-not-found.xml +13 -0
  92. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-runtime-exception.xml +13 -0
  93. data/test/reports/TEST-HammerCLI-Modules-load-a-module-success.xml +15 -0
  94. data/test/reports/TEST-HammerCLI-Modules-load-a-module.xml +7 -0
  95. data/test/reports/TEST-HammerCLI-Modules-load-all-modules.xml +9 -0
  96. data/test/reports/TEST-HammerCLI-Modules-names.xml +13 -0
  97. data/test/reports/TEST-HammerCLI-Modules.xml +7 -0
  98. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.0.xml +7 -0
  99. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.xml +11 -0
  100. data/test/reports/TEST-HammerCLI-Options-Normalizers-abstract.xml +9 -0
  101. data/test/reports/TEST-HammerCLI-Options-Normalizers-bool.xml +31 -0
  102. data/test/reports/TEST-HammerCLI-Options-Normalizers-datetime.xml +17 -0
  103. data/test/reports/TEST-HammerCLI-Options-Normalizers-enum.xml +15 -0
  104. data/test/reports/TEST-HammerCLI-Options-Normalizers-enumlist.xml +21 -0
  105. data/test/reports/TEST-HammerCLI-Options-Normalizers-json-input.xml +15 -0
  106. data/test/reports/TEST-HammerCLI-Options-Normalizers-key-value-list.xml +17 -0
  107. data/test/reports/TEST-HammerCLI-Options-Normalizers-list.xml +15 -0
  108. data/test/reports/TEST-HammerCLI-Options-Normalizers.xml +7 -0
  109. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-context.xml +9 -0
  110. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-formatters.xml +11 -0
  111. data/test/reports/TEST-HammerCLI-Options-OptionDefinition.xml +7 -0
  112. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-error-messages.xml +15 -0
  113. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-messages.xml +11 -0
  114. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-test-data-for-field.xml +15 -0
  115. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract.xml +17 -0
  116. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection-show-ids.xml +9 -0
  117. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection.xml +27 -0
  118. data/test/reports/TEST-HammerCLI-Output-Adapter-Base.xml +7 -0
  119. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-formatters.xml +11 -0
  120. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-collections.xml +13 -0
  121. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-containers.xml +11 -0
  122. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-ids.xml +11 -0
  123. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection.xml +11 -0
  124. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-message.xml +11 -0
  125. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues.xml +7 -0
  126. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-column-width.xml +15 -0
  127. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-formatters.xml +11 -0
  128. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-handle-ids.xml +11 -0
  129. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-sort-columns.xml +9 -0
  130. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection.xml +11 -0
  131. data/test/reports/TEST-HammerCLI-Output-Adapter-Table.xml +7 -0
  132. data/test/reports/TEST-HammerCLI-Output-Definition-empty-.xml +11 -0
  133. data/test/reports/TEST-HammerCLI-Output-Definition.xml +11 -0
  134. data/test/reports/TEST-HammerCLI-Output-Dsl-collection.xml +13 -0
  135. data/test/reports/TEST-HammerCLI-Output-Dsl-custom-fields.xml +11 -0
  136. data/test/reports/TEST-HammerCLI-Output-Dsl-fields.xml +15 -0
  137. data/test/reports/TEST-HammerCLI-Output-Dsl-label.xml +13 -0
  138. data/test/reports/TEST-HammerCLI-Output-Dsl-path-definition.xml +13 -0
  139. data/test/reports/TEST-HammerCLI-Output-Dsl.xml +9 -0
  140. data/test/reports/TEST-HammerCLI-Output-FieldFilter.xml +13 -0
  141. data/test/reports/TEST-HammerCLI-Output-Formatters-BooleanFormatter.xml +11 -0
  142. data/test/reports/TEST-HammerCLI-Output-Formatters-ColorFormatter.xml +9 -0
  143. data/test/reports/TEST-HammerCLI-Output-Formatters-DateFormatter.xml +11 -0
  144. data/test/reports/TEST-HammerCLI-Output-Formatters-FieldFormatter.xml +13 -0
  145. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterContainer.xml +13 -0
  146. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterLibrary.xml +11 -0
  147. data/test/reports/TEST-HammerCLI-Output-Formatters-KeyValueFormatter.xml +13 -0
  148. data/test/reports/TEST-HammerCLI-Output-Formatters-ListFormatter.xml +13 -0
  149. data/test/reports/TEST-HammerCLI-Output-Formatters-LongTextFormatter.xml +13 -0
  150. data/test/reports/TEST-HammerCLI-Output-Output-adapters.xml +17 -0
  151. data/test/reports/TEST-HammerCLI-Output-Output-data.xml +15 -0
  152. data/test/reports/TEST-HammerCLI-Output-Output-formatters.xml +9 -0
  153. data/test/reports/TEST-HammerCLI-Output-Output-messages.xml +19 -0
  154. data/test/reports/TEST-HammerCLI-Output-Output.xml +7 -0
  155. data/test/reports/TEST-HammerCLI-Output-RecordCollection.xml +13 -0
  156. data/test/reports/TEST-HammerCLI-Settings-load-from-paths.xml +15 -0
  157. data/test/reports/TEST-HammerCLI-Settings.xml +25 -0
  158. data/test/reports/TEST-HammerCLI-ShellHistory-loading-old-history.xml +11 -0
  159. data/test/reports/TEST-HammerCLI-ShellHistory-saving-history.xml +15 -0
  160. data/test/reports/TEST-HammerCLI-ShellHistory.xml +7 -0
  161. data/test/reports/TEST-MiniTest-Spec.xml +7 -0
  162. data/test/reports/TEST-String-camelize.xml +11 -0
  163. data/test/reports/TEST-String-formatting.xml +17 -0
  164. data/test/reports/TEST-String-indent.xml +11 -0
  165. data/test/reports/TEST-String-interactive-.xml +13 -0
  166. data/test/reports/TEST-String.xml +7 -0
  167. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint-exist-.xml +13 -0
  168. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint.xml +7 -0
  169. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint-exist-.xml +13 -0
  170. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint.xml +7 -0
  171. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-exist-.xml +9 -0
  172. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-rejected.xml +13 -0
  173. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-required.xml +13 -0
  174. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint.xml +7 -0
  175. data/test/reports/TEST-constraints.xml +7 -0
  176. data/test/unit/help/definition/list_test.rb +12 -0
  177. data/test/unit/help/definition/note_test.rb +18 -0
  178. data/test/unit/help/definition/text_test.rb +5 -0
  179. data/test/unit/output/adapter/abstract_test.rb +9 -9
  180. data/test/unit/output/formatters_test.rb +49 -6
  181. metadata +348 -67
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9220eb335ba2042ecc85e93719288e69ad5d2a72e38064d6751f0c3d616a653
4
- data.tar.gz: c094be038bcd4b5d0bf40471b17e3d5fb9bdb77ec0b8732823be3fd5254a1dca
3
+ metadata.gz: 257e54094a8995f71d00dbe29299e84801b68404271de7baaad58b6a9207fe93
4
+ data.tar.gz: f14b2acba71f1a4ad5a237f7dc6da746a23245ba30c504e689bf5a319e5e86b2
5
5
  SHA512:
6
- metadata.gz: 9aab1c7d0ad045be9e220266ca5115b6675beffb5fa3d78ffbdbfa72034080287c42008a2d1a81a66a9ab5ac01d5b46e979903679821e73d54806b7deefd9f90
7
- data.tar.gz: be143c72f569e96b42dd4ba5ea11fad61169d4b4730b3d31f38ba36e225e241f5f884405c84df4ee279cfd6d62111c35d8b80ac441f396e1906c3166a5dbd171
6
+ metadata.gz: 559d6704483f5dd8bb2f27ba7c0f8d3c4212033297168fad4cdea0696ee4cd31f8421f1e79cd758b9f4228ff45d2c41751f7509091de0f92ab86a1dab4d97649
7
+ data.tar.gz: 2396627dc3f2b9d97dca8b0501dc2260b6c02d4a59fbf64e2fbfcdf625d913703dd02d47557193d575156f5a2b1270c81c57ff8caae08345675567d063ecc892
@@ -477,13 +477,7 @@ directly with `puts` in Hammer. The reason is we separate definition
477
477
  of the output from its interpretation. Hammer uses so called _output adapters_
478
478
  that can modify the output format.
479
479
 
480
- Hammer comes with four basic output adapters:
481
- * __base__ - simple output, structured records
482
- * __table__ - records printed in tables, ideal for printing lists of records
483
- * __csv__ - comma separated output, ideal for scripting and grepping
484
- * __silent__ - no output, used for testing
485
-
486
- The detailed documentation on creating adapters is coming soon.
480
+ The detailed documentation on adapters and related things is [here](output.md#adapters).
487
481
 
488
482
  #### Printing messages
489
483
  Very simple, just call
@@ -496,7 +490,7 @@ Typical usage of a CLI is interaction with some API. In many cases it's listing
496
490
  some records returned by the API.
497
491
 
498
492
  Hammer comes with support for selecting and formatting of hash record fields.
499
- You first create a _output definition_ that you apply to your data. The result
493
+ You first create an _output definition_ that you apply to your data. The result
500
494
  is a collection of fields, each having its type. The collection is then passed to an
501
495
  _output adapter_ which handles the actual formatting and printing.
502
496
 
@@ -8,6 +8,7 @@ before creating hammer specific plugins.
8
8
  Contents:
9
9
  - [Writing a plugin](writing_a_plugin.md#writing-your-own-hammer-plugin)
10
10
  - [Creating commands](creating_commands.md#create-your-first-command)
11
+ - [Output adapters, formatters, etc](output.md#output)
11
12
  - [Help modification](help_modification.md#modify-an-existing-help)
12
13
  - [Commands modification](commands_modification.md#modify-an-existing-command)
13
14
  - [Command extensions](commands_extension.md#extend-an-existing-command)
@@ -16,6 +17,7 @@ Contents:
16
17
  - [Development tips](development_tips.md#development-tips)
17
18
  - [Option normalizers](option_normalizers.md#option-normalizers)
18
19
  - [Internationalization](i18n.md#internationalization)
20
+ - [PR review checklist](review_checklist.md)
19
21
 
20
22
  Links:
21
23
  - slides from tutorial at Config Management Camp 2015: [Hacking with hammer](https://tstrachota.fedorapeople.org/slides/hacking_with_hammer/)
@@ -1,6 +1,38 @@
1
- Modify an existing help
2
- -------------------------
3
- Each command might have its own help definition. This definition is composed of various _help items_, which might contain their own definitions.
1
+ # Modify an existing help
2
+
3
+ ### Help items
4
+ Before modifying help, it's good to know which help items are available to use.
5
+ There is a list with currently available items:
6
+ ```ruby
7
+ Command.extend_help do |h|
8
+ # Add a simple text to the help output.
9
+ # content - String - text to be shown
10
+ # options - Hash - options (id:, richtext:)
11
+ h.text(content, options = {})
12
+ # Add a notification to the help output (LABEL: content).
13
+ # content - String - text to be shown
14
+ # options - Hash - options (same as #text, label:)
15
+ h.note(content, options = {})
16
+ # Add a list of items to the help output.
17
+ # items - Array - array of items to be shown. Each item can be either string
18
+ # or an array of ['Key', 'Value', bold: true/false].
19
+ # Item options are optional.
20
+ # Example: h.list(['a', 'b', 'c']) => "a\n b\n c\n"
21
+ # h.list([['a', 'b', bold: true], ['c', 'd']]) => "a b\nc d\n"
22
+ # options - Hash - same as #text
23
+ h.list(items, options = {})
24
+ # Add a section to the help output.
25
+ # label - String - Section header
26
+ # options - Hash - same as #text
27
+ # block - block with section definition (may include lists/texts/etc.)
28
+ h.section(label, options = {}) { |h| ... }
29
+ end
30
+ ```
31
+ Every `Section`, `List` and simple `Text` is _help item_ defined as `HammerCLI::Help::AbstractItem`, so everything might have its own ID now for easier addressing.
32
+
33
+ ### Help modification
34
+
35
+ Each command might have its own help definition. This definition is composed of various [_help items_](#Help-items), which might contain their own definitions.
4
36
 
5
37
  Let's say `hammer host create -h` help string has the following structure:
6
38
  ```
@@ -32,7 +64,6 @@ hammer host create -h
32
64
  | | | +-- Section
33
65
  | | | | +-- List
34
66
  ```
35
- Every `Section`, `List` and simple `Text` is _help item_ defined as `HammerCLI::Help::AbstractItem`, so everything might have its own ID now for easier addressing.
36
67
 
37
68
  To modify the structure above, you might use the following:
38
69
  ```ruby
data/doc/output.md ADDED
@@ -0,0 +1,43 @@
1
+ Output
2
+ ------------------------------
3
+
4
+ ### Adapters
5
+ Output adapter is responsible for rendering the output in a specific way using
6
+ __formatters__ (see below).
7
+ Hammer comes with following adapters:
8
+ * __base__ - simple output, structured records
9
+ * __table__ - records printed in tables, ideal for printing lists of records
10
+ * __csv__ - comma separated output, ideal for scripting and grepping
11
+ * __yaml__ - YAML output
12
+ * __json__ - JSON output
13
+ * __silent__ - no output, used for testing
14
+
15
+ ### Formatters
16
+ Formatter is a bit of code that can modify a representation of a field during
17
+ output rendering. Formatter is registered for specific field type. Each field
18
+ type can have multiple formatters.
19
+ * __ColorFormatter__ - colors data with a specific color
20
+ * __DateFormatter__ - formats a date string with `%Y/%m/%d %H:%M:%S` style
21
+ * __ListFormatter__ - formats an array of data with csv style
22
+ * __KeyValueFormatter__ - formats a hash with `key => value` style
23
+ * __BooleanFormatter__ - converts `1/0`/`true/false`/`""` to `"yes"`/`"no"`
24
+ * __LongTextFormatter__ - adds a new line at the start of the data string
25
+ * __InlineTextFormatter__ - removes all new lines from data string
26
+ * __MultilineTextFormatter__ - splits a long data string to fixed size chunks
27
+ with indentation
28
+
29
+ ### Formatter/Adapter features
30
+ Currently used formatter (or adapter) features are of two kinds.
31
+ The first one help us to align by structure of the output:
32
+ * __:serialized__ - means the fields are serialized into a string (__table__, __csv__, __base__ adapters)
33
+ * __:structured__ - means the output is structured (__yaml__, __json__ adapters)
34
+ * __:inline__ - means that the value will be rendered into single line without newlines (__table__, __csv__ adapters)
35
+ * __:multiline__ - means that the properly indented value will be printed over multiple lines (__base__ adapter)
36
+
37
+ The other kind serves to distinguish the cases where we can use the xterm colors
38
+ to improve the output:
39
+ * __:rich_text__ - means we can use the xterm colors (__table__, __base__ adapters)
40
+ * __:plain_text__ - unused yet
41
+
42
+ All the features the formatter has need to match (be present in) the adapter's
43
+ features. Otherwise the formatter won't apply.
data/doc/release_notes.md CHANGED
@@ -1,7 +1,11 @@
1
1
  Release notes
2
2
  =============
3
- ### 0.18.1 (2019-10-31)
4
- * Allow schema building for custom options ([PR #316](https://github.com/theforeman/hammer-cli/pull/316)), [#27899](http://projects.theforeman.org/issues/27899)
3
+ ### 0.19.0 (2019-10-26)
4
+ * Allow schema building for custom options ([PR #316](https://github.com/Apipie/apipie-bindings/pull/316)), [#27899](http://projects.theforeman.org/issues/27899)
5
+ * New lines in text attr dont break output ([PR #300](https://github.com/Apipie/apipie-bindings/pull/300)), [#25878](http://projects.theforeman.org/issues/25878)
6
+ * Added error to wrong --output ([PR #315](https://github.com/Apipie/apipie-bindings/pull/315)), [#21590](http://projects.theforeman.org/issues/21590)
7
+ * Pr review checklist ([PR #305](https://github.com/Apipie/apipie-bindings/pull/305)), [#26950](http://projects.theforeman.org/issues/26950)
8
+ * List items in help with customization ([PR #309](https://github.com/Apipie/apipie-bindings/pull/309)), [#27237](http://projects.theforeman.org/issues/27237)
5
9
 
6
10
  ### 0.18.0 (2019-08-01)
7
11
  * Unsure minimal label length ([PR #310](https://github.com/theforeman/hammer-cli/pull/310)) ([#26960](http://projects.theforeman.org/issues/26960))
@@ -0,0 +1,17 @@
1
+ PR review Checklist
2
+ -------------------
3
+ Before the PR in hammer project is merged the reviewer should check the following things:
4
+ - [ ] Related issue exists
5
+ - [ ] Commit message is in correct format
6
+ - [ ] The patch fixes the problem described in the issue
7
+ - [ ] UX is consistent across commands
8
+ - [ ] The fix is in the right repo hammer core/hammer plugin/API
9
+ - [ ] It doesn't break compatibility for users
10
+ - [ ] It doesn't break compatibility for hammer plugins (even hammer-cli-foreman is extended by plugins)
11
+ - [ ] Strings are translated and the translations are properly formated
12
+ - [ ] The code is readable and understandable
13
+ - [ ] The code style is consistent with already existing
14
+ - [ ] Docs updated if changing documented patterns or adding new ones
15
+ - [ ] Tests for the new functionality/fix are added
16
+ - [ ] Automated tests are green
17
+ - [ ] Note if multiple commits needs squash on merge
@@ -1,5 +1,6 @@
1
1
  require_relative 'definition/abstract_item'
2
2
  require_relative 'definition/text'
3
+ require_relative 'definition/note'
3
4
  require_relative 'definition/list'
4
5
  require_relative 'definition/section'
5
6
 
@@ -3,12 +3,13 @@ module HammerCLI
3
3
  class AbstractItem
4
4
  INDENT_STEP = 2
5
5
 
6
- attr_reader :id
6
+ attr_reader :id, :richtext
7
7
  attr_accessor :definition
8
8
 
9
9
  def initialize(options = {})
10
10
  @id = options[:id]
11
11
  @indentation = options[:indentation]
12
+ @richtext = options[:richtext] || false
12
13
  end
13
14
 
14
15
  def build_string
@@ -36,9 +36,12 @@ module HammerCLI
36
36
  end
37
37
 
38
38
  def format_item(item)
39
- col1, col2 = item
39
+ col1, col2, options = item
40
+ options ||= {}
41
+ col1 = HighLine.color(col1.to_s, :bold) if options[:bold]
40
42
  col2 = indent(col2.to_s, ' ' * @indent_size).lstrip
41
- line = "%-#{@indent_size}s%s" % [col1, col2]
43
+ padding = col1.length - HammerCLI::Output::Utils.real_length(col1)
44
+ line = "%-#{@indent_size + padding}s%s" % [col1, col2]
42
45
  line.strip!
43
46
  line
44
47
  end
@@ -0,0 +1,30 @@
1
+ module HammerCLI
2
+ module Help
3
+ class Note < Text
4
+ def initialize(text, options = {})
5
+ @label = options[:label] || _('NOTE')
6
+ super
7
+ end
8
+
9
+ def build_string
10
+ @text
11
+ end
12
+
13
+ protected
14
+
15
+ def build_definition(content)
16
+ @text = heading + ' '
17
+ @text += content.to_s
18
+ @definition = Definition.new([self])
19
+ end
20
+
21
+ private
22
+
23
+ def heading
24
+ @label += ':'
25
+ @label = HighLine.color(@label, :bold) if @richtext
26
+ @label
27
+ end
28
+ end
29
+ end
30
+ end
@@ -6,7 +6,6 @@ module HammerCLI
6
6
  def initialize(label, definition = nil, options = {})
7
7
  super(options)
8
8
  @label = label
9
- @richtext = options[:richtext] || false
10
9
  @id ||= label
11
10
  build_definition(definition)
12
11
  end
@@ -7,7 +7,9 @@ module HammerCLI
7
7
  end
8
8
 
9
9
  def build_string
10
- @text
10
+ text = @text
11
+ text = HighLine.color(@text, :bold) if @richtext
12
+ text
11
13
  end
12
14
 
13
15
  protected
@@ -18,9 +18,14 @@ module HammerCLI
18
18
  @definition << HammerCLI::Help::Text.new(content, options)
19
19
  end
20
20
 
21
- def list(items, options = {})
21
+ def note(content, options = {})
22
+ @definition << HammerCLI::Help::Note.new(content, options)
23
+ end
24
+
25
+ def list(items, options = {}, &block)
22
26
  return if items.empty?
23
- @definition << HammerCLI::Help::List.new(items, options)
27
+
28
+ @definition << HammerCLI::Help::List.new(items, options, &block)
24
29
  end
25
30
 
26
31
  def section(label, options = {}, &block)
@@ -47,8 +47,8 @@ module HammerCLI
47
47
  :context_target => :interactive
48
48
  option ["--no-headers"], :flag, _("Hide headers from output")
49
49
  option ["--csv"], :flag, _("Output as CSV (same as --output=csv)")
50
- option ["--output"], "ADAPTER", _("Set output format. One of [%s]") %
51
- HammerCLI::Output::Output.adapters.keys.join(', '),
50
+ option ["--output"], "ADAPTER", _("Set output format"),
51
+ format: HammerCLI::Options::Normalizers::Enum.new(HammerCLI::Output::Output.adapters.keys.map(&:to_s)),
52
52
  :context_target => :adapter
53
53
  option ["--output-file"], "OUTPUT_FILE", _("Path to custom output file") do |filename|
54
54
  begin
@@ -3,7 +3,13 @@ module HammerCLI::Output::Adapter
3
3
  class Abstract
4
4
 
5
5
  def tags
6
- []
6
+ %i[]
7
+ end
8
+
9
+ def features
10
+ return %i[] if tags.empty?
11
+
12
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
7
13
  end
8
14
 
9
15
  def initialize(context={}, formatters={}, filters = {})
@@ -101,9 +107,9 @@ module HammerCLI::Output::Adapter
101
107
  formatters_map ||= {}
102
108
  formatters_map.inject({}) do |map, (type, formatter_list)|
103
109
  # remove incompatible formatters
104
- filtered = formatter_list.select { |f| f.match?(tags) }
110
+ filtered = formatter_list.select { |f| f.match?(features) }
105
111
  # put serializers first
106
- map[type] = filtered.sort_by { |f| f.tags.include?(:flat) ? 0 : 1 }
112
+ map[type] = filtered.sort_by { |f| f.required_features.include?(:serialized) ? 0 : 1 }
107
113
  map
108
114
  end
109
115
  end
@@ -4,8 +4,10 @@ module HammerCLI::Output::Adapter
4
4
  GROUP_INDENT = " "*4
5
5
  LABEL_DIVIDER = ": "
6
6
 
7
- def tags
8
- [:flat, :screen]
7
+ def features
8
+ return %i[serialized rich_text multiline] if tags.empty?
9
+
10
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
9
11
  end
10
12
 
11
13
  def print_record(fields, record)
@@ -131,8 +131,10 @@ module HammerCLI::Output::Adapter
131
131
  @paginate_by_default = false
132
132
  end
133
133
 
134
- def tags
135
- [:flat]
134
+ def features
135
+ return %i[serialized inline] if tags.empty?
136
+
137
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
136
138
  end
137
139
 
138
140
  def row_data(fields, collection)
@@ -12,8 +12,10 @@ module HammerCLI::Output::Adapter
12
12
  LINE_SEPARATOR = '-|-'
13
13
  COLUMN_SEPARATOR = ' | '
14
14
 
15
- def tags
16
- [:screen, :flat]
15
+ def features
16
+ return %i[rich_text serialized inline] if tags.empty?
17
+
18
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
17
19
  end
18
20
 
19
21
  def print_record(fields, record)
@@ -5,10 +5,10 @@ module HammerCLI::Output::Adapter
5
5
  @paginate_by_default = false
6
6
  end
7
7
 
8
- def tags
9
- [
10
- :data
11
- ]
8
+ def features
9
+ return %i[structured] if tags.empty?
10
+
11
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
12
12
  end
13
13
 
14
14
  def prepare_collection(fields, collection)
@@ -109,6 +109,9 @@ module Fields
109
109
  class LongText < Field
110
110
  end
111
111
 
112
+ class Text < Field
113
+ end
114
+
112
115
  class KeyValue < Field
113
116
  end
114
117
 
@@ -24,28 +24,37 @@ module HammerCLI::Output
24
24
  end
25
25
  end
26
26
 
27
- # Tags:
28
- # All the tags the formatter has, needs to be present in the addapter.
29
- # Otherwise the formatter won't apply. Formatters with :flat tag are used first
30
- # as we expect them to serialize the value.
31
- #
32
- # - by format: :flat x :data
33
- # - by output: :file X :screen
34
-
35
27
  # abstract formatter
36
28
  class FieldFormatter
37
-
38
29
  def tags
39
- []
30
+ %i[]
31
+ end
32
+
33
+ def required_features
34
+ return %i[] if tags.empty?
35
+
36
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
40
37
  end
41
38
 
42
- def match?(other_tags)
43
- tags & other_tags == tags
39
+ def match?(features)
40
+ required_features & features == required_features
44
41
  end
45
42
 
46
43
  def format(data, field_params={})
47
44
  data
48
45
  end
46
+
47
+ def self.inherited(subclass)
48
+ subclass.define_singleton_method(:method_added) do |method_name|
49
+ if method_name == :tags
50
+ warn(
51
+ _('Method %{tags} for field formatters and output adapters is deprecated. Please use %{feat} or %{req_feat} instead.') % {
52
+ tags: 'tags', feat: 'features', req_feat: 'required_features'
53
+ }
54
+ )
55
+ end
56
+ end
57
+ end
49
58
  end
50
59
 
51
60
  class FormatterContainer < FieldFormatter
@@ -69,8 +78,10 @@ module HammerCLI::Output
69
78
  @color = color
70
79
  end
71
80
 
72
- def tags
73
- [:screen, :flat]
81
+ def required_features
82
+ return %i[rich_text serialized] if tags.empty?
83
+
84
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
74
85
  end
75
86
 
76
87
  def format(data, field_params={})
@@ -80,8 +91,10 @@ module HammerCLI::Output
80
91
 
81
92
  class DateFormatter < FieldFormatter
82
93
 
83
- def tags
84
- [:flat]
94
+ def required_features
95
+ return %i[serialized] if tags.empty?
96
+
97
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
85
98
  end
86
99
 
87
100
  def format(string_date, field_params={})
@@ -95,8 +108,10 @@ module HammerCLI::Output
95
108
  class ListFormatter < FieldFormatter
96
109
  INDENT = " "
97
110
 
98
- def tags
99
- [:flat]
111
+ def required_features
112
+ return %i[serialized] if tags.empty?
113
+
114
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
100
115
  end
101
116
 
102
117
  def format(list, field_params={})
@@ -117,8 +132,10 @@ module HammerCLI::Output
117
132
 
118
133
  class KeyValueFormatter < FieldFormatter
119
134
 
120
- def tags
121
- [:screen, :flat]
135
+ def required_features
136
+ return %i[rich_text serialized] if tags.empty?
137
+
138
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
122
139
  end
123
140
 
124
141
  def format(params, field_params={})
@@ -140,8 +157,10 @@ module HammerCLI::Output
140
157
  @indent = options[:indent].nil? ? true : options[:indent]
141
158
  end
142
159
 
143
- def tags
144
- [:screen]
160
+ def required_features
161
+ return %i[rich_text] if tags.empty?
162
+
163
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
145
164
  end
146
165
 
147
166
  def format(text, field_params={})
@@ -150,10 +169,42 @@ module HammerCLI::Output
150
169
  end
151
170
  end
152
171
 
172
+ class InlineTextFormatter < FieldFormatter
173
+ def required_features
174
+ return %i[serialized inline] if tags.empty?
175
+
176
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
177
+ end
178
+
179
+ def format(text, _field_params = {})
180
+ text.to_s.tr("\r\n", ' ')
181
+ end
182
+ end
183
+
184
+ class MultilineTextFormatter < FieldFormatter
185
+ INDENT = ' '.freeze
186
+ MAX_WIDTH = 120
187
+ MIN_WIDTH = 60
188
+
189
+ def required_features
190
+ return %i[serialized multiline rich_text] if tags.empty?
191
+
192
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
193
+ end
194
+
195
+ def format(text, field_params = {})
196
+ width = [[field_params.fetch(:width, 0), MIN_WIDTH].max, MAX_WIDTH].min
197
+ text.to_s.chars.each_slice(width).map(&:join).join("\n")
198
+ .indent_with(INDENT).prepend("\n")
199
+ end
200
+ end
201
+
153
202
  class BooleanFormatter < FieldFormatter
154
203
 
155
- def tags
156
- [:flat, :screen]
204
+ def required_features
205
+ return %i[serialized rich_text] if tags.empty?
206
+
207
+ tags.map { |t| HammerCLI::Output::Utils.tag_to_feature(t) }
157
208
  end
158
209
 
159
210
  def format(value, field_params={})
@@ -165,10 +216,9 @@ module HammerCLI::Output
165
216
  HammerCLI::Output::Output.register_formatter(ListFormatter.new, :List)
166
217
  HammerCLI::Output::Output.register_formatter(KeyValueFormatter.new, :KeyValue)
167
218
  HammerCLI::Output::Output.register_formatter(LongTextFormatter.new, :LongText)
219
+ HammerCLI::Output::Output.register_formatter(InlineTextFormatter.new, :Text)
220
+ HammerCLI::Output::Output.register_formatter(MultilineTextFormatter.new, :Text)
168
221
  HammerCLI::Output::Output.register_formatter(BooleanFormatter.new, :Boolean)
169
222
 
170
223
  end
171
224
  end
172
-
173
-
174
-