Coverage for slidge/space/nodes.py: 100%

24 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-11-10 12:26 +0000

1from typing import ClassVar, Unpack 

2 

3import sqlalchemy as sa 

4import sqlalchemy.orm 

5 

6from ..core.collection import BaseByLegacyID 

7from ..db.models import Space 

8from ..util.types import AnySession 

9from ..util.util import derive_wired_class 

10from .space import LegacySpace, _SpaceProps 

11 

12 

13class LegacySpaceNodes[SpaceT: LegacySpace = LegacySpace]( 

14 BaseByLegacyID[Space, SpaceT] 

15): 

16 """ 

17 A class to manage :xep:`0503` spaces. 

18 

19 It is accessible through the ``.spaces`` attribute of the 

20 :class:`.slidge.BaseSession` of a given :term:`user <User>`. 

21 """ 

22 

23 _space_cls: ClassVar[type[LegacySpace]] = LegacySpace # type:ignore[type-abstract] 

24 

25 def __init_subclass__(cls, **kwargs: object) -> None: 

26 super().__init_subclass__(**kwargs) 

27 derive_wired_class(cls, LegacySpaceNodes, "_space_cls") 

28 

29 def __init__(self, session: AnySession) -> None: 

30 super().__init__( 

31 session=session, 

32 model=Space, 

33 child_cls=self._space_cls, # type:ignore[arg-type] 

34 store=session.xmpp.store.spaces, 

35 ) 

36 self.log = session.log 

37 

38 def legacy_id_to_node(self, legacy_id: str) -> str: 

39 return legacy_id 

40 

41 def node_to_legacy_id(self, node: str) -> str: 

42 return node 

43 

44 def _create(self, legacy_id: str, **kwargs: Unpack[_SpaceProps]) -> SpaceT: # type:ignore[override] 

45 return super()._create(legacy_id, **kwargs) 

46 

47 def _batch_load(self) -> sa.Select[Space]: 

48 return super()._batch_load().options(sa.orm.joinedload(self._model.banner))