14
14
15
15
16
16
def create_fixture (data , type ):
17
- return Keyword (name = data [0 ], args = tuple (data [1 :]), type = type )
17
+ if not data or data [0 ].upper () == 'NONE' :
18
+ return None
19
+ return Keyword (name = data [0 ] if data else None , args = tuple (data [1 :]), type = type )
18
20
19
21
20
22
def join_doc (values ):
@@ -48,10 +50,10 @@ def visit_MetadataSetting(self, node):
48
50
self .suite .metadata [node .name ] = join_doc (node .value )
49
51
50
52
def visit_SuiteSetupSetting (self , node ):
51
- self .suite .keywords .append ( create_fixture (node .value , 'setup' ) )
53
+ self .suite .keywords .setup = create_fixture (node .value , 'setup' )
52
54
53
55
def visit_SuiteTeardownSetting (self , node ):
54
- self .suite .keywords .append ( create_fixture (node .value , 'teardown' ) )
56
+ self .suite .keywords .teardown = create_fixture (node .value , 'teardown' )
55
57
56
58
def visit_TestSetupSetting (self , node ):
57
59
self .test_defaults .setup = node .value
@@ -151,7 +153,7 @@ def _set_template(self, parent, template):
151
153
for kw in parent .keywords :
152
154
if kw .type == kw .FOR_LOOP_TYPE :
153
155
self ._set_template (kw , template )
154
- else :
156
+ elif kw . type == kw . KEYWORD_TYPE :
155
157
name , args = self ._format_template (template , kw .args )
156
158
kw .name = name
157
159
kw .args = args
@@ -207,7 +209,7 @@ def visit_Keyword(self, node):
207
209
self .kw = self .resource .keywords .create (name = node .name )
208
210
self .generic_visit (node )
209
211
if self .teardown :
210
- self .kw .keywords .append ( create_fixture (self .teardown , 'teardown' ) )
212
+ self .kw .keywords .teardown = create_fixture (self .teardown , 'teardown' )
211
213
212
214
def visit_DocumentationSetting (self , node ):
213
215
self .kw .doc = join_doc (node .value )
@@ -249,13 +251,27 @@ def visit_TemplateArguments(self, node):
249
251
250
252
class TestDefaults (object ):
251
253
252
- def __init__ (self ):
254
+ def __init__ (self , parent_defaults ):
253
255
self .setup = None
254
256
self .teardown = None
255
257
self .timeout = None
256
258
self .force_tags = None
257
259
self .default_tags = None
258
260
self .test_template = None
261
+ self .parent_defaults = parent_defaults
262
+
263
+ def get_force_tags (self ):
264
+ force_tags = self .force_tags or []
265
+ return force_tags + ((self .parent_defaults and self .parent_defaults .get_force_tags ()) or [])
266
+
267
+ def get_setup (self ):
268
+ return self .setup or (self .parent_defaults and self .parent_defaults .get_setup ())
269
+
270
+ def get_teardown (self ):
271
+ return self .teardown or (self .parent_defaults and self .parent_defaults .get_teardown ())
272
+
273
+ def get_timeout (self ):
274
+ return self .timeout or (self .parent_defaults and self .parent_defaults .get_timeout ())
259
275
260
276
261
277
class TestSettings (object ):
@@ -269,7 +285,8 @@ def __init__(self, defaults):
269
285
self .tags = None
270
286
271
287
def get_template (self ):
272
- return self .template or self .defaults .test_template
288
+ template = self .template if self .template is not None else self .defaults .test_template
289
+ return template if template and template [0 ].upper () != 'NONE' else None
273
290
274
291
def set_test_values (self , test ):
275
292
self .set_setup (test )
@@ -278,23 +295,23 @@ def set_test_values(self, test):
278
295
self .set_tags (test )
279
296
280
297
def set_setup (self , test ):
281
- setup = self .setup or self .defaults .setup
298
+ setup = self .setup or self .defaults .get_setup ()
282
299
if setup :
283
300
test .keywords .setup = create_fixture (setup , type = 'setup' )
284
301
285
302
def set_teardown (self , test ):
286
- teardown = self .teardown or self .defaults .teardown
303
+ teardown = self .teardown or self .defaults .get_teardown ()
287
304
if teardown :
288
305
test .keywords .teardown = create_fixture (teardown , type = 'teardown' )
289
306
290
307
def set_timout (self , test ):
291
- timeout = self .timeout or self .defaults .timeout
308
+ timeout = self .timeout or self .defaults .get_timeout ()
292
309
if timeout :
293
310
test .timeout = timeout
294
311
295
312
def set_tags (self , test ):
296
313
default_tags = (self .tags or self .defaults .default_tags ) or []
297
- test .tags = default_tags + ( self .defaults .force_tags or [] )
314
+ test .tags = default_tags + self .defaults .get_force_tags ( )
298
315
299
316
300
317
class TestSuiteBuilder (object ):
@@ -303,6 +320,8 @@ class TestSuiteBuilder(object):
303
320
304
321
def __init__ (self , include_suites = None , extension = None , rpa = None ):
305
322
self .rpa = rpa
323
+ self .include_suites = include_suites
324
+ self .extension = extension
306
325
307
326
def build (self , * paths ):
308
327
"""
@@ -312,7 +331,7 @@ def build(self, *paths):
312
331
if not paths :
313
332
raise DataError ('One or more source paths required.' )
314
333
if len (paths ) == 1 :
315
- return self ._parse_and_build (paths [0 ])
334
+ return self ._parse_and_build (paths [0 ], include_suites = self . include_suites , include_extensions = self . extension )
316
335
root = TestSuite ()
317
336
for path in paths :
318
337
root .suites .append (self ._parse_and_build (path ))
@@ -327,27 +346,32 @@ def _get_extensions(self, extension):
327
346
raise DataError ("Invalid extension to limit parsing '%s'." % extension )
328
347
return extensions
329
348
330
- def _parse_and_build (self , path ):
349
+ def _parse_and_build (self , path , parent_defaults = None , include_suites = None , include_extensions = None ):
350
+ name = format_name (path )
331
351
if os .path .isdir (path ):
332
- init_file , children = self ._get_children (path )
352
+ include_suites = self ._get_include_suites (path , include_suites )
353
+ init_file , children = self ._get_children (path , include_extensions , include_suites )
354
+ defaults = parent_defaults
333
355
if init_file :
334
- suite = self ._build_suite (init_file )
356
+ suite , defaults = self ._build_suite (init_file , name , parent_defaults )
335
357
else :
336
- suite = TestSuite (name = format_name ( path ) , source = path )
358
+ suite = TestSuite (name = name , source = path )
337
359
for c in children :
338
- suite .suites .append (self ._parse_and_build (c ))
360
+ suite .suites .append (self ._parse_and_build (c , defaults , include_suites , include_extensions ))
339
361
else :
340
- suite = self ._build_suite (path )
362
+ suite , _ = self ._build_suite (path , name , parent_defaults )
341
363
suite .remove_empty_suites ()
342
364
return suite
343
365
344
- def _build_suite (self , source , parent_defaults = None ):
366
+ def _build_suite (self , source , name , parent_defaults ):
345
367
data = self ._parse (source )
346
- suite = TestSuite (name = format_name (source ), source = source )
347
- defaults = TestDefaults ()
348
- SettingsBuilder (suite , defaults ).visit (data )
349
- SuiteBuilder (suite , defaults ).visit (data )
350
- return suite
368
+ suite = TestSuite (name = name , source = source )
369
+ defaults = TestDefaults (parent_defaults )
370
+ if data :
371
+ print (ast .dump (data ))
372
+ SettingsBuilder (suite , defaults ).visit (data )
373
+ SuiteBuilder (suite , defaults ).visit (data )
374
+ return suite , defaults
351
375
352
376
def _parse (self , path ):
353
377
try :
@@ -436,7 +460,8 @@ class ResourceFileBuilder(object):
436
460
def build (self , path ):
437
461
resource = ResourceFile (source = path )
438
462
data = Builder ().read (abspath (path ))
439
- ResourceBuilder (resource ).visit (data )
463
+ if data :
464
+ ResourceBuilder (resource ).visit (data )
440
465
return resource
441
466
442
467
@@ -449,5 +474,8 @@ def format_name(name):
449
474
name = name .replace ('_' , ' ' ).strip ()
450
475
return name .title () if name .islower () else name
451
476
452
- basename = os .path .splitext (os .path .basename (source ))[0 ]
477
+ if os .path .isdir (source ):
478
+ basename = os .path .basename (source )
479
+ else :
480
+ basename = os .path .splitext (os .path .basename (source ))[0 ]
453
481
return format_name (basename )
0 commit comments