Skip to content

Commit c8abfae

Browse files
committed
feat: Simplifying implementation of discovering of tests
1 parent 27b29a2 commit c8abfae

File tree

1 file changed

+21
-128
lines changed

1 file changed

+21
-128
lines changed

robotcode/language_server/robotframework/parts/discovering.py

Lines changed: 21 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from dataclasses import dataclass
66
from itertools import chain
77
from pathlib import Path
8-
from typing import TYPE_CHECKING, Any, Callable, Iterator, List, Optional, cast
8+
from typing import TYPE_CHECKING, Any, Iterator, List, Optional, cast
99

1010
from ....jsonrpc2.protocol import rpc_method
1111
from ....utils.async_tools import threaded
@@ -121,27 +121,12 @@ async def get_tests_from_workspace(
121121
*args: Any,
122122
**kwargs: Any,
123123
) -> List[TestItem]:
124-
125124
from robot.output.logger import LOGGER
126-
from robot.parsing import get_model
127-
from robot.parsing.suitestructure import SuiteStructureBuilder
128125
from robot.running import TestCase, TestSuite
129-
from robot.running.builder.builders import (
130-
NoInitFileDirectoryParser,
131-
RobotParser,
132-
SuiteStructureParser,
133-
TestSuiteBuilder,
134-
)
126+
from robot.running.builder.builders import RobotParser, TestSuiteBuilder
135127

136128
from ..utils.version import get_robot_version
137129

138-
if get_robot_version() >= (6, 0):
139-
from robot.running.builder.settings import (
140-
Defaults as TestDefaults, # pyright: reportMissingImports=false
141-
)
142-
else:
143-
from robot.running.builder.testsettings import TestDefaults
144-
145130
def get_document_text(source: str) -> str:
146131
if self.parent._loop:
147132
doc = self.parent.documents.get_sync(Uri.from_path(source).normalized())
@@ -150,112 +135,16 @@ def get_document_text(source: str) -> str:
150135

151136
return source
152137

153-
class MyRobotParser(RobotParser):
154-
def _get_source(self, source: str) -> Any:
155-
return get_document_text(source)
156-
157-
def _build(
158-
self,
159-
suite: TestSuite,
160-
source: str,
161-
defaults: TestDefaults,
162-
model: Optional[ast.AST] = None,
163-
get_model: Callable[..., Any] = get_model,
164-
) -> TestSuite:
165-
166-
from robot.running.builder.transformers import (
167-
SettingsBuilder,
168-
SuiteBuilder,
169-
)
138+
def get_source(self: Any, source: str) -> str:
139+
return get_document_text(source)
170140

171-
if defaults is None:
172-
defaults = TestDefaults()
173-
if model is None:
174-
try:
175-
if get_robot_version() >= (6, 0):
176-
model = get_model(
177-
self._get_source(source),
178-
data_only=True,
179-
curdir=self._get_curdir(source),
180-
lang=self.lang,
181-
)
182-
else:
183-
model = get_model(self._get_source(source), data_only=True, curdir=self._get_curdir(source))
184-
except (asyncio.CancelledError, SystemExit, KeyboardInterrupt):
185-
raise
186-
except BaseException:
187-
pass
188-
189-
if model is None:
190-
return suite
191-
192-
SettingsBuilder(suite, defaults).visit(model)
193-
SuiteBuilder(suite, defaults).visit(model)
194-
suite.rpa = self._get_rpa_mode(model)
195-
return suite
196-
197-
class MyRestParser(MyRobotParser):
198-
def _get_source(self, source: str) -> Any:
199-
from robot.utils import read_rest_data
200-
from robot.utils.filereader import FileReader
201-
202-
with FileReader(source) as reader:
203-
return read_rest_data(reader)
204-
205-
class MySuiteStructureParserWithLang(SuiteStructureParser):
206-
def _get_parsers(self, extensions: List[str], lang: Any, process_curdir: bool) -> RobotParser:
207-
robot_parser = MyRobotParser(lang, process_curdir)
208-
rest_parser = MyRestParser(lang, process_curdir)
209-
parsers = {
210-
None: NoInitFileDirectoryParser(),
211-
"robot": robot_parser,
212-
"rst": rest_parser,
213-
"rest": rest_parser,
214-
}
215-
for ext in extensions:
216-
if ext not in parsers:
217-
parsers[ext] = robot_parser
218-
return parsers
219-
220-
def _validate_execution_mode(self, suite: Any) -> None:
221-
super()._validate_execution_mode(suite)
222-
223-
class MySuiteStructureParser(SuiteStructureParser):
224-
def _get_parsers(self, extensions: List[str], process_curdir: bool) -> RobotParser:
225-
robot_parser = MyRobotParser(process_curdir)
226-
rest_parser = MyRestParser(process_curdir)
227-
parsers = {
228-
None: NoInitFileDirectoryParser(),
229-
"robot": robot_parser,
230-
"rst": rest_parser,
231-
"rest": rest_parser,
232-
}
233-
for ext in extensions:
234-
if ext not in parsers:
235-
parsers[ext] = robot_parser
236-
return parsers
237-
238-
def _validate_execution_mode(self, suite: Any) -> None:
239-
super()._validate_execution_mode(suite)
240-
241-
class MyTestSuiteBuilder(TestSuiteBuilder):
242-
def _validate_test_counts(self, suite: TestSuite, multisource: bool = False) -> None:
243-
# we don't need this
244-
pass
245-
246-
def build(self, *paths: str) -> TestSuite:
247-
structure = SuiteStructureBuilder(self.included_extensions, self.included_suites).build(paths)
248-
if get_robot_version() >= (6, 0):
249-
parser = MySuiteStructureParserWithLang(
250-
self.included_extensions, self.rpa, self.lang, self.process_curdir
251-
)
252-
else:
253-
parser = MySuiteStructureParser(self.included_extensions, self.rpa, self.process_curdir)
254-
suite = parser.parse(structure)
255-
if not self.included_suites and not self.allow_empty_suite:
256-
self._validate_test_counts(suite, multisource=len(paths) > 1)
257-
suite.remove_empty_suites(preserve_direct_children=len(paths) > 1)
258-
return suite
141+
RobotParser._get_source = get_source
142+
143+
def _validate_test_counts(self: Any, suite: TestSuite, multisource: bool = False) -> None:
144+
# we don't need this
145+
pass
146+
147+
TestSuiteBuilder._validate_test_counts = _validate_test_counts
259148

260149
def generate(suite: TestSuite) -> TestItem:
261150
children: List[TestItem] = []
@@ -337,11 +226,13 @@ def nonexisting_paths(paths: List[str]) -> Iterator[str]:
337226
valid_paths = [i for i in normalize_paths(paths)]
338227

339228
if get_robot_version() >= (6, 0):
340-
builder = MyTestSuiteBuilder(
341-
included_suites=suites if suites else None, rpa=rpa_mode, lang=languages
229+
builder = TestSuiteBuilder(
230+
included_suites=suites if suites else None,
231+
rpa=rpa_mode,
232+
lang=languages,
342233
)
343234
else:
344-
builder = MyTestSuiteBuilder(included_suites=suites if suites else None, rpa=rpa_mode)
235+
builder = TestSuiteBuilder(included_suites=suites if suites else None, rpa=rpa_mode)
345236

346237
suite: Optional[TestSuite] = builder.build(*valid_paths) if valid_paths else None
347238
suite_item = [generate(suite)] if suite else []
@@ -370,11 +261,13 @@ def nonexisting_paths(paths: List[str]) -> Iterator[str]:
370261
]
371262
else:
372263
if get_robot_version() >= (6, 0):
373-
builder = MyTestSuiteBuilder(
374-
included_suites=suites if suites else None, rpa=rpa_mode, lang=languages
264+
builder = TestSuiteBuilder(
265+
included_suites=suites if suites else None,
266+
rpa=rpa_mode,
267+
lang=languages,
375268
)
376269
else:
377-
builder = MyTestSuiteBuilder(included_suites=suites if suites else None, rpa=rpa_mode)
270+
builder = TestSuiteBuilder(included_suites=suites if suites else None, rpa=rpa_mode)
378271
return [generate(builder.build(str(workspace_path)))]
379272
except (SystemExit, KeyboardInterrupt):
380273
raise

0 commit comments

Comments
 (0)