diff --git a/tests/test_types_objects.yml b/tests/test_types_objects.yml index 12780c4..7ddee9b 100644 --- a/tests/test_types_objects.yml +++ b/tests/test_types_objects.yml @@ -1,11 +1,25 @@ +- case: fail_on_missing_method + regex: yes + main: | + from zammadoo import Client + + client = Client("", http_token="") + client.tickets(1).missing_method() + out: | + main:4: error: "None" not callable \[misc\] + main:4: error: "bool" not callable \[operator\] + main:4: error: "int" not callable \[operator\] + main:4: error: "float" not callable \[operator\] + main:4: error: "str" not callable \[operator\] + main:4: error: "[Ll]ist\[JsonType\]" not callable \[operator\] + main:4: error: "[Dd]ict\[str, JsonType\]" not callable \[operator\] + main:4: error: "datetime" not callable \[operator\] - case: client_attributes_are_of_proper_type skip: sys.implementation.name == "pypy" main: | from zammadoo import Client - client = Client("", http_token="") - - client.tickets(1).missing_method() # E: "object" not callable [operator] + client = Client("", http_token="") reveal_type(client.groups) # N: Revealed type is "zammadoo.groups.Groups" reveal_type( diff --git a/zammadoo/articles.py b/zammadoo/articles.py index efe71f1..15c35b6 100644 --- a/zammadoo/articles.py +++ b/zammadoo/articles.py @@ -170,32 +170,33 @@ class Article(Resource): @property def created_by(self) -> "User": - uid = self["created_by_id"] + uid: int = self["created_by_id"] return self.parent.client.users(uid) @property def origin_by(self) -> Optional["User"]: - oid = self["origin_by_id"] + oid: int = self["origin_by_id"] return self.parent.client.users(oid) @property def updated_by(self) -> "User": - uid = self["updated_by_id"] + uid: int = self["updated_by_id"] return self.parent.client.users(uid) @property def ticket(self) -> "Ticket": - return self.parent.client.tickets(self["ticket_id"]) + tid: int = self["ticket_id"] + return self.parent.client.tickets(tid) @property def attachments(self) -> List[Attachment]: """A list of the articles attachments.""" - attachment_list = [] client = self.parent.client - for info in self["attachments"]: - url = f"{client.url}/ticket_attachment/{self['ticket_id']}/{self.id}/{info['id']}" - attachment_list.append(Attachment(client, url, info)) - return attachment_list + attachment_url = f"{client.url}/ticket_attachment/{self['ticket_id']}/{self.id}" + return [ + Attachment(client, f"{attachment_url}/{info['id']}", info) + for info in self["attachments"] + ] class Articles(CreatableT[Article], ResourcesT[Article]): diff --git a/zammadoo/resource.py b/zammadoo/resource.py index 9aed5fb..4b5bb86 100644 --- a/zammadoo/resource.py +++ b/zammadoo/resource.py @@ -71,12 +71,12 @@ class MutableResource(Resource): @property def created_by(self) -> "User": - uid = self["created_by_id"] + uid: int = self["created_by_id"] return self.parent.client.users(uid) @property def updated_by(self) -> "User": - uid = self["updated_by_id"] + uid: int = self["updated_by_id"] return self.parent.client.users(uid) def update(self: _T_co, **kwargs) -> _T_co: diff --git a/zammadoo/tickets.py b/zammadoo/tickets.py index a4f19ac..7720122 100644 --- a/zammadoo/tickets.py +++ b/zammadoo/tickets.py @@ -57,12 +57,12 @@ class State(NamedResource): @property def next_state(self) -> Optional["State"]: - sid = self["next_state_id"] - return sid and self.parent.client.ticket_states(sid) + sid: Optional[int] = self["next_state_id"] + return None if sid is None else self.parent.client.ticket_states(sid) @property def state_type(self) -> "State": - sid = self["state_type_id"] + sid: int = self["state_type_id"] return self.parent.client.ticket_states(sid) @@ -94,7 +94,6 @@ class Ticket(MutableResource): EXPANDED_ATTRIBUTES = "article_ids", "create_article_sender", "create_article_type" article_count: Optional[int] #: - article_ids: List[int] #: create_article_sender: str #: create_article_type: str #: note: Optional[str] #: @@ -104,18 +103,18 @@ class Ticket(MutableResource): @property def customer(self) -> "User": - uid = self["customer_id"] + uid: int = self["customer_id"] return self.parent.client.users(uid) @property def group(self) -> "Group": - gid = self["group_id"] + gid: int = self["group_id"] return self.parent.client.groups(gid) @property def organization(self) -> Optional["Organization"]: - oid = self["organization_id"] - return oid and self.parent.client.organizations(oid) + oid: Optional[int] = self["organization_id"] + return None if oid is None else self.parent.client.organizations(oid) @property def owner(self) -> "User": @@ -123,17 +122,17 @@ def owner(self) -> "User": .. note:: unassigned tickets will be represented by User with id=1 """ - uid = self["owner_id"] + uid: int = self["owner_id"] return self.parent.client.users(uid) @property def priority(self) -> Priority: - pid = self["priority_id"] + pid: int = self["priority_id"] return self.parent.client.ticket_priorities(pid) @property def state(self) -> State: - sid = self["state_id"] + sid: int = self["state_id"] return self.parent.client.ticket_states(sid) @property @@ -142,7 +141,8 @@ def articles(self) -> List["Article"]: all articles related to the ticket as sent by ``/ticket_articles/by_ticket/{ticket id}`` """ articles = self.parent.client.ticket_articles - return [articles(aid) for aid in sorted(self.article_ids)] + article_ids: List[int] = self["article_ids"] + return [articles(aid) for aid in sorted(article_ids)] @property def time_accountings(self) -> List[TimeAccounting]: diff --git a/zammadoo/users.py b/zammadoo/users.py index 203b506..0b959ad 100644 --- a/zammadoo/users.py +++ b/zammadoo/users.py @@ -66,13 +66,13 @@ def groups(self) -> List[Group]: @property def last_login(self) -> Optional[datetime]: - last_login = self["last_login"] - return last_login and fromisoformat(last_login) + last_login: Optional[str] = self["last_login"] + return None if last_login is None else fromisoformat(last_login) @property def organization(self) -> Optional["Organization"]: - oid = self["organization_id"] - return oid and self.parent.client.organizations(oid) + oid: Optional[int] = self["organization_id"] + return None if oid is None else self.parent.client.organizations(oid) @property def organizations(self) -> List["Organization"]: @@ -81,8 +81,8 @@ def organizations(self) -> List["Organization"]: @property def out_of_office_replacement(self) -> Optional["User"]: - uid = self["out_of_office_replacement_id"] - return uid and self.parent.client.users(uid) + uid: Optional[int] = self["out_of_office_replacement_id"] + return None if uid is None else self.parent.client.users(uid) @property def roles(self) -> List["Role"]: diff --git a/zammadoo/utils.py b/zammadoo/utils.py index bda4dc6..27593b0 100644 --- a/zammadoo/utils.py +++ b/zammadoo/utils.py @@ -75,8 +75,8 @@ def __init__( self._info = info or {} self._frozen = True - def __getattr__(self, name: str) -> object: - info = self._info + def __getattr__(self, name: str) -> Union["JsonType", datetime]: + info: Dict[str, "JsonType"] = self._info key = "from" if name == "from_" else name if key in info: if not key.endswith("_at"):