hammer_cli 0.15.1 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/doc/commands_modification.md +82 -0
  3. data/doc/creating_commands.md +78 -38
  4. data/doc/developer_docs.md +2 -0
  5. data/doc/help_modification.md +119 -0
  6. data/doc/i18n.md +2 -2
  7. data/doc/installation_rpm.md +3 -3
  8. data/doc/release_notes.md +9 -1
  9. data/lib/hammer_cli.rb +0 -1
  10. data/lib/hammer_cli/abstract.rb +44 -13
  11. data/lib/hammer_cli/exception_handler.rb +1 -1
  12. data/lib/hammer_cli/help/definition.rb +55 -0
  13. data/lib/hammer_cli/help/definition/abstract_item.rb +38 -0
  14. data/lib/hammer_cli/help/definition/list.rb +53 -0
  15. data/lib/hammer_cli/help/definition/section.rb +36 -0
  16. data/lib/hammer_cli/help/definition/text.rb +21 -0
  17. data/lib/hammer_cli/help/text_builder.rb +26 -49
  18. data/lib/hammer_cli/i18n.rb +0 -1
  19. data/lib/hammer_cli/options/option_collector.rb +12 -9
  20. data/lib/hammer_cli/options/option_processor.rb +17 -0
  21. data/lib/hammer_cli/options/processor_list.rb +37 -0
  22. data/lib/hammer_cli/options/sources/base.rb +17 -0
  23. data/lib/hammer_cli/options/sources/command_line.rb +3 -1
  24. data/lib/hammer_cli/options/sources/saved_defaults.rb +3 -1
  25. data/lib/hammer_cli/options/validators/base.rb +20 -0
  26. data/lib/hammer_cli/options/validators/dsl.rb +160 -0
  27. data/lib/hammer_cli/options/validators/dsl_block_validator.rb +19 -0
  28. data/lib/hammer_cli/output/adapter/csv.rb +11 -11
  29. data/lib/hammer_cli/output/adapter/tree_structure.rb +5 -3
  30. data/lib/hammer_cli/output/definition.rb +42 -4
  31. data/lib/hammer_cli/output/dsl.rb +4 -2
  32. data/lib/hammer_cli/output/fields.rb +9 -2
  33. data/lib/hammer_cli/testing/messages.rb +6 -6
  34. data/lib/hammer_cli/utils.rb +15 -0
  35. data/lib/hammer_cli/version.rb +1 -1
  36. data/locale/ca/LC_MESSAGES/hammer-cli.mo +0 -0
  37. data/locale/de/LC_MESSAGES/hammer-cli.mo +0 -0
  38. data/locale/en/LC_MESSAGES/hammer-cli.mo +0 -0
  39. data/locale/en_GB/LC_MESSAGES/hammer-cli.mo +0 -0
  40. data/locale/es/LC_MESSAGES/hammer-cli.mo +0 -0
  41. data/locale/fr/LC_MESSAGES/hammer-cli.mo +0 -0
  42. data/locale/it/LC_MESSAGES/hammer-cli.mo +0 -0
  43. data/locale/ja/LC_MESSAGES/hammer-cli.mo +0 -0
  44. data/locale/ko/LC_MESSAGES/hammer-cli.mo +0 -0
  45. data/locale/pt_BR/LC_MESSAGES/hammer-cli.mo +0 -0
  46. data/locale/ru/LC_MESSAGES/hammer-cli.mo +0 -0
  47. data/locale/zh_CN/LC_MESSAGES/hammer-cli.mo +0 -0
  48. data/locale/zh_TW/LC_MESSAGES/hammer-cli.mo +0 -0
  49. data/test/unit/abstract_test.rb +70 -5
  50. data/test/unit/exception_handler_test.rb +1 -1
  51. data/test/unit/help/definition/abstract_item_test.rb +33 -0
  52. data/test/unit/help/definition/list_test.rb +17 -0
  53. data/test/unit/help/definition/section_test.rb +25 -0
  54. data/test/unit/help/definition/text_test.rb +11 -0
  55. data/test/unit/help/definition_test.rb +236 -0
  56. data/test/unit/help/text_builder_test.rb +170 -1
  57. data/test/unit/options/option_collector_test.rb +18 -9
  58. data/test/unit/options/processor_list_test.rb +70 -0
  59. data/test/unit/{validator_test.rb → options/validators/dsl_test.rb} +57 -93
  60. data/test/unit/output/adapter/abstract_test.rb +3 -0
  61. data/test/unit/output/adapter/base_test.rb +5 -0
  62. data/test/unit/output/adapter/csv_test.rb +3 -0
  63. data/test/unit/output/adapter/json_test.rb +12 -0
  64. data/test/unit/output/adapter/table_test.rb +5 -0
  65. data/test/unit/output/adapter/yaml_test.rb +11 -0
  66. data/test/unit/output/definition_test.rb +221 -1
  67. data/test/unit/utils_test.rb +23 -0
  68. metadata +31 -5
  69. data/lib/hammer_cli/validator.rb +0 -172
@@ -425,14 +425,79 @@ describe HammerCLI::AbstractCommand do
425
425
  CmdOD2.output_definition.fields.length.must_equal 1
426
426
  end
427
427
 
428
- it "should allow for multiple validation blocks" do
429
- class CmdName1 < HammerCLI::AbstractCommand
430
- validate_options do; end
431
- validate_options do; end
428
+ describe 'validate_options' do
429
+ it "adds a validation block" do
430
+ cmd = Class.new(HammerCLI::AbstractCommand)
431
+ cmd.validate_options do; end
432
+
433
+ mode, target, validator = cmd.validation_blocks[0]
434
+
435
+ assert_equal :append, mode
436
+ assert_nil target
437
+ assert validator.is_a?(HammerCLI::Options::Validators::DSLBlockValidator)
438
+ end
439
+
440
+ it "allows for multiple validation blocks" do
441
+ cmd = Class.new(HammerCLI::AbstractCommand)
442
+ cmd.validate_options do; end
443
+ cmd.validate_options do; end
444
+
445
+ assert_equal 2, cmd.validation_blocks.length
432
446
  end
433
447
 
434
- assert_equal 2, CmdName1.validation_blocks.length
448
+ it "allows relative inserts of custom validators" do
449
+ custom_validator = mock('Validator')
450
+
451
+ cmd = Class.new(HammerCLI::AbstractCommand)
452
+ cmd.validate_options(:before, 'DefaultInputs', validator: custom_validator)
453
+
454
+ mode, target, validator = cmd.validation_blocks[0]
455
+
456
+ assert_equal :before, mode
457
+ assert_equal 'DefaultInputs', target
458
+ assert validator, custom_validator
459
+ end
435
460
  end
436
461
 
462
+ describe 'add_validators' do
463
+ it 'is called upon the option_collector initialization' do
464
+ cmd = Class.new(HammerCLI::AbstractCommand)
465
+
466
+ cmd_instance = cmd.new('', {})
467
+ cmd_instance.expects(:add_validators).with do |sources|
468
+ sources.map(&:name) == ['DefaultInputs']
469
+ end
470
+ cmd_instance.send(:option_collector)
471
+ end
472
+
473
+ it 'inserts validators' do
474
+ validator1 = stub('Validator1', :name => 'Validator1')
475
+ validator2 = stub('Validator2', :name => 'Validator2')
476
+ sources = HammerCLI::Options::ProcessorList.new([
477
+ stub('Source1', :name => 'Source1'),
478
+ stub('Source2', :name => 'Source2')
479
+ ])
480
+
481
+ cmd = Class.new(HammerCLI::AbstractCommand)
482
+ cmd.validate_options(:after, 'Source1', validator: validator1)
483
+ cmd.validate_options(validator: validator2)
484
+
485
+ cmd_instance = cmd.new('', {})
486
+ result = cmd_instance.send(:add_validators, sources)
487
+ assert_equal ['Source1', 'Validator1', 'Source2', 'Validator2'], result.map(&:name)
488
+ end
489
+
490
+ it 'allows for creating inheritable validators' do
491
+ validator1 = stub('Validator1', :name => 'Validator1')
492
+ cmd = Class.new(HammerCLI::AbstractCommand)
493
+ cmd.send(:define_method, :add_validators) { |sources| [ validator1 ] }
494
+
495
+ sub_cmd = Class.new(cmd)
496
+
497
+ cmd_instance = sub_cmd.new('', {})
498
+ result = cmd_instance.send(:option_collector).option_processor
499
+ assert_equal ['Validator1'], result.map(&:name)
500
+ end
501
+ end
437
502
  end
438
503
 
@@ -30,7 +30,7 @@ describe HammerCLI::ExceptionHandler do
30
30
  end
31
31
 
32
32
  it "should handle help request" do
33
- output.expects(:print_message).with(cmd.help, nil, verbosity: HammerCLI::V_QUIET)
33
+ output.expects(:print_message).with(cmd.help, {}, verbosity: HammerCLI::V_QUIET)
34
34
  handler.handle_exception(Clamp::HelpWanted.new(cmd), :heading => heading)
35
35
 
36
36
  end
@@ -0,0 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+
3
+ describe HammerCLI::Help::AbstractItem do
4
+ describe '#indent' do
5
+ let(:first_item) { HammerCLI::Help::Text.new('Lorem ipsum') }
6
+ let(:second_item) { HammerCLI::Help::Text.new(' Dolor sit amet') }
7
+ let(:sub_definition) { HammerCLI::Help::Definition.new([first_item, second_item]) }
8
+
9
+ it 'indents text' do
10
+ section = HammerCLI::Help::Section.new('Heading', sub_definition)
11
+ expected_result = [
12
+ 'Heading:',
13
+ ' Lorem ipsum',
14
+ '',
15
+ ' Dolor sit amet',
16
+ ''
17
+ ].join("\n")
18
+ section.build_string.must_equal(expected_result)
19
+ end
20
+
21
+ it 'indents text with custom padding' do
22
+ section = HammerCLI::Help::Section.new('Heading', sub_definition, indentation: '**')
23
+ expected_result = [
24
+ 'Heading:',
25
+ '**Lorem ipsum',
26
+ '**',
27
+ '** Dolor sit amet',
28
+ ''
29
+ ].join("\n")
30
+ section.build_string.must_equal(expected_result)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+
3
+ describe HammerCLI::Help::List do
4
+ describe '#build_string' do
5
+ let(:first_item) { [:first, 'This is first line'] }
6
+ let(:second_item) { [:second, 'This is second line'] }
7
+ let(:list) { HammerCLI::Help::List.new([first_item, second_item]) }
8
+
9
+ it 'builds string' do
10
+ list.build_string.must_equal [
11
+ 'first This is first line',
12
+ 'second This is second line',
13
+ ''
14
+ ].join("\n")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+
3
+ describe HammerCLI::Help::Section do
4
+ describe '#build_string' do
5
+ let(:section) { HammerCLI::Help::Section.new('section') }
6
+ let(:first_text) { HammerCLI::Help::Text.new('first') }
7
+ let(:second_text) { HammerCLI::Help::Text.new('second') }
8
+
9
+ it 'builds string without definition' do
10
+ section.build_string.must_equal "section:\n\n"
11
+ end
12
+
13
+ it 'builds string with definition' do
14
+ section.definition = HammerCLI::Help::Definition.new([first_text, second_text])
15
+ expected_output = [
16
+ 'section:',
17
+ ' first',
18
+ '',
19
+ ' second',
20
+ ''
21
+ ].join("\n")
22
+ section.build_string.must_equal expected_output
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ require File.join(File.dirname(__FILE__), '../../test_helper')
2
+
3
+ describe HammerCLI::Help::Text do
4
+ describe '#build_string' do
5
+ let(:text) { HammerCLI::Help::Text.new('text') }
6
+
7
+ it 'builds string' do
8
+ text.build_string.must_equal 'text'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,236 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+
3
+ describe HammerCLI::Help::Definition do
4
+ let(:definition) { HammerCLI::Help::Definition.new }
5
+ let(:old_text_item) { HammerCLI::Help::Text.new('Lorem ipsum', id: :old) }
6
+ let(:new_text_item) { HammerCLI::Help::Text.new('Dolor sit amet', id: :new) }
7
+
8
+ describe '#build_string' do
9
+ describe 'text' do
10
+ it 'prints text via definition' do
11
+ definition << HammerCLI::Help::Text.new('Lorem ipsum')
12
+ definition.build_string.must_equal "Lorem ipsum\n"
13
+ end
14
+
15
+ it 'prints multiple blocks with spaces via definition' do
16
+ definition << HammerCLI::Help::Text.new('Lorem ipsum')
17
+ definition << HammerCLI::Help::Text.new('Dolor sit amet')
18
+ definition.build_string.must_equal [
19
+ 'Lorem ipsum',
20
+ '',
21
+ 'Dolor sit amet',
22
+ ''
23
+ ].join("\n")
24
+ end
25
+ end
26
+
27
+ describe 'section' do
28
+ it 'prints section heading via definition' do
29
+ definition << HammerCLI::Help::Section.new('Heading')
30
+ definition.build_string.must_equal "Heading:\n\n"
31
+ end
32
+
33
+ it 'indents section content via definition' do
34
+ sub_definition = HammerCLI::Help::Definition.new
35
+ sub_definition << HammerCLI::Help::Text.new('Lorem ipsum')
36
+ sub_definition << HammerCLI::Help::Text.new('Dolor sit amet')
37
+ definition << HammerCLI::Help::Section.new('Heading', sub_definition)
38
+ definition.build_string.must_equal [
39
+ 'Heading:',
40
+ ' Lorem ipsum',
41
+ '',
42
+ ' Dolor sit amet',
43
+ ''
44
+ ].join("\n")
45
+ end
46
+ end
47
+
48
+ describe 'list' do
49
+ it 'prints empty list via definition' do
50
+ builder = HammerCLI::Help::TextBuilder.new
51
+ builder.list([])
52
+ builder.definition.build_string.must_equal ''
53
+ end
54
+
55
+ it 'prints single column list' do
56
+ definition << HammerCLI::Help::List.new([
57
+ :a,
58
+ :bb,
59
+ :ccc
60
+ ])
61
+ definition.build_string.must_equal [
62
+ 'a',
63
+ 'bb',
64
+ 'ccc',
65
+ ''
66
+ ].join("\n")
67
+ end
68
+
69
+ it 'prints two column list via definition' do
70
+ definition << HammerCLI::Help::List.new([
71
+ [:a, 'This is line A'],
72
+ [:bb, 'This is line B'],
73
+ [:ccc]
74
+ ])
75
+ definition.build_string.must_equal [
76
+ 'a This is line A',
77
+ 'bb This is line B',
78
+ 'ccc',
79
+ ''
80
+ ].join("\n")
81
+ end
82
+
83
+ it 'handles multiple lines in the second column via definition' do
84
+ definition << HammerCLI::Help::List.new([
85
+ [:a, "This is line A\nThis is line A part two"],
86
+ [:bb, 'This is line B'],
87
+ [:ccc, 'This is line C']
88
+ ])
89
+ definition.build_string.must_equal [
90
+ 'a This is line A',
91
+ ' This is line A part two',
92
+ 'bb This is line B',
93
+ 'ccc This is line C',
94
+ ''
95
+ ].join("\n")
96
+ end
97
+
98
+ it 'can adjust indentation of the second column via definition' do
99
+ definition << HammerCLI::Help::List.new([
100
+ ['a', 'This is line A'],
101
+ ['This line B is too long for the first column', 'This is line B'],
102
+ ['ccc', 'This is line C']
103
+ ])
104
+ definition.build_string.must_equal [
105
+ 'a This is line A',
106
+ 'This line B is too long for the first column This is line B',
107
+ 'ccc This is line C',
108
+ ''
109
+ ].join("\n")
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#find_item' do
115
+ it 'finds an item' do
116
+ definition << old_text_item
117
+ definition << new_text_item
118
+ definition.find_item(:new).must_equal new_text_item
119
+ end
120
+ end
121
+
122
+ describe '#insert_definition' do
123
+ let(:new_definition) { HammerCLI::Help::Definition.new([new_text_item, new_text_item]) }
124
+ let(:section_item) { HammerCLI::Help::Section.new('section', id: :section) }
125
+
126
+ describe 'before' do
127
+ it 'should insert new help item before the old one' do
128
+ definition << old_text_item
129
+ definition.insert_definition(:before, :old, new_text_item.definition)
130
+ definition.first.id.must_equal new_text_item.id
131
+ definition.count.must_equal 2
132
+ end
133
+
134
+ it 'should insert multiple items before old item' do
135
+ definition << old_text_item
136
+ definition.insert_definition(:before, :old, new_definition)
137
+ definition.first.id.must_equal new_text_item.id
138
+ definition.count.must_equal 3
139
+ end
140
+
141
+ it 'should work with labels' do
142
+ definition << section_item
143
+ definition.insert_definition(:before, 'section', new_definition)
144
+ definition.first.id.must_equal new_text_item.id
145
+ definition.count.must_equal 3
146
+ end
147
+ end
148
+
149
+ describe 'after' do
150
+ it 'should insert new help item after the old one' do
151
+ definition << old_text_item
152
+ definition.insert_definition(:after, :old, new_text_item.definition)
153
+ definition[0].id.must_equal old_text_item.id
154
+ definition[1].id.must_equal new_text_item.id
155
+ definition.count.must_equal 2
156
+ end
157
+
158
+ it 'should insert multiple items after old item' do
159
+ definition << old_text_item
160
+ definition.insert_definition(:after, :old, new_definition)
161
+ definition[0].id.must_equal old_text_item.id
162
+ definition[1].id.must_equal new_text_item.id
163
+ definition[2].id.must_equal new_text_item.id
164
+ definition.count.must_equal 3
165
+ end
166
+
167
+ it 'should work with labels' do
168
+ definition << section_item
169
+ definition.insert_definition(:after, 'section', new_text_item.definition)
170
+ definition[1].id.must_equal new_text_item.id
171
+ definition.count.must_equal 2
172
+ end
173
+ end
174
+
175
+ describe 'replace' do
176
+ it 'should replace the old help item with new one' do
177
+ definition << old_text_item
178
+ definition.insert_definition(:replace, :old, new_text_item.definition)
179
+ definition.first.id.must_equal new_text_item.id
180
+ definition.count.must_equal 1
181
+ end
182
+
183
+ it 'should replace the old help item with new ones' do
184
+ definition << old_text_item
185
+ definition.insert_definition(:replace, :old, new_definition)
186
+ definition[0].id.must_equal new_text_item.id
187
+ definition[1].id.must_equal new_text_item.id
188
+ definition.count.must_equal 2
189
+ end
190
+
191
+ it 'should work with labels' do
192
+ definition << section_item
193
+ definition.insert_definition(:replace, 'section', new_text_item.definition)
194
+ definition.first.id.must_equal new_text_item.id
195
+ definition.count.must_equal 1
196
+ end
197
+ end
198
+ end
199
+
200
+ describe '#at' do
201
+ it 'should return self if path is empty' do
202
+ definition << old_text_item
203
+ definition.at([]) do |h|
204
+ h.definition.first.id.must_equal old_text_item.id
205
+ end
206
+ end
207
+
208
+ it 'should accept integer' do
209
+ definition << old_text_item
210
+ definition << new_text_item
211
+ definition.at(1) do |h|
212
+ h.definition.first.id.must_equal new_text_item.id
213
+ end
214
+ end
215
+
216
+ it 'should return definition of specified help item with path' do
217
+ sub_definition = HammerCLI::Help::Definition.new
218
+ sub_definition << old_text_item
219
+ sub_definition << new_text_item
220
+ definition << HammerCLI::Help::Section.new('first', sub_definition, id: :first_section)
221
+ definition << HammerCLI::Help::Section.new('second', sub_definition, id: :second_section)
222
+ definition.at(:first_section).definition << HammerCLI::Help::Section.new('nested', sub_definition, id: :nested_section)
223
+ definition.at([:first_section, :nested_section]).definition.first.id.must_equal old_text_item.id
224
+ end
225
+
226
+ it 'should work with labels' do
227
+ sub_definition = HammerCLI::Help::Definition.new
228
+ sub_definition << old_text_item
229
+ sub_definition << new_text_item
230
+ definition << HammerCLI::Help::Section.new('first', sub_definition)
231
+ definition << HammerCLI::Help::Section.new('second', sub_definition)
232
+ definition.at('first').definition << HammerCLI::Help::Section.new('nested', sub_definition)
233
+ definition.at(['first', 'nested']).definition.first.id.must_equal old_text_item.id
234
+ end
235
+ end
236
+ end
@@ -136,5 +136,174 @@ describe HammerCLI::Help::TextBuilder do
136
136
  help.indent(text, '**').must_equal(expected_result)
137
137
  end
138
138
  end
139
- end
140
139
 
140
+ describe '#find_item' do
141
+ it 'finds an item' do
142
+ help.text('Lorem ipsum', id: :lorem)
143
+ help.text('Dolor sit amet', id: :dolor)
144
+ help.find_item(:dolor).id.must_equal :dolor
145
+ end
146
+
147
+ it 'finds a nested item' do
148
+ help.section('Heading') do |h|
149
+ h.text('Lorem ipsum', id: :lorem)
150
+ h.text('Dolor sit amet', id: :dolor)
151
+ end
152
+ help.at('Heading') do |h|
153
+ h.find_item(:dolor).id.must_equal :dolor
154
+ end
155
+ end
156
+ end
157
+
158
+ describe '#insert' do
159
+ describe 'before' do
160
+ it 'should insert new help item before the old one' do
161
+ help.text('old', id: :old)
162
+ help.insert(:before, :old) do |h|
163
+ h.text('new', id: :new)
164
+ end
165
+ help.definition.first.id.must_equal :new
166
+ help.definition.count.must_equal 2
167
+ end
168
+
169
+ it 'should insert multiple items before old item' do
170
+ help.text('old', id: :old)
171
+ help.insert(:before, :old) do |h|
172
+ h.text('new', id: :new)
173
+ h.text('new2', id: :new2)
174
+ end
175
+ help.definition.first.id.must_equal :new
176
+ help.definition.count.must_equal 3
177
+ end
178
+
179
+ it 'should work with labels' do
180
+ help.section('section') do |h|
181
+ h.text('text in section')
182
+ end
183
+ help.insert(:before, 'section') do |h|
184
+ h.text('text before section', id: :before_section)
185
+ end
186
+ help.definition.first.id.must_equal :before_section
187
+ help.definition.count.must_equal 2
188
+ end
189
+ end
190
+
191
+ describe 'after' do
192
+ it 'should insert new help item after the old one' do
193
+ help.text('old', id: :old)
194
+ help.insert(:after, :old) do |h|
195
+ h.text('new', id: :new)
196
+ end
197
+ help.definition[0].id.must_equal :old
198
+ help.definition[1].id.must_equal :new
199
+ help.definition.count.must_equal 2
200
+ end
201
+
202
+ it 'should insert multiple items after old item' do
203
+ help.text('old', id: :old)
204
+ help.insert(:after, :old) do |h|
205
+ h.text('new', id: :new)
206
+ h.text('new2', id: :new2)
207
+ end
208
+ help.definition[0].id.must_equal :old
209
+ help.definition[1].id.must_equal :new
210
+ help.definition[2].id.must_equal :new2
211
+ help.definition.count.must_equal 3
212
+ end
213
+
214
+ it 'should work with labels' do
215
+ help.section('section') do |h|
216
+ h.text('text in section')
217
+ end
218
+ help.insert(:after, 'section') do |h|
219
+ h.text('text before section', id: :after_section)
220
+ end
221
+ help.definition[1].id.must_equal :after_section
222
+ help.definition.count.must_equal 2
223
+ end
224
+ end
225
+
226
+ describe 'replace' do
227
+ it 'should replace the old help item with new one' do
228
+ help.text('old', id: :old)
229
+ help.insert(:replace, :old) do |h|
230
+ h.text('new', id: :new)
231
+ end
232
+ help.definition.first.id.must_equal :new
233
+ help.definition.count.must_equal 1
234
+ end
235
+
236
+ it 'should replace the old help item with new ones' do
237
+ help.text('old', id: :old)
238
+ help.insert(:replace, :old) do |h|
239
+ h.text('new', id: :new)
240
+ h.text('new2', id: :new2)
241
+ end
242
+ help.definition[0].id.must_equal :new
243
+ help.definition[1].id.must_equal :new2
244
+ help.definition.count.must_equal 2
245
+ end
246
+
247
+ it 'should work with labels' do
248
+ help.section('section') do |h|
249
+ h.text('text in section')
250
+ end
251
+ help.insert(:replace, 'section') do |h|
252
+ h.text('text instead of section', id: :instead_of_section)
253
+ end
254
+ help.definition.first.id.must_equal :instead_of_section
255
+ help.definition.count.must_equal 1
256
+ end
257
+ end
258
+ end
259
+
260
+ describe '#at' do
261
+ it 'should return self if path is empty' do
262
+ help.text('foo', id: :foo)
263
+ help.at([]) do |h|
264
+ h.definition.first.id.must_equal :foo
265
+ end
266
+ help.at do |h|
267
+ h.definition.first.id.must_equal :foo
268
+ end
269
+ end
270
+
271
+ it 'should return definition of specified help item with path' do
272
+ help.section('first', id: :first_section) do |h|
273
+ h.text('first text in the first section', id: :first_text1)
274
+ h.text('second text in the first section', id: :secon_text1)
275
+ end
276
+ help.section('second', id: :second_section) do |h|
277
+ h.text('first text in the second section', id: :first_text2)
278
+ h.text('second text in the second section', id: :secon_text2)
279
+ end
280
+ help.at(:first_section) do |h|
281
+ h.section('nested section', id: :nested_section) do |h|
282
+ h.text('text in nested section', id: :nested_text)
283
+ end
284
+ end
285
+ help.at([:first_section, :nested_section]) do |h|
286
+ h.definition.first.id.must_equal :nested_text
287
+ end
288
+ end
289
+
290
+ it 'should work with labels' do
291
+ help.section('first') do |h|
292
+ h.text('first text in the first section', id: :first_text1)
293
+ h.text('second text in the first section', id: :secon_text1)
294
+ end
295
+ help.section('second') do |h|
296
+ h.text('first text in the second section', id: :first_text2)
297
+ h.text('second text in the second section', id: :secon_text2)
298
+ end
299
+ help.at('first') do |h|
300
+ h.section('nested section') do |h|
301
+ h.text('text in nested section', id: :nested_text)
302
+ end
303
+ end
304
+ help.at(['first', 'nested section']) do |h|
305
+ h.definition.first.id.must_equal :nested_text
306
+ end
307
+ end
308
+ end
309
+ end