cucumber 0.3.4 → 0.3.5
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.
- data/History.txt +8 -0
- data/lib/cucumber/parser/feature.rb +120 -139
- data/lib/cucumber/parser/feature.tt +6 -10
- data/lib/cucumber/version.rb +1 -1
- data/spec/cucumber/parser/feature_parser_spec.rb +16 -6
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.3.5 2009-05-14
|
2
|
+
|
3
|
+
Let's make a new release today because two annoying bugs are fixed.
|
4
|
+
|
5
|
+
=== Bugfixes
|
6
|
+
* Allow feature element names to contain Gherkin keywords as long as they are not the first word on a newline (#319, #307 Joseph Wilk)
|
7
|
+
|
1
8
|
== 0.3.4 2009-05-14
|
2
9
|
|
3
10
|
A couple of great new features in this release. Running with Rake is faster than before,
|
@@ -35,6 +42,7 @@ However, setting the RAILS_ENV is easy to forget, so I don't recommend relying o
|
|
35
42
|
* Support for Catalan (Francesc Esplugas)
|
36
43
|
|
37
44
|
=== Changed features
|
45
|
+
* --exclude flag now works on ruby files in addition to feature files (#312 Ben Mabey)
|
38
46
|
* The Java example under examples/java uses Ant instead of Rake - and the new JUnit formatter.
|
39
47
|
* Rake task should not shell out (#297 Aslak Hellesøy)
|
40
48
|
The Cucumber Rake task will run Cucumber in the same Ruby interpreter as Rake itself
|
@@ -1331,187 +1331,168 @@ module Cucumber
|
|
1331
1331
|
return r0
|
1332
1332
|
end
|
1333
1333
|
|
1334
|
-
module
|
1335
|
-
|
1336
|
-
|
1337
|
-
module LineToKeyword1
|
1338
|
-
def white
|
1334
|
+
module LinesToKeyword0
|
1335
|
+
def eol
|
1339
1336
|
elements[0]
|
1340
1337
|
end
|
1341
1338
|
|
1342
|
-
def
|
1343
|
-
elements[
|
1339
|
+
def reserved_words_and_symbols
|
1340
|
+
elements[2]
|
1344
1341
|
end
|
1345
1342
|
end
|
1346
1343
|
|
1347
|
-
module
|
1344
|
+
module LinesToKeyword1
|
1345
|
+
end
|
1346
|
+
|
1347
|
+
module LinesToKeyword2
|
1348
1348
|
def build
|
1349
|
-
|
1349
|
+
self.text_value.split("\n").map{|s| s.strip }.join("\n")
|
1350
1350
|
end
|
1351
1351
|
end
|
1352
1352
|
|
1353
|
-
def
|
1353
|
+
def _nt_lines_to_keyword
|
1354
1354
|
start_index = index
|
1355
|
-
if node_cache[:
|
1356
|
-
cached = node_cache[:
|
1355
|
+
if node_cache[:lines_to_keyword].has_key?(index)
|
1356
|
+
cached = node_cache[:lines_to_keyword][index]
|
1357
1357
|
@index = cached.interval.end if cached
|
1358
1358
|
return cached
|
1359
1359
|
end
|
1360
1360
|
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
else
|
1373
|
-
self.index = i4
|
1374
|
-
r4 = instantiate_node(SyntaxNode,input, index...index)
|
1375
|
-
end
|
1376
|
-
s3 << r4
|
1377
|
-
if r4
|
1378
|
-
i6 = index
|
1379
|
-
r7 = _nt_scenario_keyword
|
1380
|
-
if r7
|
1381
|
-
r6 = nil
|
1382
|
-
else
|
1383
|
-
self.index = i6
|
1384
|
-
r6 = instantiate_node(SyntaxNode,input, index...index)
|
1385
|
-
end
|
1386
|
-
s3 << r6
|
1361
|
+
s0, i0 = [], index
|
1362
|
+
loop do
|
1363
|
+
i1, s1 = index, []
|
1364
|
+
i2 = index
|
1365
|
+
i3, s3 = index, []
|
1366
|
+
r4 = _nt_eol
|
1367
|
+
s3 << r4
|
1368
|
+
if r4
|
1369
|
+
s5, i5 = [], index
|
1370
|
+
loop do
|
1371
|
+
r6 = _nt_space
|
1387
1372
|
if r6
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
r8 = nil
|
1392
|
-
else
|
1393
|
-
self.index = i8
|
1394
|
-
r8 = instantiate_node(SyntaxNode,input, index...index)
|
1395
|
-
end
|
1396
|
-
s3 << r8
|
1397
|
-
if r8
|
1398
|
-
i10 = index
|
1399
|
-
r11 = _nt_table
|
1400
|
-
if r11
|
1401
|
-
r10 = nil
|
1402
|
-
else
|
1403
|
-
self.index = i10
|
1404
|
-
r10 = instantiate_node(SyntaxNode,input, index...index)
|
1405
|
-
end
|
1406
|
-
s3 << r10
|
1407
|
-
if r10
|
1408
|
-
i12 = index
|
1409
|
-
r13 = _nt_tag
|
1410
|
-
if r13
|
1411
|
-
r12 = nil
|
1412
|
-
else
|
1413
|
-
self.index = i12
|
1414
|
-
r12 = instantiate_node(SyntaxNode,input, index...index)
|
1415
|
-
end
|
1416
|
-
s3 << r12
|
1417
|
-
if r12
|
1418
|
-
i14 = index
|
1419
|
-
r15 = _nt_comment_line
|
1420
|
-
if r15
|
1421
|
-
r14 = nil
|
1422
|
-
else
|
1423
|
-
self.index = i14
|
1424
|
-
r14 = instantiate_node(SyntaxNode,input, index...index)
|
1425
|
-
end
|
1426
|
-
s3 << r14
|
1427
|
-
if r14
|
1428
|
-
i16 = index
|
1429
|
-
r17 = _nt_eol
|
1430
|
-
if r17
|
1431
|
-
r16 = nil
|
1432
|
-
else
|
1433
|
-
self.index = i16
|
1434
|
-
r16 = instantiate_node(SyntaxNode,input, index...index)
|
1435
|
-
end
|
1436
|
-
s3 << r16
|
1437
|
-
if r16
|
1438
|
-
if index < input_length
|
1439
|
-
r18 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
1440
|
-
@index += 1
|
1441
|
-
else
|
1442
|
-
terminal_parse_failure("any character")
|
1443
|
-
r18 = nil
|
1444
|
-
end
|
1445
|
-
s3 << r18
|
1446
|
-
end
|
1447
|
-
end
|
1448
|
-
end
|
1449
|
-
end
|
1450
|
-
end
|
1373
|
+
s5 << r6
|
1374
|
+
else
|
1375
|
+
break
|
1451
1376
|
end
|
1452
1377
|
end
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
|
1458
|
-
r3 = nil
|
1378
|
+
r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
|
1379
|
+
s3 << r5
|
1380
|
+
if r5
|
1381
|
+
r7 = _nt_reserved_words_and_symbols
|
1382
|
+
s3 << r7
|
1459
1383
|
end
|
1460
|
-
|
1461
|
-
|
1384
|
+
end
|
1385
|
+
if s3.last
|
1386
|
+
r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
|
1387
|
+
r3.extend(LinesToKeyword0)
|
1388
|
+
else
|
1389
|
+
self.index = i3
|
1390
|
+
r3 = nil
|
1391
|
+
end
|
1392
|
+
if r3
|
1393
|
+
r2 = nil
|
1394
|
+
else
|
1395
|
+
self.index = i2
|
1396
|
+
r2 = instantiate_node(SyntaxNode,input, index...index)
|
1397
|
+
end
|
1398
|
+
s1 << r2
|
1399
|
+
if r2
|
1400
|
+
if index < input_length
|
1401
|
+
r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
1402
|
+
@index += 1
|
1462
1403
|
else
|
1463
|
-
|
1404
|
+
terminal_parse_failure("any character")
|
1405
|
+
r8 = nil
|
1464
1406
|
end
|
1407
|
+
s1 << r8
|
1465
1408
|
end
|
1466
|
-
if
|
1467
|
-
|
1468
|
-
|
1409
|
+
if s1.last
|
1410
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
1411
|
+
r1.extend(LinesToKeyword1)
|
1469
1412
|
else
|
1470
|
-
|
1413
|
+
self.index = i1
|
1414
|
+
r1 = nil
|
1415
|
+
end
|
1416
|
+
if r1
|
1417
|
+
s0 << r1
|
1418
|
+
else
|
1419
|
+
break
|
1471
1420
|
end
|
1472
|
-
s0 << r2
|
1473
|
-
end
|
1474
|
-
if s0.last
|
1475
|
-
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
1476
|
-
r0.extend(LineToKeyword1)
|
1477
|
-
r0.extend(LineToKeyword2)
|
1478
|
-
else
|
1479
|
-
self.index = i0
|
1480
|
-
r0 = nil
|
1481
1421
|
end
|
1422
|
+
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
1423
|
+
r0.extend(LinesToKeyword2)
|
1482
1424
|
|
1483
|
-
node_cache[:
|
1425
|
+
node_cache[:lines_to_keyword][start_index] = r0
|
1484
1426
|
|
1485
1427
|
return r0
|
1486
1428
|
end
|
1487
1429
|
|
1488
|
-
module
|
1489
|
-
def
|
1490
|
-
elements
|
1430
|
+
module ReservedWordsAndSymbols0
|
1431
|
+
def step_keyword
|
1432
|
+
elements[0]
|
1433
|
+
end
|
1434
|
+
|
1435
|
+
def keyword_space
|
1436
|
+
elements[1]
|
1491
1437
|
end
|
1492
1438
|
end
|
1493
1439
|
|
1494
|
-
def
|
1440
|
+
def _nt_reserved_words_and_symbols
|
1495
1441
|
start_index = index
|
1496
|
-
if node_cache[:
|
1497
|
-
cached = node_cache[:
|
1442
|
+
if node_cache[:reserved_words_and_symbols].has_key?(index)
|
1443
|
+
cached = node_cache[:reserved_words_and_symbols][index]
|
1498
1444
|
@index = cached.interval.end if cached
|
1499
1445
|
return cached
|
1500
1446
|
end
|
1501
1447
|
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1448
|
+
i0 = index
|
1449
|
+
i1, s1 = index, []
|
1450
|
+
r2 = _nt_step_keyword
|
1451
|
+
s1 << r2
|
1452
|
+
if r2
|
1453
|
+
r3 = _nt_keyword_space
|
1454
|
+
s1 << r3
|
1455
|
+
end
|
1456
|
+
if s1.last
|
1457
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
1458
|
+
r1.extend(ReservedWordsAndSymbols0)
|
1459
|
+
else
|
1460
|
+
self.index = i1
|
1461
|
+
r1 = nil
|
1462
|
+
end
|
1463
|
+
if r1
|
1464
|
+
r0 = r1
|
1465
|
+
else
|
1466
|
+
r4 = _nt_scenario_keyword
|
1467
|
+
if r4
|
1468
|
+
r0 = r4
|
1507
1469
|
else
|
1508
|
-
|
1470
|
+
r5 = _nt_scenario_outline_keyword
|
1471
|
+
if r5
|
1472
|
+
r0 = r5
|
1473
|
+
else
|
1474
|
+
r6 = _nt_table
|
1475
|
+
if r6
|
1476
|
+
r0 = r6
|
1477
|
+
else
|
1478
|
+
r7 = _nt_tag
|
1479
|
+
if r7
|
1480
|
+
r0 = r7
|
1481
|
+
else
|
1482
|
+
r8 = _nt_comment_line
|
1483
|
+
if r8
|
1484
|
+
r0 = r8
|
1485
|
+
else
|
1486
|
+
self.index = i0
|
1487
|
+
r0 = nil
|
1488
|
+
end
|
1489
|
+
end
|
1490
|
+
end
|
1491
|
+
end
|
1509
1492
|
end
|
1510
1493
|
end
|
1511
|
-
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
1512
|
-
r0.extend(LinesToKeyword0)
|
1513
1494
|
|
1514
|
-
node_cache[:
|
1495
|
+
node_cache[:reserved_words_and_symbols][start_index] = r0
|
1515
1496
|
|
1516
1497
|
return r0
|
1517
1498
|
end
|
@@ -273,22 +273,18 @@ module Cucumber
|
|
273
273
|
(!eol .)*
|
274
274
|
end
|
275
275
|
|
276
|
-
rule line_to_keyword
|
277
|
-
white text:(!step_keyword !scenario_keyword !scenario_outline_keyword !table !tag !comment_line !eol .)+ {
|
278
|
-
def build
|
279
|
-
text.text_value.strip
|
280
|
-
end
|
281
|
-
}
|
282
|
-
end
|
283
|
-
|
284
276
|
rule lines_to_keyword
|
285
|
-
|
277
|
+
(!(eol space* reserved_words_and_symbols) .)* {
|
286
278
|
def build
|
287
|
-
|
279
|
+
self.text_value.split("\n").map{|s| s.strip}.join("\n")
|
288
280
|
end
|
289
281
|
}
|
290
282
|
end
|
291
283
|
|
284
|
+
rule reserved_words_and_symbols
|
285
|
+
(step_keyword keyword_space) / scenario_keyword / scenario_outline_keyword / table / tag / comment_line
|
286
|
+
end
|
287
|
+
|
292
288
|
rule py_string
|
293
289
|
open_py_string s:(!close_py_string .)* close_py_string {
|
294
290
|
def at_line?(line)
|
data/lib/cucumber/version.rb
CHANGED
@@ -177,7 +177,7 @@ Given I have a string
|
|
177
177
|
|
178
178
|
it "should allow multiline names" do
|
179
179
|
parse(%{Feature: Hi
|
180
|
-
Scenario: It is my ambition to say
|
180
|
+
Scenario: It is my ambition to say
|
181
181
|
in ten sentences
|
182
182
|
what others say
|
183
183
|
in a whole book.
|
@@ -188,7 +188,18 @@ Given I am a step
|
|
188
188
|
[:scenario, 2, "Scenario:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
|
189
189
|
[:step_invocation, 6, "Given", "I am a step"]]]
|
190
190
|
end
|
191
|
-
|
191
|
+
|
192
|
+
it "should ignore gherkin keywords which are parts of other words in the name" do
|
193
|
+
parse(%{Feature: Parser bug
|
194
|
+
Scenario: I have a Button
|
195
|
+
Buttons are great
|
196
|
+
Given I have it
|
197
|
+
}).to_sexp.should ==
|
198
|
+
[:feature, nil, "Feature: Parser bug",
|
199
|
+
[:scenario, 2, "Scenario:", "I have a Button\nButtons are great",
|
200
|
+
[:step_invocation, 4, "Given", "I have it"]]]
|
201
|
+
|
202
|
+
end
|
192
203
|
end
|
193
204
|
|
194
205
|
describe "Scenario Outlines" do
|
@@ -306,16 +317,15 @@ Examples: I'm a multiline name
|
|
306
317
|
end
|
307
318
|
|
308
319
|
it "should allow Examples to have multiline names" do
|
309
|
-
pending('https://rspec.lighthouseapp.com/projects/16211/tickets/307-031-step-mother-parses-scenario-titles') do
|
310
320
|
parse(%{Feature: Hi
|
311
321
|
Scenario: When I have when in scenario
|
322
|
+
I should be fine
|
312
323
|
Given I am a step
|
313
324
|
}).to_sexp.should ==
|
314
325
|
[:feature, nil, "Feature: Hi",
|
315
|
-
[:scenario, 2, "Scenario:", "When I have when in scenario",
|
316
|
-
[:step_invocation,
|
326
|
+
[:scenario, 2, "Scenario:", "When I have when in scenario\nI should be fine",
|
327
|
+
[:step_invocation, 4, "Given", "I am a step"]]]
|
317
328
|
end
|
318
|
-
end
|
319
329
|
end
|
320
330
|
|
321
331
|
describe "Syntax" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Aslak Helles\xC3\xB8y"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-15 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|