Philipp Hörist pushed to branch master at gajim / gajim
Commits: 91ebe1fe by lovetox at 2022-03-13T08:34:28+01:00 Roster: Add type annotations
- - - - - 1eae9915 by lovetox at 2022-03-13T08:34:28+01:00 Cache: Support roster approved attribute
- - - - - 11ecfd53 by lovetox at 2022-03-13T08:34:28+01:00 Raise nbxmpp
- - - - -
4 changed files:
- gajim/common/modules/roster.py - gajim/common/storage/base.py - gajim/common/storage/cache.py - gajim/gajim.py
Changes:
===================================== gajim/common/modules/roster.py ===================================== @@ -14,14 +14,27 @@
# Roster
+from __future__ import annotations + +from typing import Iterable +from typing import Iterator +from typing import Optional +from typing import cast + import nbxmpp from nbxmpp.namespaces import Namespace +from nbxmpp.protocol import JID +from nbxmpp.structs import RosterData +from nbxmpp.structs import RosterItem from nbxmpp.structs import StanzaHandler +from nbxmpp.task import Task
from gajim.common import app +from gajim.common.client import Client from gajim.common.events import RosterReceived from gajim.common.events import RosterPush from gajim.common.modules.base import BaseModule +from gajim.common.modules.contacts import BareContact
class Roster(BaseModule): @@ -32,8 +45,8 @@ class Roster(BaseModule): 'set_item', ]
- def __init__(self, con): - BaseModule.__init__(self, con) + def __init__(self, client: Client) -> None: + BaseModule.__init__(self, client)
self.handlers = [ # StanzaHandler(name='presence', @@ -44,12 +57,12 @@ def __init__(self, con): ns=Namespace.ROSTER), ]
- self._roster = {} + self._roster: dict[JID, RosterItem] = {}
# Groups cache for performance self._groups = None
- def load_roster(self): + def load_roster(self) -> None: self._log.info('Load from database') roster = app.storage.cache.load_roster(self._account) if not roster: @@ -63,13 +76,13 @@ def load_roster(self):
self._roster = roster
- def _store_roster(self): + def _store_roster(self) -> None: app.storage.cache.store_roster(self._account, self._roster)
- def get_size(self): + def get_size(self) -> int: return len(self._roster)
- def request_roster(self): + def request_roster(self) -> None: version = app.settings.get_account_setting(self._account, 'roster_version')
@@ -77,9 +90,9 @@ def request_roster(self): self._nbxmpp('Roster').request_roster( version, callback=self._on_request_roster)
- def _on_request_roster(self, task): + def _on_request_roster(self, task: Task) -> None: try: - roster = task.finish() + roster = cast(RosterData, task.finish()) except Exception as error: self._log.warning(error) return @@ -96,6 +109,7 @@ def _on_request_roster(self, task): # --------------- # Roster versioning supported but # server opted to send us the whole roster + assert roster.items is not None self._set_roster_from_data(roster.items)
app.settings.set_account_setting(self._account, @@ -106,7 +120,7 @@ def _on_request_roster(self, task):
self._con.connect_machine()
- def _set_roster_from_data(self, items): + def _set_roster_from_data(self, items: list[RosterItem]) -> None: self._roster.clear() self._groups = None
@@ -139,52 +153,55 @@ def _process_roster_push(self, _con, _stanza, properties):
raise nbxmpp.NodeProcessed
- def get_item(self, jid): + def get_item(self, jid: JID) -> Optional[RosterItem]: return self._roster.get(jid)
- def set_groups(self, jid, groups): + def set_groups(self, jid: JID, groups: Optional[Iterable[str]]) -> None: if groups is not None: groups = set(groups) item = self.get_item(jid) + assert item is not None self._nbxmpp('Roster').set_item(jid, item.name, groups)
- def get_groups(self): + def get_groups(self) -> set[str]: if self._groups is not None: return set(self._groups)
- groups = set() + groups: set[str] = set() for item in self._roster.values(): groups.update(item.groups) self._groups = groups return set(groups)
- def _get_items_with_group(self, group): - return filter(lambda item: group in item.groups, self._roster.values()) + def _get_items_with_group(self, group: str) -> list[RosterItem]: + return list(filter(lambda item: group in item.groups, + self._roster.values()))
- def remove_group(self, group): + def remove_group(self, group: str) -> None: items = self._get_items_with_group(group) for item in items: new_groups = item.groups - set([group]) self.set_groups(item.jid, new_groups)
- def rename_group(self, group, new_group): + def rename_group(self, group: str, new_group: str) -> None: items = self._get_items_with_group(group) for item in items: new_groups = item.groups - set([group]) new_groups.add(new_group) self.set_groups(item.jid, new_groups)
- def change_group(self, jid, old_group, new_group): + def change_group(self, jid: JID, old_group: str, new_group: str) -> None: item = self.get_item(jid) + assert item is not None groups = set(item.groups) groups.discard(old_group) groups.add(new_group) self._nbxmpp('Roster').set_item(jid, item.name, groups)
- def iter(self): + def iter(self) -> Iterator[tuple[JID, RosterItem]]: for jid, data in self._roster.items(): yield jid, data
- def iter_contacts(self): + def iter_contacts(self) -> Iterator[BareContact]: for jid in self._roster: yield self._get_contact(jid)
===================================== gajim/common/storage/base.py ===================================== @@ -114,6 +114,7 @@ def json_decoder(dct: dict[str, Any]) -> Any: name=dct['name'], ask=dct['ask'], subscription=dct['subscription'], + approved=dct['approved'], groups=set(dct['groups'])) return dct
===================================== gajim/common/storage/cache.py ===================================== @@ -36,7 +36,7 @@ from gajim.common.storage.base import json_decoder
-CURRENT_USER_VERSION = 8 +CURRENT_USER_VERSION = 9
CACHE_SQL_STATEMENT = ''' CREATE TABLE caps_cache ( @@ -128,7 +128,7 @@ def _migrate(self) -> None: self._reinit_storage() return
- if user_version < 8: + if user_version < 9: self._reinit_storage() return
===================================== gajim/gajim.py ===================================== @@ -30,7 +30,7 @@ from gajim.common import i18n
-_MIN_NBXMPP_VER = '2.99.0' +_MIN_NBXMPP_VER = '3.0.0-dev2' _MIN_GTK_VER = '3.22.27' _MIN_CAIRO_VER = '1.16.0' _MIN_PYGOBJECT_VER = '3.32.0'
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/8b35d0545287d8778f9fcc6f4a27e9f3...