From c26444fbb17a6c00b78b6b3451412bd66649ac35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Janne=20H=C3=A4rk=C3=B6nen?= Date: Sat, 9 Sep 2023 09:04:57 +0300 Subject: [PATCH] model: remove deprecated attributes .keywords and .children have been deprecated since RF 4.0 .critical has also been deprecated a long time Part of #4846 --- src/robot/model/__init__.py | 2 +- src/robot/model/control.py | 10 ---- src/robot/model/keyword.py | 93 -------------------------------- src/robot/model/testcase.py | 15 +----- src/robot/model/testsuite.py | 15 +----- src/robot/result/model.py | 31 +---------- src/robot/running/model.py | 18 +------ utest/model/test_keyword.py | 10 +--- utest/model/test_testcase.py | 9 ---- utest/model/test_testsuite.py | 9 ---- utest/result/test_resultmodel.py | 11 ---- utest/running/test_run_model.py | 13 ----- 12 files changed, 6 insertions(+), 230 deletions(-) diff --git a/src/robot/model/__init__.py b/src/robot/model/__init__.py index 168bd8ecfa7..dd69a8dde7d 100644 --- a/src/robot/model/__init__.py +++ b/src/robot/model/__init__.py @@ -30,7 +30,7 @@ from .control import Break, Continue, Error, For, If, IfBranch, Return, Try, TryBranch, While from .fixture import create_fixture from .itemlist import ItemList -from .keyword import Keyword, Keywords +from .keyword import Keyword from .message import Message, MessageLevel, Messages from .modelobject import DataDict, ModelObject from .modifier import ModelModifier diff --git a/src/robot/model/control.py b/src/robot/model/control.py index 3069bbdb144..dd897a45c89 100644 --- a/src/robot/model/control.py +++ b/src/robot/model/control.py @@ -19,7 +19,6 @@ from robot.utils import setter from .body import Body, BodyItem, BodyItemParent, BaseBranches -from .keyword import Keywords from .modelobject import DataDict from .visitor import SuiteVisitor @@ -79,15 +78,6 @@ def variables(self, assign: 'tuple[str, ...]'): def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body: return self.body_class(self, body) - @property - def keywords(self): - """Deprecated since Robot Framework 4.0. Use :attr:`body` instead.""" - return Keywords(self, self.body) - - @keywords.setter - def keywords(self, keywords): - Keywords.raise_deprecation_error() - def visit(self, visitor: SuiteVisitor): visitor.visit_for(self) diff --git a/src/robot/model/keyword.py b/src/robot/model/keyword.py index e96beff0035..c141ac00339 100644 --- a/src/robot/model/keyword.py +++ b/src/robot/model/keyword.py @@ -78,96 +78,3 @@ def to_dict(self) -> DataDict: if self.assign: data['assign'] = self.assign return data - - -# FIXME: Remote in RF 7. -class Keywords(ItemList[BodyItem]): - """A list-like object representing keywords in a suite, a test or a keyword. - - Read-only and deprecated since Robot Framework 4.0. - """ - __slots__ = [] - deprecation_message = ( - "'keywords' attribute is read-only and deprecated since Robot Framework 4.0. " - "Use 'body', 'setup' or 'teardown' instead." - ) - - def __init__(self, parent: BodyItemParent = None, - keywords: Sequence[BodyItem] = ()): - warnings.warn(self.deprecation_message, UserWarning) - ItemList.__init__(self, object, {'parent': parent}) - if keywords: - ItemList.extend(self, keywords) - - @property - def setup(self) -> 'Keyword|None': - if self and self[0].type == 'SETUP': - return cast(Keyword, self[0]) - return None - - @setup.setter - def setup(self, kw): - self.raise_deprecation_error() - - def create_setup(self, *args, **kwargs): - self.raise_deprecation_error() - - @property - def teardown(self) -> 'Keyword|None': - if self and self[-1].type == 'TEARDOWN': - return cast(Keyword, self[-1]) - return None - - @teardown.setter - def teardown(self, kw: Keyword): - self.raise_deprecation_error() - - def create_teardown(self, *args, **kwargs): - self.raise_deprecation_error() - - @property - def all(self) -> 'Keywords': - """Iterates over all keywords, including setup and teardown.""" - return self - - @property - def normal(self) -> 'list[BodyItem]': - """Iterates over normal keywords, omitting setup and teardown.""" - return [kw for kw in self if kw.type not in ('SETUP', 'TEARDOWN')] - - def __setitem__(self, index: int, item: Keyword): - self.raise_deprecation_error() - - def create(self, *args, **kwargs): - self.raise_deprecation_error() - - def append(self, item: Keyword): - self.raise_deprecation_error() - - def extend(self, items: Sequence[Keyword]): - self.raise_deprecation_error() - - def insert(self, index: int, item: Keyword): - self.raise_deprecation_error() - - def pop(self, *index: int): - self.raise_deprecation_error() - - def remove(self, item: Keyword): - self.raise_deprecation_error() - - def clear(self): - self.raise_deprecation_error() - - def __delitem__(self, index: int): - self.raise_deprecation_error() - - def sort(self): - self.raise_deprecation_error() - - def reverse(self): - self.raise_deprecation_error() - - @classmethod - def raise_deprecation_error(cls: 'Type[Keywords]'): - raise AttributeError(cls.deprecation_message) diff --git a/src/robot/model/testcase.py b/src/robot/model/testcase.py index aacd2ffee02..8b91dead6d8 100644 --- a/src/robot/model/testcase.py +++ b/src/robot/model/testcase.py @@ -21,7 +21,7 @@ from .body import Body, BodyItem from .fixture import create_fixture from .itemlist import ItemList -from .keyword import Keyword, Keywords +from .keyword import Keyword from .modelobject import DataDict, ModelObject from .tags import Tags @@ -143,19 +143,6 @@ def has_teardown(self) -> bool: """ return bool(self._teardown) - @property - def keywords(self) -> Keywords: - """Deprecated since Robot Framework 4.0 - - Use :attr:`body`, :attr:`setup` or :attr:`teardown` instead. - """ - keywords = [self.setup] + list(self.body) + [self.teardown] - return Keywords(self, [kw for kw in keywords if kw]) - - @keywords.setter - def keywords(self, keywords): - Keywords.raise_deprecation_error() - @property def id(self) -> str: """Test case id in format like ``s1-t3``. diff --git a/src/robot/model/testsuite.py b/src/robot/model/testsuite.py index 2f9603b0f4a..bee93933632 100644 --- a/src/robot/model/testsuite.py +++ b/src/robot/model/testsuite.py @@ -24,7 +24,7 @@ from .filter import Filter, EmptySuiteRemover from .fixture import create_fixture from .itemlist import ItemList -from .keyword import Keyword, Keywords +from .keyword import Keyword from .metadata import Metadata from .modelobject import DataDict, ModelObject from .tagsetter import TagSetter @@ -308,19 +308,6 @@ def has_teardown(self) -> bool: """ return bool(self._teardown) - @property - def keywords(self) -> Keywords: - """Deprecated since Robot Framework 4.0. - - Use :attr:`setup` or :attr:`teardown` instead. - """ - keywords = [self.setup, self.teardown] - return Keywords(self, [kw for kw in keywords if kw]) - - @keywords.setter - def keywords(self, keywords): - Keywords.raise_deprecation_error() - @property def id(self) -> str: """An automatically generated unique id. diff --git a/src/robot/result/model.py b/src/robot/result/model.py index 26db0951d18..74e4433ce3f 100644 --- a/src/robot/result/model.py +++ b/src/robot/result/model.py @@ -43,7 +43,7 @@ from typing import Generic, Literal, Mapping, Sequence, Type, Union, TypeVar from robot import model -from robot.model import (BodyItem, create_fixture, DataDict, Keywords, Tags, +from robot.model import (BodyItem, create_fixture, DataDict, Tags, SuiteVisitor, TotalStatistics, TotalStatisticsBuilder, TestSuites) from robot.utils import copy_signature, KnownAtRuntime, setter @@ -761,21 +761,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body: """ return self.body_class(self, body) - @property - def keywords(self) -> Keywords: # FIXME: Remove in RF 7. - """Deprecated since Robot Framework 4.0. - - Use :attr:`body` or :attr:`teardown` instead. - """ - keywords = self.body.filter(messages=False) - if self.teardown: - keywords.append(self.teardown) - return Keywords(self, keywords) - - @keywords.setter - def keywords(self, keywords): - Keywords.raise_deprecation_error() - @property def messages(self) -> 'list[Message]': """Keyword's messages. @@ -785,15 +770,6 @@ def messages(self) -> 'list[Message]': """ return self.body.filter(messages=True) # type: ignore - @property - def children(self) -> 'list[BodyItem]': # FIXME: Remove in RF 7. - """List of child keywords and messages in creation order. - - Deprecated since Robot Framework 4.0. Use :attr:`body` instead. - """ - warnings.warn("'Keyword.children' is deprecated. Use 'Keyword.body' instead.") - return list(self.body) - @property def name(self) -> 'str|None': """Keyword name in format ``libname.kwname``. @@ -921,11 +897,6 @@ def _elapsed_time_from_children(self) -> timedelta: def not_run(self) -> bool: return False - @property - def critical(self) -> bool: # FIXME: Remove in RF 7. - warnings.warn("'TestCase.critical' is deprecated and always returns 'True'.") - return True - @setter def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body: """Test body as a :class:`~robot.result.Body` object.""" diff --git a/src/robot/running/model.py b/src/robot/running/model.py index 9241234cfd7..c956c0d9756 100644 --- a/src/robot/running/model.py +++ b/src/robot/running/model.py @@ -41,8 +41,7 @@ from robot import model from robot.conf import RobotSettings from robot.errors import BreakLoop, ContinueLoop, DataError, ReturnFromKeyword -from robot.model import (BodyItem, create_fixture, DataDict, Keywords, ModelObject, - TestSuites) +from robot.model import (BodyItem, create_fixture, DataDict, ModelObject, TestSuites) from robot.output import LOGGER, Output, pyloggingconf from robot.result import (Break as BreakResult, Continue as ContinueResult, Error as ErrorResult, Return as ReturnResult) @@ -787,21 +786,6 @@ def __init__(self, name: str = '', def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body: return Body(self, body) - @property - def keywords(self) -> Keywords: - """Deprecated since Robot Framework 4.0. - - Use :attr:`body` or :attr:`teardown` instead. - """ - kws = list(self.body) - if self.teardown: - kws.append(self.teardown) - return Keywords(self, kws) - - @keywords.setter - def keywords(self, keywords): - Keywords.raise_deprecation_error() - @property def teardown(self) -> Keyword: if self._teardown is None: diff --git a/utest/model/test_keyword.py b/utest/model/test_keyword.py index cc727934e8c..e34ffd52d47 100644 --- a/utest/model/test_keyword.py +++ b/utest/model/test_keyword.py @@ -1,7 +1,7 @@ import unittest import warnings -from robot.model import TestSuite, TestCase, Keyword, Keywords +from robot.model import TestSuite, TestCase, Keyword from robot.utils.asserts import (assert_equal, assert_not_equal, assert_true, assert_raises) @@ -122,13 +122,5 @@ def test_copy_and_deepcopy_with_non_existing_attributes(self): assert_raises(AttributeError, Keyword().deepcopy, bad='attr') -class TestKeywords(unittest.TestCase): - - def test_deprecation(self): - with warnings.catch_warnings(record=True) as w: - Keywords() - assert_true('deprecated' in str(w[0].message)) - - if __name__ == '__main__': unittest.main() diff --git a/utest/model/test_testcase.py b/utest/model/test_testcase.py index 72815175a25..1008304e661 100644 --- a/utest/model/test_testcase.py +++ b/utest/model/test_testcase.py @@ -100,15 +100,6 @@ def test_deepcopy_with_attributes(self): assert_equal(copy.name, 'New') assert_equal(copy.doc, 'New') - def test_keywords_deprecation(self): - self.test.body = [Keyword(), Keyword(), Keyword()] - with warnings.catch_warnings(record=True) as w: - kws = self.test.keywords - assert_equal(len(kws), 3) - assert_true('deprecated' in str(w[0].message)) - assert_raises(AttributeError, kws.append, Keyword()) - assert_raises(AttributeError, setattr, self.test, 'keywords', []) - class TestStringRepresentation(unittest.TestCase): diff --git a/utest/model/test_testsuite.py b/utest/model/test_testsuite.py index ab1bba6b7f6..9c65e3dff49 100644 --- a/utest/model/test_testsuite.py +++ b/utest/model/test_testsuite.py @@ -189,15 +189,6 @@ def test_configure_only_works_with_root_suite(self): def test_slots(self): assert_raises(AttributeError, setattr, self.suite, 'attr', 'value') - def test_keywords_deprecation(self): - self.suite.setup.config(name='S') - with warnings.catch_warnings(record=True) as w: - kws = self.suite.keywords - assert_equal(len(kws), 1) - assert_true('deprecated' in str(w[0].message)) - assert_raises(AttributeError, kws.extend, ()) - assert_raises(AttributeError, setattr, self.suite, 'keywords', []) - class TestSuiteId(unittest.TestCase): diff --git a/utest/result/test_resultmodel.py b/utest/result/test_resultmodel.py index 8d21460e81e..0de943b1d1c 100644 --- a/utest/result/test_resultmodel.py +++ b/utest/result/test_resultmodel.py @@ -407,17 +407,6 @@ def test_keyword_teardown(self): assert_equal(kw.teardown.name, None) assert_equal(kw.teardown.type, 'TEARDOWN') - def test_keywords_deprecation(self): - kw = Keyword() - kw.body = [Keyword(), Message(), Keyword(), Keyword(), Message()] - kw.teardown.config(kwname='T') - with warnings.catch_warnings(record=True) as w: - kws = kw.keywords - assert_equal(list(kws), [kw.body[0], kw.body[2], kw.body[3], kw.teardown]) - assert_true('deprecated' in str(w[0].message)) - assert_raises(AttributeError, kws.append, Keyword()) - assert_raises(AttributeError, setattr, kw, 'keywords', []) - def test_for_parents(self): test = TestCase() for_ = test.body.create_for() diff --git a/utest/running/test_run_model.py b/utest/running/test_run_model.py index 21de2e43529..a050c960f10 100644 --- a/utest/running/test_run_model.py +++ b/utest/running/test_run_model.py @@ -43,19 +43,6 @@ def test_test_case_keyword(self): assert_not_equal(type(kw), model.Keyword) -class TestUserKeyword(unittest.TestCase): - - def test_keywords_deprecation(self): - uk = UserKeyword('Name') - uk.body.create_keyword() - uk.teardown.config(name='T') - with warnings.catch_warnings(record=True) as w: - kws = uk.keywords - assert_equal(len(kws), 2) - assert_true('deprecated' in str(w[0].message)) - assert_raises(AttributeError, kws.append, Keyword()) - assert_raises(AttributeError, setattr, uk, 'keywords', []) - class TestSuiteFromSources(unittest.TestCase): path = Path(os.getenv('TEMPDIR') or tempfile.gettempdir(),