Coverage for triplelite / _graph.py: 88%
42 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-09 08:39 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-06-09 08:39 +0000
1# SPDX-FileCopyrightText: 2026 Arcangelo Massari <arcangelo.massari@unibo.it>
2#
3# SPDX-License-Identifier: ISC
5from __future__ import annotations
7from typing import Iterator
9from triplelite._core import TripleLite as _CTripleLite
10from triplelite._rdflib_bridge import to_rdflib as _to_rdflib
11from triplelite._types import RDFTerm, Triple
14class SubgraphView:
15 __slots__ = ("_parent", "_subject")
17 def __init__(self, parent: TripleLite, subject: str) -> None:
18 self._parent = parent
19 self._subject = subject
21 def predicate_objects(self, subject: str | None = None) -> Iterator[tuple[str, RDFTerm]]:
22 if subject is not None and subject != self._subject:
23 return
24 yield from self._parent.predicate_objects(subject=self._subject)
26 def __iter__(self) -> Iterator[Triple]:
27 yield from self._parent.triples((self._subject, None, None))
29 def __len__(self) -> int:
30 return sum(1 for _ in self)
32 def __eq__(self, other: object) -> bool:
33 if isinstance(other, (set, frozenset)):
34 return set(self) == other
35 return NotImplemented
37 def __sub__(self, other: set | frozenset) -> set:
38 return set(self) - other
40 def __rsub__(self, other: set | frozenset) -> set | frozenset:
41 return other - set(self)
44def _rebuild_triplelite(
45 identifier: str | None,
46 reverse_index_predicates: frozenset[str] | None,
47 triples: list[Triple],
48) -> TripleLite:
49 g = TripleLite(identifier=identifier, reverse_index_predicates=reverse_index_predicates)
50 g.add_many(triples)
51 return g
54class TripleLite(_CTripleLite):
55 def __init__(self, identifier: str | None = None, reverse_index_predicates: frozenset[str] | None = None) -> None:
56 super().__init__(identifier=identifier, reverse_index_predicates=reverse_index_predicates)
57 self._reverse_index_predicates = reverse_index_predicates
59 def __reduce__(self) -> tuple:
60 return (_rebuild_triplelite, (self.identifier, self._reverse_index_predicates, list(self)))
62 def subgraph(self, subject: str) -> SubgraphView | None:
63 if not self.has_subject(subject):
64 return None
65 return SubgraphView(self, subject)
67 def to_rdflib(self):
68 return _to_rdflib(self)