Skip to content

Commit 48d59f1

Browse files
committed
builder: build parent defaults correctly
1 parent c88b49f commit 48d59f1

File tree

1 file changed

+54
-26
lines changed

1 file changed

+54
-26
lines changed

src/robot/running/newbuilder.py

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515

1616
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)
1820

1921

2022
def join_doc(values):
@@ -48,10 +50,10 @@ def visit_MetadataSetting(self, node):
4850
self.suite.metadata[node.name] = join_doc(node.value)
4951

5052
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')
5254

5355
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')
5557

5658
def visit_TestSetupSetting(self, node):
5759
self.test_defaults.setup = node.value
@@ -151,7 +153,7 @@ def _set_template(self, parent, template):
151153
for kw in parent.keywords:
152154
if kw.type == kw.FOR_LOOP_TYPE:
153155
self._set_template(kw, template)
154-
else:
156+
elif kw.type == kw.KEYWORD_TYPE:
155157
name, args = self._format_template(template, kw.args)
156158
kw.name = name
157159
kw.args = args
@@ -207,7 +209,7 @@ def visit_Keyword(self, node):
207209
self.kw = self.resource.keywords.create(name=node.name)
208210
self.generic_visit(node)
209211
if self.teardown:
210-
self.kw.keywords.append(create_fixture(self.teardown, 'teardown'))
212+
self.kw.keywords.teardown = create_fixture(self.teardown, 'teardown')
211213

212214
def visit_DocumentationSetting(self, node):
213215
self.kw.doc = join_doc(node.value)
@@ -249,13 +251,27 @@ def visit_TemplateArguments(self, node):
249251

250252
class TestDefaults(object):
251253

252-
def __init__(self):
254+
def __init__(self, parent_defaults):
253255
self.setup = None
254256
self.teardown = None
255257
self.timeout = None
256258
self.force_tags = None
257259
self.default_tags = None
258260
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())
259275

260276

261277
class TestSettings(object):
@@ -269,7 +285,8 @@ def __init__(self, defaults):
269285
self.tags = None
270286

271287
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
273290

274291
def set_test_values(self, test):
275292
self.set_setup(test)
@@ -278,23 +295,23 @@ def set_test_values(self, test):
278295
self.set_tags(test)
279296

280297
def set_setup(self, test):
281-
setup = self.setup or self.defaults.setup
298+
setup = self.setup or self.defaults.get_setup()
282299
if setup:
283300
test.keywords.setup = create_fixture(setup, type='setup')
284301

285302
def set_teardown(self, test):
286-
teardown = self.teardown or self.defaults.teardown
303+
teardown = self.teardown or self.defaults.get_teardown()
287304
if teardown:
288305
test.keywords.teardown = create_fixture(teardown, type='teardown')
289306

290307
def set_timout(self, test):
291-
timeout = self.timeout or self.defaults.timeout
308+
timeout = self.timeout or self.defaults.get_timeout()
292309
if timeout:
293310
test.timeout = timeout
294311

295312
def set_tags(self, test):
296313
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()
298315

299316

300317
class TestSuiteBuilder(object):
@@ -303,6 +320,8 @@ class TestSuiteBuilder(object):
303320

304321
def __init__(self, include_suites=None, extension=None, rpa=None):
305322
self.rpa = rpa
323+
self.include_suites = include_suites
324+
self.extension = extension
306325

307326
def build(self, *paths):
308327
"""
@@ -312,7 +331,7 @@ def build(self, *paths):
312331
if not paths:
313332
raise DataError('One or more source paths required.')
314333
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)
316335
root = TestSuite()
317336
for path in paths:
318337
root.suites.append(self._parse_and_build(path))
@@ -327,27 +346,32 @@ def _get_extensions(self, extension):
327346
raise DataError("Invalid extension to limit parsing '%s'." % extension)
328347
return extensions
329348

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)
331351
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
333355
if init_file:
334-
suite = self._build_suite(init_file)
356+
suite, defaults = self._build_suite(init_file, name, parent_defaults)
335357
else:
336-
suite = TestSuite(name=format_name(path), source=path)
358+
suite = TestSuite(name=name, source=path)
337359
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))
339361
else:
340-
suite = self._build_suite(path)
362+
suite, _ = self._build_suite(path, name, parent_defaults)
341363
suite.remove_empty_suites()
342364
return suite
343365

344-
def _build_suite(self, source, parent_defaults=None):
366+
def _build_suite(self, source, name, parent_defaults):
345367
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
351375

352376
def _parse(self, path):
353377
try:
@@ -436,7 +460,8 @@ class ResourceFileBuilder(object):
436460
def build(self, path):
437461
resource = ResourceFile(source=path)
438462
data = Builder().read(abspath(path))
439-
ResourceBuilder(resource).visit(data)
463+
if data:
464+
ResourceBuilder(resource).visit(data)
440465
return resource
441466

442467

@@ -449,5 +474,8 @@ def format_name(name):
449474
name = name.replace('_', ' ').strip()
450475
return name.title() if name.islower() else name
451476

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]
453481
return format_name(basename)

0 commit comments

Comments
 (0)