20 from robot.parsing import SuiteStructureBuilder, SuiteStructureVisitor
22 from .parsers
import RobotParser, NoInitFileDirectoryParser, RestParser
23 from .settings
import Defaults
72 def __init__(self, included_suites=None, included_extensions=(
'robot',),
73 rpa=
None, lang=
None, allow_empty_suite=
False,
91 suite = parser.parse(structure)
94 suite.remove_empty_suites(preserve_direct_children=len(paths) > 1)
99 if not suite.has_tests:
100 raise DataError(f
"Suite '{suite.name}' contains no tests or tasks.")
104 for s
in suite.suites:
110 def __init__(self, included_extensions, rpa=None, lang=None, process_curdir=True):
119 rest_parser =
RestParser(lang, process_curdir)
122 'robot': robot_parser,
126 for ext
in extensions:
127 if ext
not in parsers:
128 parsers[ext] = robot_parser
133 return self.
parsersparsers[extension]
135 return self.
parsersparsers[
'robot']
138 structure.visit(self)
140 return self.
suitesuite
143 LOGGER.info(f
"Parsing file '{structure.source}'.")
146 self.
_stack_stack[-1][0].suites.append(suite)
148 self.
suitesuite = suite
152 LOGGER.info(f
"Parsing directory '{structure.source}'.")
153 suite, defaults = self.
_build_suite_build_suite(structure)
154 if self.
suitesuite
is None:
155 self.
suitesuite = suite
157 self.
_stack_stack[-1][0].suites.append(suite)
158 self.
_stack_stack.append((suite, defaults))
161 suite, _ = self.
_stack_stack.pop()
162 if suite.rpa
is None and suite.suites:
163 suite.rpa = suite.suites[0].rpa
166 parent_defaults = self.
_stack_stack[-1][-1]
if self.
_stack_stack
else None
167 source = structure.source
168 defaults =
Defaults(parent_defaults)
169 parser = self.
_get_parser_get_parser(structure.extension)
171 if structure.is_directory:
172 suite = parser.parse_init_file(structure.init_file
or source, defaults)
174 suite = parser.parse_suite_file(source, defaults)
176 LOGGER.info(f
"Data source '{source}' has no tests or tasks.")
178 except DataError
as err:
179 raise DataError(f
"Parsing '{source}' failed: {err.message}")
180 return suite, defaults
184 suite.rpa = self.
rparpa
185 elif suite.rpa
is None:
187 elif self.
rparpa
is None:
188 self.
rparpa = suite.rpa
189 elif self.
rparpa
is not suite.rpa:
190 this, that = (
'tasks',
'tests')
if suite.rpa
else (
'tests',
'tasks')
191 raise DataError(f
"Conflicting execution modes. File has {this} "
192 f
"but files parsed earlier have {that}. Fix headers "
193 f
"or use '--rpa' or '--norpa' options to set the "
194 f
"execution mode explicitly.")
199 def __init__(self, lang=None, process_curdir=True):
204 LOGGER.info(f
"Parsing resource file '{source}'.")
205 resource = self.
_parse_parse(source)
206 if resource.imports
or resource.variables
or resource.keywords:
207 LOGGER.info(f
"Imported resource file '{source}' ({len(resource.keywords)} "
210 LOGGER.warn(f
"Imported resource file '{source}' is empty.")
214 if os.path.splitext(source)[1].lower()
in (
'.rst',
'.rest'):
def __init__(self, lang=None, process_curdir=True)
def _validate_execution_mode(self, suite)
def _get_parsers(self, extensions, lang, process_curdir)
def parse(self, structure)
def end_directory(self, structure)
def _get_parser(self, extension)
def __init__(self, included_extensions, rpa=None, lang=None, process_curdir=True)
def start_directory(self, structure)
def _build_suite(self, structure)
def visit_file(self, structure)
Builder to construct TestSuite objects based on data on the disk.
def _validate_test_counts(self, suite, multisource=False)
def __init__(self, included_suites=None, included_extensions=('robot',), rpa=None, lang=None, allow_empty_suite=False, process_curdir=True)
:param include_suites: List of suite names to include.
def build(self, *paths)
:param paths: Paths to test data files or directories.