macros4cuke 0.2.22 → 0.3.00
Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## 0.3.00 / 2013-05-09 Version number bumped
|
2
|
+
* [CHANGE] Class `Templating::Engine` can handle conditional tags (TODO: document).
|
3
|
+
* [CHANGE] File `engine_spec.rb`: Added a RSpec examples to test the conditional tags.
|
4
|
+
|
5
|
+
|
1
6
|
## 0.2.22 / 2013-05-08
|
2
7
|
[CHANGE] File `README.md`: expanded the section on macro arguments.
|
3
8
|
|
@@ -7,7 +12,7 @@
|
|
7
12
|
* [NEW] Added new class `Templating::Section`, a subclass of `UnaryElement`.
|
8
13
|
* [NEW] Added new class `Templating::ConditionalSection, a subclass of `Section`.
|
9
14
|
* [CHANGE] Method Engine#parse_tag modified in prevision of conditional tags.
|
10
|
-
* [NEW] File `section_spec.rb`: Added a RSpec to test the Conditional class.
|
15
|
+
* [NEW] File `section_spec.rb`: Added a RSpec file to test the Conditional class.
|
11
16
|
|
12
17
|
## 0.2.20 / 2013-05-07
|
13
18
|
* [NEW] Added `examples` folder with a first example of an internationalized customisation of __Macros4Cuke__.
|
@@ -299,7 +299,7 @@ private
|
|
299
299
|
end
|
300
300
|
|
301
301
|
compiled_lines = raw_lines.map { |line| compile_line(line) }
|
302
|
-
return compiled_lines.flatten()
|
302
|
+
return compile_sections(compiled_lines.flatten())
|
303
303
|
end
|
304
304
|
|
305
305
|
# Convert the array of raw entries into full-fledged template elements.
|
@@ -352,6 +352,37 @@ private
|
|
352
352
|
|
353
353
|
return result
|
354
354
|
end
|
355
|
+
|
356
|
+
# Group the elements by sections.
|
357
|
+
# @param flat_sequence [Array] a linear list of elements (including sections)
|
358
|
+
def compile_sections(flat_sequence)
|
359
|
+
open_sections = [] # The list of nested open sections
|
360
|
+
compiled = flat_sequence.each_with_object([]) do |element, subResult|
|
361
|
+
case element
|
362
|
+
when Section
|
363
|
+
open_sections << element
|
364
|
+
|
365
|
+
when SectionEndMarker
|
366
|
+
if open_sections.empty?
|
367
|
+
raise StandardError, "End of section</#{element.name}> found while no corresponding section must be closed."
|
368
|
+
end
|
369
|
+
if element.name != open_sections.last.name
|
370
|
+
raise StandardError, "End of section</#{element.name}> doesn't match current section '#{open_sections.last.name}'."
|
371
|
+
end
|
372
|
+
subResult << open_sections.pop()
|
373
|
+
|
374
|
+
else
|
375
|
+
if open_sections.empty?
|
376
|
+
subResult << element
|
377
|
+
else
|
378
|
+
open_sections.last.add_child(element)
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
end
|
383
|
+
|
384
|
+
return compiled
|
385
|
+
end
|
355
386
|
|
356
387
|
end # class
|
357
388
|
|
@@ -11,6 +11,7 @@ module Templating # Open this namespace to get rid of module qualifier prefixes
|
|
11
11
|
|
12
12
|
|
13
13
|
describe Engine do
|
14
|
+
# Sample template (consisting of a sequence of steps)
|
14
15
|
let(:sample_template) do
|
15
16
|
source = <<-SNIPPET
|
16
17
|
Given I landed in the homepage
|
@@ -20,6 +21,21 @@ describe Engine do
|
|
20
21
|
And I click "Sign in"
|
21
22
|
SNIPPET
|
22
23
|
end
|
24
|
+
|
25
|
+
# Template containing two conditional sections
|
26
|
+
let(:sophisticated_template) do
|
27
|
+
source = <<-SNIPPET
|
28
|
+
When I fill in "firstname" with "<firstname>"
|
29
|
+
And I fill in "lastname" with "<lastname>"
|
30
|
+
<?address>And I fill in "address" with "<address>"</address>
|
31
|
+
<?birthdate>
|
32
|
+
And I fill in "birthdate" with "<birthdate>"
|
33
|
+
</birthdate>
|
34
|
+
And I click "Register"
|
35
|
+
SNIPPET
|
36
|
+
end
|
37
|
+
|
38
|
+
|
23
39
|
|
24
40
|
# Rule for default instantiation
|
25
41
|
subject { Engine.new sample_template }
|
@@ -167,6 +183,11 @@ SNIPPET
|
|
167
183
|
instance = Engine.new ''
|
168
184
|
instance.source.should be_empty
|
169
185
|
end
|
186
|
+
|
187
|
+
it "should accept conditional section" do
|
188
|
+
lambda { Engine.new sophisticated_template }.should_not raise_error
|
189
|
+
instance = Engine.new sophisticated_template
|
190
|
+
end
|
170
191
|
|
171
192
|
it "should complain when a placeholder is empty or blank" do
|
172
193
|
text_w_empty_arg = sample_template.sub(/userid/, '')
|
@@ -179,6 +200,7 @@ SNIPPET
|
|
179
200
|
error_message = "The invalid sign '%' occurs in the argument/tag 'user%id'."
|
180
201
|
lambda { Engine.new text_w_empty_arg }.should raise_error(Macros4Cuke::InvalidCharError, error_message)
|
181
202
|
end
|
203
|
+
|
182
204
|
end # context
|
183
205
|
|
184
206
|
context "Provided services" do
|
@@ -248,6 +270,30 @@ SNIPPET
|
|
248
270
|
instance = Engine.new ''
|
249
271
|
instance.render(nil, {}).should be_empty
|
250
272
|
end
|
273
|
+
|
274
|
+
|
275
|
+
it "should render conditional sections" do
|
276
|
+
instance = Engine.new(sophisticated_template)
|
277
|
+
|
278
|
+
locals = {'firstname' => "Anon",
|
279
|
+
"lastname" => "Eemoos" ,
|
280
|
+
"birthdate" => "1976-04-21"
|
281
|
+
}
|
282
|
+
rendered_text = instance.render(Object.new, locals)
|
283
|
+
expected = <<-SNIPPET
|
284
|
+
When I fill in "firstname" with "Anon"
|
285
|
+
And I fill in "lastname" with "Eemoos"
|
286
|
+
|
287
|
+
|
288
|
+
And I fill in "birthdate" with "1976-04-21"
|
289
|
+
|
290
|
+
And I click "Register"
|
291
|
+
SNIPPET
|
292
|
+
|
293
|
+
rendered_text.should == expected
|
294
|
+
|
295
|
+
end
|
296
|
+
|
251
297
|
|
252
298
|
it "should render multivalued actuals" do
|
253
299
|
locals = {'userid' => ["johndoe", "yeti"] } # Silly case
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: macros4cuke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.00
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cucumber
|