diff --git a/tests/test_types_objects.yml b/tests/test_types_objects.yml index 7df4eeb..12780c4 100644 --- a/tests/test_types_objects.yml +++ b/tests/test_types_objects.yml @@ -17,6 +17,7 @@ reveal_type(client.roles) # N: Revealed type is "zammadoo.roles.Roles" role = client.roles(0) + reveal_type(role.name) # N: Revealed type is "builtins.str" reveal_type(role.permissions) # N: Revealed type is "builtins.list[builtins.str]" reveal_type(role.update()) # N: Revealed type is "zammadoo.roles.Role" @@ -24,8 +25,8 @@ reveal_type( client.organizations.create("")) # N: Revealed type is "zammadoo.organizations.Organization" reveal_type( - client.organizations(0).update() # N: Revealed type is "zammadoo.organizations.Organization" - ) + client.organizations(0).update()) # N: Revealed type is "zammadoo.organizations.Organization" + reveal_type(client.tags) # N: Revealed type is "zammadoo.tags.Tags" reveal_type(iter(client.tags)) # N: Revealed type is "typing.Iterator[TypedDict('zammadoo.utils.TypedTag', {'id': builtins.int, 'name': builtins.str, 'count': Union[builtins.int, None]})]" diff --git a/tests/test_users.py b/tests/test_users.py index 2d6e6d1..b40e051 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -2,12 +2,20 @@ # -*- coding: UTF-8 -*- from datetime import datetime +import pytest + def test_user_name_attribute(client): user = client.users(123, info={"id": 123, "login": "someone@pytest"}) assert user.name == "someone@pytest" +def test_user_name_attribute_is_readonly(client): + user = client.users(123, info={"id": 123, "login": "someone@pytest"}) + with pytest.raises(AttributeError, match="read-only"): + user.name = "" + + def test_user_fullname_attribute_given_firstname_only(client): user = client.users(123, info={"id": 123, "firstname": "Max", "lastname": None}) assert user.fullname == user.firstname == "Max" diff --git a/zammadoo/resource.py b/zammadoo/resource.py index 0f39160..084aa98 100644 --- a/zammadoo/resource.py +++ b/zammadoo/resource.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Any, Optional from .resources import ResourcesT, _T_co -from .utils import fromisoformat, info_cast +from .utils import fromisoformat if TYPE_CHECKING: from .users import User @@ -153,9 +153,5 @@ def delete(self) -> None: class NamedResource(MutableResource): active: bool #: + name: str #: note: Optional[str] #: - - @property - def name(self) -> str: - self._initialize() - return info_cast(self._info)["name"] diff --git a/zammadoo/users.py b/zammadoo/users.py index 6d74831..33c24b1 100644 --- a/zammadoo/users.py +++ b/zammadoo/users.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- + from datetime import datetime from functools import cached_property from typing import TYPE_CHECKING, Dict, List, Optional, Union @@ -7,7 +8,7 @@ from .groups import Group from .resource import NamedResource from .resources import CreatableT, SearchableT -from .utils import fromisoformat, info_cast +from .utils import fromisoformat if TYPE_CHECKING: from .client import Client @@ -51,8 +52,12 @@ def longname(self) -> str: @property def name(self) -> str: """alias for :attr:`login`""" - self._initialize() - return info_cast(self._info)["login"] + return self.login + + @name.setter + # dummy setter to keep mypy happy + # value setting is prevented by Resource.__setattr__() + def name(self, _value) -> None: ... @property def groups(self) -> List[Group]: diff --git a/zammadoo/utils.py b/zammadoo/utils.py index 7c0d511..2d3eb2c 100644 --- a/zammadoo/utils.py +++ b/zammadoo/utils.py @@ -49,8 +49,6 @@ class TypedInfo(TypedDict, total=False): create_article_sender: str create_article_type: str id: int - name: str - login: str page: int parent_id: Optional[int] per_page: int