Skip to content

Commit

Permalink
model: remove deprecated attributes
Browse files Browse the repository at this point in the history
.keywords and .children have been deprecated since RF 4.0
.critical has also been deprecated a long time

Part of #4846
  • Loading branch information
Janne Härkönen authored and yanne committed Oct 3, 2023
1 parent ac8549a commit c26444f
Show file tree
Hide file tree
Showing 12 changed files with 6 additions and 230 deletions.
2 changes: 1 addition & 1 deletion src/robot/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 0 additions & 10 deletions src/robot/model/control.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)

Expand Down
93 changes: 0 additions & 93 deletions src/robot/model/keyword.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
15 changes: 1 addition & 14 deletions src/robot/model/testcase.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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``.
Expand Down
15 changes: 1 addition & 14 deletions src/robot/model/testsuite.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
31 changes: 1 addition & 30 deletions src/robot/result/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand All @@ -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``.
Expand Down Expand Up @@ -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."""
Expand Down
18 changes: 1 addition & 17 deletions src/robot/running/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
10 changes: 1 addition & 9 deletions utest/model/test_keyword.py
Original file line number Diff line number Diff line change
@@ -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)

Expand Down Expand Up @@ -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()
9 changes: 0 additions & 9 deletions utest/model/test_testcase.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down
9 changes: 0 additions & 9 deletions utest/model/test_testsuite.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down
11 changes: 0 additions & 11 deletions utest/result/test_resultmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
13 changes: 0 additions & 13 deletions utest/running/test_run_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down

0 comments on commit c26444f

Please sign in to comment.