hammer_cli 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/bin/hammer +6 -0
  4. data/config/cli_config.template.yml +3 -0
  5. data/doc/creating_commands.md +19 -0
  6. data/doc/i18n.md +15 -0
  7. data/doc/installation.md +1 -1
  8. data/doc/release_notes.md +61 -0
  9. data/lib/hammer_cli/abstract.rb +10 -37
  10. data/lib/hammer_cli/apipie/command.rb +10 -6
  11. data/lib/hammer_cli/apipie/option_builder.rb +26 -13
  12. data/lib/hammer_cli/apipie/options.rb +12 -10
  13. data/lib/hammer_cli/completer.rb +2 -2
  14. data/lib/hammer_cli/exception_handler.rb +5 -4
  15. data/lib/hammer_cli/exceptions.rb +1 -0
  16. data/lib/hammer_cli/i18n.rb +41 -0
  17. data/lib/hammer_cli/main.rb +2 -2
  18. data/lib/hammer_cli/options/normalizers.rb +31 -0
  19. data/lib/hammer_cli/output/adapter/abstract.rb +5 -1
  20. data/lib/hammer_cli/output/adapter/csv.rb +140 -12
  21. data/lib/hammer_cli/shell.rb +6 -6
  22. data/lib/hammer_cli/subcommand.rb +82 -0
  23. data/lib/hammer_cli/utils.rb +13 -0
  24. data/lib/hammer_cli/version.rb +1 -1
  25. data/locale/Makefile +11 -10
  26. data/locale/README.md +18 -0
  27. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  28. data/locale/en/hammer-cli.po +227 -0
  29. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  30. data/locale/en_GB/hammer-cli.po +274 -0
  31. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  32. data/locale/es/hammer-cli.po +275 -0
  33. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  34. data/locale/fr/hammer-cli.po +276 -0
  35. data/locale/hammer-cli.pot +158 -93
  36. data/test/reports/TEST-Fields-ContainerField-display-.xml +7 -0
  37. data/test/reports/TEST-Fields-ContainerField-display-blank-is-allowed.xml +15 -0
  38. data/test/reports/TEST-Fields-ContainerField-display-blank-is-not-allowed.xml +15 -0
  39. data/test/reports/TEST-Fields-ContainerField.xml +7 -0
  40. data/test/reports/TEST-Fields-Field-display-.xml +7 -0
  41. data/test/reports/TEST-Fields-Field-display-blank-is-allowed.xml +11 -0
  42. data/test/reports/TEST-Fields-Field-display-blank-is-not-allowed.xml +11 -0
  43. data/test/reports/TEST-Fields-Field-hide-blank-.xml +11 -0
  44. data/test/reports/TEST-Fields-Field-parameters.xml +9 -0
  45. data/test/reports/TEST-Fields-Field.xml +13 -0
  46. data/test/reports/TEST-HammerCLI-AbstractCommand-build-options.xml +15 -0
  47. data/test/reports/TEST-HammerCLI-AbstractCommand-exception-handler.xml +13 -0
  48. data/test/reports/TEST-HammerCLI-AbstractCommand-logging.xml +21 -0
  49. data/test/reports/TEST-HammerCLI-AbstractCommand-option-builder.xml +11 -0
  50. data/test/reports/TEST-HammerCLI-AbstractCommand-options.xml +11 -0
  51. data/test/reports/TEST-HammerCLI-AbstractCommand-output.xml +19 -0
  52. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-remove-subcommand.xml +11 -0
  53. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand-.xml +13 -0
  54. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior-subcommand.xml +11 -0
  55. data/test/reports/TEST-HammerCLI-AbstractCommand-subcommand-behavior.xml +7 -0
  56. data/test/reports/TEST-HammerCLI-AbstractCommand.xml +11 -0
  57. data/test/reports/TEST-HammerCLI-Apipie-Command-options.xml +11 -0
  58. data/test/reports/TEST-HammerCLI-Apipie-Command-resource-defined.xml +9 -0
  59. data/test/reports/TEST-HammerCLI-Apipie-Command-setting-resources.xml +19 -0
  60. data/test/reports/TEST-HammerCLI-Apipie-Command.xml +9 -0
  61. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-aliasing-resources.xml +13 -0
  62. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-filtering-options.xml +15 -0
  63. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-required-options.xml +11 -0
  64. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-setting-correct-normalizers.xml +9 -0
  65. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-hash-params.xml +11 -0
  66. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder-with-one-simple-param.xml +15 -0
  67. data/test/reports/TEST-HammerCLI-Apipie-OptionBuilder.xml +7 -0
  68. data/test/reports/TEST-HammerCLI-Completer-command-completion.xml +29 -0
  69. data/test/reports/TEST-HammerCLI-Completer-option-value-completion.xml +17 -0
  70. data/test/reports/TEST-HammerCLI-Completer-subcommand-completion.xml +19 -0
  71. data/test/reports/TEST-HammerCLI-Completer.xml +7 -0
  72. data/test/reports/TEST-HammerCLI-CompleterLine-line-complete.xml +25 -0
  73. data/test/reports/TEST-HammerCLI-CompleterLine-splitting-words.xml +29 -0
  74. data/test/reports/TEST-HammerCLI-CompleterLine.xml +7 -0
  75. data/test/reports/TEST-HammerCLI-CompleterWord-complete-.xml +23 -0
  76. data/test/reports/TEST-HammerCLI-CompleterWord-quote.xml +15 -0
  77. data/test/reports/TEST-HammerCLI-CompleterWord-quoted-.xml +13 -0
  78. data/test/reports/TEST-HammerCLI-CompleterWord.xml +7 -0
  79. data/test/reports/TEST-HammerCLI-Connection.xml +21 -0
  80. data/test/reports/TEST-HammerCLI-ExceptionHandler.xml +21 -0
  81. data/test/reports/TEST-HammerCLI-I18n.xml +11 -0
  82. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-password.xml +11 -0
  83. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-username.xml +11 -0
  84. data/test/reports/TEST-HammerCLI-MainCommand-loading-context-verbose.xml +9 -0
  85. data/test/reports/TEST-HammerCLI-MainCommand-loading-context.xml +7 -0
  86. data/test/reports/TEST-HammerCLI-MainCommand.xml +7 -0
  87. data/test/reports/TEST-HammerCLI-Modules-find-by-name.xml +13 -0
  88. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-not-found.xml +13 -0
  89. data/test/reports/TEST-HammerCLI-Modules-load-a-module-module-runtime-exception.xml +13 -0
  90. data/test/reports/TEST-HammerCLI-Modules-load-a-module-success.xml +15 -0
  91. data/test/reports/TEST-HammerCLI-Modules-load-a-module.xml +7 -0
  92. data/test/reports/TEST-HammerCLI-Modules-load-all-modules.xml +9 -0
  93. data/test/reports/TEST-HammerCLI-Modules-names.xml +13 -0
  94. data/test/reports/TEST-HammerCLI-Modules.xml +7 -0
  95. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.0.xml +7 -0
  96. data/test/reports/TEST-HammerCLI-OptionBuilderContainer.xml +11 -0
  97. data/test/reports/TEST-HammerCLI-Options-Normalizers-abstract.xml +9 -0
  98. data/test/reports/TEST-HammerCLI-Options-Normalizers-bool.xml +31 -0
  99. data/test/reports/TEST-HammerCLI-Options-Normalizers-datetime.xml +17 -0
  100. data/test/reports/TEST-HammerCLI-Options-Normalizers-enum.xml +15 -0
  101. data/test/reports/TEST-HammerCLI-Options-Normalizers-enumlist.xml +21 -0
  102. data/test/reports/TEST-HammerCLI-Options-Normalizers-json-input.xml +15 -0
  103. data/test/reports/TEST-HammerCLI-Options-Normalizers-key-value-list.xml +17 -0
  104. data/test/reports/TEST-HammerCLI-Options-Normalizers-list.xml +15 -0
  105. data/test/reports/TEST-HammerCLI-Options-Normalizers.xml +7 -0
  106. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-context.xml +9 -0
  107. data/test/reports/TEST-HammerCLI-Options-OptionDefinition-formatters.xml +11 -0
  108. data/test/reports/TEST-HammerCLI-Options-OptionDefinition.xml +7 -0
  109. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-error-messages.xml +15 -0
  110. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-messages.xml +11 -0
  111. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract-test-data-for-field.xml +15 -0
  112. data/test/reports/TEST-HammerCLI-Output-Adapter-Abstract.xml +17 -0
  113. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection-show-ids.xml +9 -0
  114. data/test/reports/TEST-HammerCLI-Output-Adapter-Base-print-collection.xml +27 -0
  115. data/test/reports/TEST-HammerCLI-Output-Adapter-Base.xml +7 -0
  116. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-formatters.xml +11 -0
  117. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-collections.xml +13 -0
  118. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-fields-with-containers.xml +11 -0
  119. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection-handle-ids.xml +11 -0
  120. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-collection.xml +11 -0
  121. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues-print-message.xml +11 -0
  122. data/test/reports/TEST-HammerCLI-Output-Adapter-CSValues.xml +7 -0
  123. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-column-width.xml +15 -0
  124. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-formatters.xml +11 -0
  125. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-handle-ids.xml +11 -0
  126. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection-sort-columns.xml +9 -0
  127. data/test/reports/TEST-HammerCLI-Output-Adapter-Table-print-collection.xml +11 -0
  128. data/test/reports/TEST-HammerCLI-Output-Adapter-Table.xml +7 -0
  129. data/test/reports/TEST-HammerCLI-Output-Definition-empty-.xml +11 -0
  130. data/test/reports/TEST-HammerCLI-Output-Definition.xml +11 -0
  131. data/test/reports/TEST-HammerCLI-Output-Dsl-collection.xml +13 -0
  132. data/test/reports/TEST-HammerCLI-Output-Dsl-custom-fields.xml +11 -0
  133. data/test/reports/TEST-HammerCLI-Output-Dsl-fields.xml +15 -0
  134. data/test/reports/TEST-HammerCLI-Output-Dsl-label.xml +13 -0
  135. data/test/reports/TEST-HammerCLI-Output-Dsl-path-definition.xml +13 -0
  136. data/test/reports/TEST-HammerCLI-Output-Dsl.xml +9 -0
  137. data/test/reports/TEST-HammerCLI-Output-FieldFilter.xml +13 -0
  138. data/test/reports/TEST-HammerCLI-Output-Formatters-BooleanFormatter.xml +11 -0
  139. data/test/reports/TEST-HammerCLI-Output-Formatters-ColorFormatter.xml +9 -0
  140. data/test/reports/TEST-HammerCLI-Output-Formatters-DateFormatter.xml +11 -0
  141. data/test/reports/TEST-HammerCLI-Output-Formatters-FieldFormatter.xml +13 -0
  142. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterContainer.xml +13 -0
  143. data/test/reports/TEST-HammerCLI-Output-Formatters-FormatterLibrary.xml +11 -0
  144. data/test/reports/TEST-HammerCLI-Output-Formatters-KeyValueFormatter.xml +13 -0
  145. data/test/reports/TEST-HammerCLI-Output-Formatters-ListFormatter.xml +13 -0
  146. data/test/reports/TEST-HammerCLI-Output-Formatters-LongTextFormatter.xml +13 -0
  147. data/test/reports/TEST-HammerCLI-Output-Output-adapters.xml +17 -0
  148. data/test/reports/TEST-HammerCLI-Output-Output-data.xml +15 -0
  149. data/test/reports/TEST-HammerCLI-Output-Output-formatters.xml +9 -0
  150. data/test/reports/TEST-HammerCLI-Output-Output-messages.xml +19 -0
  151. data/test/reports/TEST-HammerCLI-Output-Output.xml +7 -0
  152. data/test/reports/TEST-HammerCLI-Output-RecordCollection.xml +13 -0
  153. data/test/reports/TEST-HammerCLI-Settings-load-from-paths.xml +15 -0
  154. data/test/reports/TEST-HammerCLI-Settings.xml +25 -0
  155. data/test/reports/TEST-HammerCLI-ShellHistory-loading-old-history.xml +11 -0
  156. data/test/reports/TEST-HammerCLI-ShellHistory-saving-history.xml +15 -0
  157. data/test/reports/TEST-HammerCLI-ShellHistory.xml +7 -0
  158. data/test/reports/TEST-MiniTest-Spec.xml +7 -0
  159. data/test/reports/TEST-String-camelize.xml +11 -0
  160. data/test/reports/TEST-String-formatting.xml +17 -0
  161. data/test/reports/TEST-String-indent.xml +11 -0
  162. data/test/reports/TEST-String-interactive-.xml +13 -0
  163. data/test/reports/TEST-String.xml +7 -0
  164. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint-exist-.xml +13 -0
  165. data/test/reports/TEST-constraints-HammerCLI-Validator-AllConstraint.xml +7 -0
  166. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint-exist-.xml +13 -0
  167. data/test/reports/TEST-constraints-HammerCLI-Validator-AnyConstraint.xml +7 -0
  168. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-exist-.xml +9 -0
  169. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-rejected.xml +13 -0
  170. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint-required.xml +13 -0
  171. data/test/reports/TEST-constraints-HammerCLI-Validator-BaseConstraint.xml +7 -0
  172. data/test/reports/TEST-constraints.xml +7 -0
  173. data/test/unit/abstract_test.rb +15 -11
  174. data/test/unit/apipie/command_test.rb +29 -1
  175. data/test/unit/apipie/option_builder_test.rb +22 -0
  176. data/test/unit/fixtures/apipie/documented.json +44 -0
  177. data/test/unit/options/normalizers_test.rb +35 -0
  178. data/test/unit/output/adapter/csv_test.rb +104 -4
  179. data/test/unit/utils_test.rb +58 -0
  180. metadata +292 -6
@@ -12,28 +12,152 @@ module HammerCLI::Output::Adapter
12
12
 
13
13
  class CSValues < Abstract
14
14
 
15
+ class Cell
16
+ attr_accessor :field_wrapper, :data
17
+
18
+ def initialize(field_wrapper, data, formatters)
19
+ @field_wrapper = field_wrapper
20
+ @data = data
21
+ @formatters = formatters
22
+ end
23
+
24
+ def self.create_cells(field_wrappers, data, formatters)
25
+ results = []
26
+ field_wrappers.each do |field_wrapper|
27
+ field = field_wrapper.field
28
+ if field.is_a? Fields::Collection
29
+ results = results + expand_collection(field, data, formatters)
30
+ elsif field.is_a?(Fields::ContainerField)
31
+ results = results + expand_container(field, data, formatters)
32
+ else
33
+ results << Cell.new(field_wrapper, data, formatters)
34
+ end
35
+ end
36
+ return results
37
+ end
38
+
39
+ def formatted_value
40
+ formatter = @formatters.formatter_for_type(@field_wrapper.field.class)
41
+ formatter ? formatter.format(value) : value.to_s
42
+ end
43
+
44
+ def self.values(headers, cells)
45
+ headers.map do |header|
46
+ cell = cells.find { |cell| cell.in_column?(header) }
47
+ cell ? cell.formatted_value : ''
48
+ end
49
+ end
50
+
51
+ def self.headers(cells, context)
52
+ cells.map(&:field_wrapper).select { |fw| ! fw.is_id? ||
53
+ context[:show_ids] }.map(&:display_name)
54
+ end
55
+
56
+ def in_column?(header)
57
+ self.field_wrapper.display_name == header
58
+ end
59
+
60
+ private
61
+
62
+ def self.expand_collection(field, data, formatters)
63
+ results = []
64
+ collection_data = data_for_field(field, data) || []
65
+ collection_data.each_with_index do |child_data, i|
66
+ field.fields.each do |child_field|
67
+ child_field_wrapper = FieldWrapper.new(child_field)
68
+ child_field_wrapper.append_prefix(field.label)
69
+ child_field_wrapper.append_suffix((i + 1).to_s)
70
+ results << Cell.new(child_field_wrapper, collection_data[i] || {}, formatters)
71
+ end
72
+ end
73
+ results
74
+ end
75
+
76
+ def self.expand_container(field, data, formatters)
77
+ child_fields = FieldWrapper.wrap(field.fields)
78
+ child_fields.each{ |child| child.append_prefix(field.label) }
79
+ create_cells(child_fields, data_for_field(field, data), formatters)
80
+ end
81
+
82
+ def self.data_for_field(field, data)
83
+ HammerCLI::Output::Adapter::CSValues.data_for_field(field, data)
84
+ end
85
+
86
+ def value
87
+ Cell.data_for_field(@field_wrapper.field, data)
88
+ end
89
+ end
90
+
91
+ class FieldWrapper
92
+ attr_accessor :name, :field
93
+
94
+ def self.wrap(fields)
95
+ fields.map{ |f| FieldWrapper.new(f) }
96
+ end
97
+
98
+ def initialize(field)
99
+ @field = field
100
+ @name = nil
101
+ @prefixes = []
102
+ @suffixes = []
103
+ @data
104
+ end
105
+
106
+ def append_suffix(suffix)
107
+ @suffixes << suffix
108
+ end
109
+
110
+ def append_prefix(prefix)
111
+ @prefixes << prefix
112
+ end
113
+
114
+ def prefix
115
+ @prefixes.join("::")
116
+ end
117
+
118
+ def suffix
119
+ @suffixes.join("::")
120
+ end
121
+
122
+ def display_name
123
+ names = []
124
+ names << prefix unless prefix.empty?
125
+ names << @field.label if @field.label
126
+ names << suffix unless suffix.empty?
127
+ names.join("::")
128
+ end
129
+
130
+ def is_id?
131
+ self.field.class <= Fields::Id
132
+ end
133
+ end
134
+
15
135
  def tags
16
136
  [:flat]
17
137
  end
18
138
 
139
+ def row_data(fields, collection)
140
+ result = []
141
+ collection.each do |data|
142
+ result << Cell.create_cells(FieldWrapper.wrap(fields), data, @formatters)
143
+ end
144
+ result
145
+ end
146
+
19
147
  def print_record(fields, record)
20
148
  print_collection(fields, [record].flatten(1))
21
149
  end
22
150
 
23
151
  def print_collection(fields, collection)
152
+ rows = row_data(fields, collection)
153
+ # get headers using columns heuristic
154
+ headers = rows.map{ |r| Cell.headers(r, @context) }.max_by{ |headers| headers.size }
155
+ # or use headers from output definition
156
+ headers ||= default_headers(fields)
24
157
  csv_string = generate do |csv|
25
- # labels
26
- csv << fields.select{ |f| !(f.class <= Fields::Id) || @context[:show_ids] }.map { |f| f.label }
27
- # data
28
- collection.each do |d|
29
- csv << fields.inject([]) do |row, f|
30
- unless f.class <= Fields::Id && !@context[:show_ids]
31
- value = data_for_field(f, d)
32
- formatter = @formatters.formatter_for_type(f.class)
33
- row << ((formatter ? formatter.format(value) : value) || '')
34
- end
35
- row
36
- end
158
+ csv << headers if headers
159
+ rows.each do |row|
160
+ csv << Cell.values(headers, row)
37
161
  end
38
162
  end
39
163
  puts csv_string
@@ -73,6 +197,10 @@ module HammerCLI::Output::Adapter
73
197
  )
74
198
  end
75
199
 
200
+ def default_headers(fields)
201
+ fields.select{ |f| !(f.class <= Fields::Id) || @context[:show_ids] }.map { |f| f.label }
202
+ end
203
+
76
204
  end
77
205
 
78
206
  HammerCLI::Output::Output.register_adapter(:csv, CSValues)
@@ -28,7 +28,7 @@ module HammerCLI
28
28
 
29
29
  def self.load_commands(main_cls)
30
30
  cmds = main_cls.recognised_subcommands.select do |sub_cmd|
31
- !(sub_cmd.subcommand_class <= HammerCLI::ShellCommand)
31
+ !sub_cmd.is_called?("shell")
32
32
  end
33
33
  self.recognised_subcommands.push(*cmds)
34
34
  end
@@ -103,11 +103,11 @@ module HammerCLI
103
103
  line = HammerCLI::CompleterLine.new(line)
104
104
  ShellMainCommand.run('', line, context) unless line.empty?
105
105
  end
106
- rescue Interrupt => e
107
- puts
108
- system('stty', stty_save) # Restore
109
- exit
110
- end
106
+ rescue Interrupt; end
107
+
108
+ puts
109
+ system('stty', stty_save) # Restore
110
+ HammerCLI::EX_OK
111
111
  end
112
112
 
113
113
  private
@@ -0,0 +1,82 @@
1
+
2
+ module HammerCLI
3
+
4
+ module Subcommand
5
+
6
+ class LazyDefinition < Clamp::Subcommand::Definition
7
+
8
+ def initialize(names, description, subcommand_class_name, path)
9
+ @names = Array(names)
10
+ @description = description
11
+ @subcommand_class_name = subcommand_class_name
12
+ @path = path
13
+ @loaded = false
14
+ end
15
+
16
+ def loaded?
17
+ @loaded
18
+ end
19
+
20
+ def subcommand_class
21
+ if !@loaded
22
+ require @path
23
+ @loaded = true
24
+ @constantized_class = @subcommand_class_name.constantize
25
+ end
26
+ @constantized_class
27
+ end
28
+
29
+ end
30
+
31
+ def self.included(base)
32
+ base.extend(ClassMethods)
33
+ end
34
+
35
+ module ClassMethods
36
+ def remove_subcommand(name)
37
+ self.recognised_subcommands.delete_if do |sc|
38
+ if sc.is_called?(name)
39
+ logger.info "subcommand #{name} (#{sc.subcommand_class}) was removed."
40
+ true
41
+ else
42
+ false
43
+ end
44
+ end
45
+ end
46
+
47
+ def subcommand!(name, description, subcommand_class = self, &block)
48
+ remove_subcommand(name)
49
+ subcommand(name, description, subcommand_class, &block)
50
+ logger.info "subcommand #{name} (#{subcommand_class}) was created."
51
+ end
52
+
53
+ def subcommand(name, description, subcommand_class = self, &block)
54
+ existing = find_subcommand(name)
55
+ if existing
56
+ raise HammerCLI::CommandConflict, _("can't replace subcommand %<name>s (%<existing_class>s) with %<name>s (%<new_class>s)") % {
57
+ :name => name,
58
+ :existing_class => existing.subcommand_class,
59
+ :new_class => subcommand_class
60
+ }
61
+ end
62
+ super
63
+ end
64
+
65
+ def lazy_subcommand(name, description, subcommand_class, path)
66
+ # call original subcommand to ensure command's parameters are set correctly
67
+ # (hammer command SUBCOMMAND [ARGS] ...)
68
+ subcommand(name, description, Class)
69
+ # replace last subcommand definition with correct lazy-loaded one
70
+ recognised_subcommands[-1] = LazyDefinition.new(name, description, subcommand_class, path)
71
+ end
72
+
73
+ def lazy_subcommand!(name, description, subcommand_class, path)
74
+ remove_subcommand(name)
75
+ self.lazy_subcommand(name, description, subcommand_class, path)
76
+ logger.info "subcommand #{name} (#{subcommand_class}) was created."
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+ end
@@ -24,6 +24,11 @@ class String
24
24
  gsub(/^/, indent_str)
25
25
  end
26
26
 
27
+ def constantize
28
+ raise NameError, "Can't constantize empty string" if self.empty?
29
+ HammerCLI.constant_path(self)[-1]
30
+ end
31
+
27
32
  end
28
33
 
29
34
  module HammerCLI
@@ -34,4 +39,12 @@ module HammerCLI
34
39
  HammerCLI::Settings.get(:ui, :interactive) != false
35
40
  end
36
41
 
42
+ def self.constant_path(name)
43
+ path = name.to_s.split('::').inject([Object]) do |mod, class_name|
44
+ mod << mod[-1].const_get(class_name)
45
+ end
46
+ path.shift
47
+ path
48
+ end
49
+
37
50
  end
@@ -1,5 +1,5 @@
1
1
  module HammerCLI
2
2
  def self.version
3
- @version ||= Gem::Version.new '0.1.1'
3
+ @version ||= Gem::Version.new '0.1.2'
4
4
  end
5
5
  end
data/locale/Makefile CHANGED
@@ -7,6 +7,7 @@
7
7
  # make clean - clean everything
8
8
  #
9
9
  DOMAIN = hammer-cli
10
+ VERSION = $(shell ruby -e 'require "rubygems";spec = Gem::Specification::load("../hammer_cli.gemspec");puts spec.version')
10
11
  POTFILE = $(DOMAIN).pot
11
12
  MOFILE = $(DOMAIN).mo
12
13
  POFILES = $(shell find . -name '*.po')
@@ -45,20 +46,20 @@ uniq-po:
45
46
 
46
47
  tx-pull:
47
48
  tx pull -f
49
+ for f in $(POFILES) ; do \
50
+ sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
51
+ done
48
52
  -git commit -a -m "i18n - extracting new, pulling from tx"
49
53
 
50
54
  extract-strings:
51
- bundle exec rake locale:find DOMAIN=$(DOMAIN) SKIP_MODEL=1
55
+ bundle exec rake gettext:find
52
56
 
53
- tx-update: tx-pull extract-strings
54
- # merging po files is unnecessary when using transifex.com (amend that)
57
+ reset-po:
58
+ # merging po files is unnecessary when using transifex.com
55
59
  git checkout -- ../locale/*/*po
60
+
61
+ tx-update: tx-pull extract-strings reset-po $(MOFILES)
62
+ # amend mo files
63
+ git add ../locale/*/LC_MESSAGES
56
64
  git commit -a --amend -m "i18n - extracting new, pulling from tx"
57
65
  -echo Changes commited!
58
-
59
- # Remove all MO files
60
- clean:
61
- -rm -f messages.mo
62
- find . \( -name "*.mo" -o -name "*.pox" \) -exec rm -f '{}' ';'
63
- find . -path *LC_MESSAGES | xargs rm -rf
64
-
data/locale/README.md ADDED
@@ -0,0 +1,18 @@
1
+ Updating the translations
2
+ -------------------------
3
+
4
+ 1. Check if there are any new languages with progress more than 50% on [transifex](https://www.transifex.com/projects/p/foreman/resource/hammer-cli/). If so, do the following for each of the new languages:
5
+
6
+ ```
7
+ mkdir locale/<lang>
8
+ cp locale/hammer-cli.pot locale/<lang>/hammer-cli.po
9
+ ```
10
+ 2. Make sure you have `transifex-client` installed
11
+
12
+ 3. Update the translations. From GIT repo root directory run:
13
+
14
+ ```
15
+ make -C locale tx-update
16
+ ```
17
+
18
+ It will download translations from transifex, generates `mo` files, updates strings in `pot` file and wraps all the changes in a new commit. Transifex automatically updates its strings when the commit is pushed to Github.
Binary file
@@ -0,0 +1,227 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the hammer-cli package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: hammer-cli 0.1.2\n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "POT-Creation-Date: 2014-05-09 16:07-0400\n"
12
+ "PO-Revision-Date: 2014-03-04 16:38+0000\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "Language: \n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20
+
21
+ #: lib/hammer_cli/validator.rb:41
22
+ msgid "Unknown option name '%s'"
23
+ msgstr ""
24
+
25
+ #: lib/hammer_cli/validator.rb:62
26
+ msgid "You can't set all options %s at one time"
27
+ msgstr ""
28
+
29
+ #: lib/hammer_cli/validator.rb:63
30
+ msgid "Options %s are required"
31
+ msgstr ""
32
+
33
+ #: lib/hammer_cli/validator.rb:79
34
+ msgid "You can't set any of options %s"
35
+ msgstr ""
36
+
37
+ #: lib/hammer_cli/validator.rb:80
38
+ msgid "At least one of options %s is required"
39
+ msgstr ""
40
+
41
+ #: lib/hammer_cli/output/formatters.rb:154
42
+ msgid "no"
43
+ msgstr ""
44
+
45
+ #: lib/hammer_cli/output/formatters.rb:154
46
+ msgid "yes"
47
+ msgstr ""
48
+
49
+ #: lib/hammer_cli/output/adapter/csv.rb:47
50
+ msgid "Message"
51
+ msgstr ""
52
+
53
+ #: lib/hammer_cli/output/adapter/csv.rb:51
54
+ msgid "Id"
55
+ msgstr ""
56
+
57
+ #: lib/hammer_cli/output/adapter/csv.rb:56
58
+ msgid "Name"
59
+ msgstr ""
60
+
61
+ #: lib/hammer_cli/exception_handler.rb:60
62
+ msgid "Error: %s"
63
+ msgstr ""
64
+
65
+ #: lib/hammer_cli/exception_handler.rb:66
66
+ msgid "Error: %{message}\\n\\nSee: '%{path} --help'"
67
+ msgstr ""
68
+
69
+ #: lib/hammer_cli/exception_handler.rb:83
70
+ msgid "Invalid username or password"
71
+ msgstr ""
72
+
73
+ #: lib/hammer_cli/exception_handler.rb:90
74
+ msgid ""
75
+ "Could not load API description from the server\\n - is your server down?\\n"
76
+ "\\\\n \" - was \\\"#{rake_command}\\\" run on the server when "
77
+ "using apipie cache? (typical production settings))\\n\""
78
+ msgstr ""
79
+
80
+ #: lib/hammer_cli/logger.rb:28
81
+ msgid "No permissions to create log dir %s"
82
+ msgstr ""
83
+
84
+ #: lib/hammer_cli/logger.rb:43
85
+ msgid "File %s not writeable, won't log anything to the file!"
86
+ msgstr ""
87
+
88
+ #: lib/hammer_cli/modules.rb:10
89
+ msgid ""
90
+ "Legacy configuration of modules detected. Check section about configuration "
91
+ "in user manual"
92
+ msgstr ""
93
+
94
+ #: lib/hammer_cli/modules.rb:42
95
+ msgid "Warning: An error occured while loading module %s"
96
+ msgstr ""
97
+
98
+ #: lib/hammer_cli/shell.rb:10
99
+ msgid "Print help for commands"
100
+ msgstr ""
101
+
102
+ #: lib/hammer_cli/shell.rb:22
103
+ msgid "Exit interactive shell"
104
+ msgstr ""
105
+
106
+ #: lib/hammer_cli/shell.rb:120
107
+ msgid "Welcome to the hammer interactive shell"
108
+ msgstr ""
109
+
110
+ #: lib/hammer_cli/shell.rb:121
111
+ msgid "Type 'help' for usage information"
112
+ msgstr ""
113
+
114
+ #: lib/hammer_cli/shell.rb:122
115
+ msgid ""
116
+ "Command completion is disabled on ruby < 1.9 due to compatibility problems."
117
+ msgstr ""
118
+
119
+ #: lib/hammer_cli/shell.rb:138
120
+ msgid "Interactive shell"
121
+ msgstr ""
122
+
123
+ #: lib/hammer_cli/options/option_definition.rb:68
124
+ msgid "Can be specified multiple times. "
125
+ msgstr ""
126
+
127
+ #: lib/hammer_cli/options/option_definition.rb:69
128
+ msgid "Default: "
129
+ msgstr ""
130
+
131
+ #: lib/hammer_cli/options/option_definition.rb:69
132
+ msgid ", or "
133
+ msgstr ""
134
+
135
+ #: lib/hammer_cli/options/normalizers.rb:26
136
+ msgid "Comma-separated list of key=value."
137
+ msgstr ""
138
+
139
+ #: lib/hammer_cli/options/normalizers.rb:35
140
+ msgid "value must be defined as a comma-separated list of key=value"
141
+ msgstr ""
142
+
143
+ #: lib/hammer_cli/options/normalizers.rb:46
144
+ msgid "Comma separated list of values."
145
+ msgstr ""
146
+
147
+ #: lib/hammer_cli/options/normalizers.rb:58
148
+ msgid "One of true/false, yes/no, 1/0."
149
+ msgstr ""
150
+
151
+ #: lib/hammer_cli/options/normalizers.rb:68
152
+ msgid "value must be one of true/false, yes/no, 1/0"
153
+ msgstr ""
154
+
155
+ #: lib/hammer_cli/options/normalizers.rb:107
156
+ msgid "Unable to parse JSON input"
157
+ msgstr ""
158
+
159
+ #: lib/hammer_cli/options/normalizers.rb:120
160
+ msgid "One of %s"
161
+ msgstr ""
162
+
163
+ #: lib/hammer_cli/options/normalizers.rb:127
164
+ msgid "value must be one of '%s'"
165
+ msgstr ""
166
+
167
+ #: lib/hammer_cli/options/normalizers.rb:146
168
+ msgid "Date and time in YYYY-MM-DD HH:MM:SS or ISO 8601 format"
169
+ msgstr ""
170
+
171
+ #: lib/hammer_cli/options/normalizers.rb:153
172
+ msgid "'%s' is not a valid date"
173
+ msgstr ""
174
+
175
+ #: lib/hammer_cli/main.rb:7
176
+ msgid "be verbose"
177
+ msgstr ""
178
+
179
+ #: lib/hammer_cli/main.rb:8
180
+ msgid "show debugging output "
181
+ msgstr ""
182
+
183
+ #: lib/hammer_cli/main.rb:9
184
+ msgid "path to custom config file"
185
+ msgstr ""
186
+
187
+ #: lib/hammer_cli/main.rb:11
188
+ msgid "username to access the remote system"
189
+ msgstr ""
190
+
191
+ #: lib/hammer_cli/main.rb:13
192
+ msgid "password to access the remote system"
193
+ msgstr ""
194
+
195
+ #: lib/hammer_cli/main.rb:16
196
+ msgid "show version"
197
+ msgstr ""
198
+
199
+ #: lib/hammer_cli/main.rb:25
200
+ msgid "Show ids of associated resources"
201
+ msgstr ""
202
+
203
+ #: lib/hammer_cli/main.rb:27
204
+ msgid "Explicitly turn interactive mode on/off"
205
+ msgstr ""
206
+
207
+ #: lib/hammer_cli/main.rb:31
208
+ msgid "Output as CSV (same as --output=csv)"
209
+ msgstr ""
210
+
211
+ #: lib/hammer_cli/main.rb:32
212
+ msgid "Set output format. One of [%s]"
213
+ msgstr ""
214
+
215
+ #: lib/hammer_cli/main.rb:35
216
+ msgid "Character to separate the values"
217
+ msgstr ""
218
+
219
+ #: lib/hammer_cli/main.rb:39
220
+ msgid "Get list of possible endings"
221
+ msgstr ""
222
+
223
+ #: lib/hammer_cli/settings.rb:28
224
+ msgid ""
225
+ "Warning: location hammer.modules.d is deprecated, move your module "
226
+ "configurations to cli.modules.d"
227
+ msgstr ""