inputlayer-client-dev 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,231 @@
1
+ """InputLayerSync / KnowledgeGraphSync - synchronous wrappers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from typing import Any, Callable, Iterator
7
+
8
+ from inputlayer.auth import AclEntry, ApiKeyInfo, UserInfo
9
+ from inputlayer.client import InputLayer
10
+ from inputlayer.index import HnswIndex
11
+ from inputlayer.knowledge_graph import (
12
+ ClearResult,
13
+ DeleteResult,
14
+ ExplainResult,
15
+ IndexInfo,
16
+ IndexStats,
17
+ InsertResult,
18
+ RelationDescription,
19
+ RelationInfo,
20
+ RuleInfo,
21
+ ServerStatus,
22
+ )
23
+ from inputlayer.relation import Relation
24
+ from inputlayer.result import ResultSet
25
+
26
+
27
+ def _get_or_create_loop() -> asyncio.AbstractEventLoop:
28
+ """Get or create an event loop for sync wrappers."""
29
+ try:
30
+ loop = asyncio.get_event_loop()
31
+ if loop.is_closed():
32
+ raise RuntimeError("closed")
33
+ return loop
34
+ except RuntimeError:
35
+ loop = asyncio.new_event_loop()
36
+ asyncio.set_event_loop(loop)
37
+ return loop
38
+
39
+
40
+ class KnowledgeGraphSync:
41
+ """Synchronous wrapper around KnowledgeGraph."""
42
+
43
+ def __init__(self, kg: Any, loop: asyncio.AbstractEventLoop) -> None:
44
+ self._kg = kg
45
+ self._loop = loop
46
+
47
+ @property
48
+ def name(self) -> str:
49
+ return self._kg.name
50
+
51
+ @property
52
+ def session(self) -> Any:
53
+ return self._kg.session # TODO: SessionSync wrapper
54
+
55
+ def define(self, *relations: type[Relation]) -> None:
56
+ self._loop.run_until_complete(self._kg.define(*relations))
57
+
58
+ def relations(self) -> list[RelationInfo]:
59
+ return self._loop.run_until_complete(self._kg.relations())
60
+
61
+ def describe(self, relation: type[Relation] | str) -> RelationDescription:
62
+ return self._loop.run_until_complete(self._kg.describe(relation))
63
+
64
+ def drop_relation(self, relation: type[Relation] | str) -> None:
65
+ self._loop.run_until_complete(self._kg.drop_relation(relation))
66
+
67
+ def insert(self, facts: Any, data: Any = None) -> InsertResult:
68
+ return self._loop.run_until_complete(self._kg.insert(facts, data=data))
69
+
70
+ def delete(self, facts: Any, *, where: Callable | None = None) -> DeleteResult:
71
+ return self._loop.run_until_complete(self._kg.delete(facts, where=where))
72
+
73
+ def query(self, *select: Any, **kwargs: Any) -> ResultSet:
74
+ return self._loop.run_until_complete(self._kg.query(*select, **kwargs))
75
+
76
+ def vector_search(self, relation: type[Relation], query_vec: list[float], **kwargs: Any) -> ResultSet:
77
+ return self._loop.run_until_complete(self._kg.vector_search(relation, query_vec, **kwargs))
78
+
79
+ def define_rules(self, *targets: Any) -> None:
80
+ self._loop.run_until_complete(self._kg.define_rules(*targets))
81
+
82
+ def list_rules(self) -> list[RuleInfo]:
83
+ return self._loop.run_until_complete(self._kg.list_rules())
84
+
85
+ def rule_definition(self, name: str | type) -> list[str]:
86
+ return self._loop.run_until_complete(self._kg.rule_definition(name))
87
+
88
+ def drop_rule(self, name: str | type) -> None:
89
+ self._loop.run_until_complete(self._kg.drop_rule(name))
90
+
91
+ def drop_rule_clause(self, name: str | type, index: int) -> None:
92
+ self._loop.run_until_complete(self._kg.drop_rule_clause(name, index))
93
+
94
+ def clear_rule(self, name: str | type) -> None:
95
+ self._loop.run_until_complete(self._kg.clear_rule(name))
96
+
97
+ def drop_rules_by_prefix(self, prefix: str) -> None:
98
+ self._loop.run_until_complete(self._kg.drop_rules_by_prefix(prefix))
99
+
100
+ def create_index(self, index: HnswIndex) -> None:
101
+ self._loop.run_until_complete(self._kg.create_index(index))
102
+
103
+ def list_indexes(self) -> list[IndexInfo]:
104
+ return self._loop.run_until_complete(self._kg.list_indexes())
105
+
106
+ def index_stats(self, name: str) -> IndexStats:
107
+ return self._loop.run_until_complete(self._kg.index_stats(name))
108
+
109
+ def drop_index(self, name: str) -> None:
110
+ self._loop.run_until_complete(self._kg.drop_index(name))
111
+
112
+ def rebuild_index(self, name: str) -> None:
113
+ self._loop.run_until_complete(self._kg.rebuild_index(name))
114
+
115
+ def grant_access(self, username: str, role: str) -> None:
116
+ self._loop.run_until_complete(self._kg.grant_access(username, role))
117
+
118
+ def revoke_access(self, username: str) -> None:
119
+ self._loop.run_until_complete(self._kg.revoke_access(username))
120
+
121
+ def list_acl(self) -> list[AclEntry]:
122
+ return self._loop.run_until_complete(self._kg.list_acl())
123
+
124
+ def explain(self, *select: Any, **kwargs: Any) -> ExplainResult:
125
+ return self._loop.run_until_complete(self._kg.explain(*select, **kwargs))
126
+
127
+ def compact(self) -> None:
128
+ self._loop.run_until_complete(self._kg.compact())
129
+
130
+ def status(self) -> ServerStatus:
131
+ return self._loop.run_until_complete(self._kg.status())
132
+
133
+ def load(self, path: str, *, mode: str | None = None) -> None:
134
+ self._loop.run_until_complete(self._kg.load(path, mode=mode))
135
+
136
+ def clear_prefix(self, prefix: str) -> ClearResult:
137
+ return self._loop.run_until_complete(self._kg.clear_prefix(prefix))
138
+
139
+ def execute(self, datalog: str) -> ResultSet:
140
+ return self._loop.run_until_complete(self._kg.execute(datalog))
141
+
142
+
143
+ class InputLayerSync:
144
+ """Synchronous wrapper around InputLayer."""
145
+
146
+ def __init__(
147
+ self,
148
+ url: str,
149
+ *,
150
+ username: str | None = None,
151
+ password: str | None = None,
152
+ api_key: str | None = None,
153
+ auto_reconnect: bool = True,
154
+ reconnect_delay: float = 1.0,
155
+ max_reconnect_attempts: int = 10,
156
+ initial_kg: str | None = None,
157
+ ) -> None:
158
+ self._loop = _get_or_create_loop()
159
+ self._client = InputLayer(
160
+ url,
161
+ username=username,
162
+ password=password,
163
+ api_key=api_key,
164
+ auto_reconnect=auto_reconnect,
165
+ reconnect_delay=reconnect_delay,
166
+ max_reconnect_attempts=max_reconnect_attempts,
167
+ initial_kg=initial_kg,
168
+ )
169
+
170
+ def connect(self) -> None:
171
+ self._loop.run_until_complete(self._client.connect())
172
+
173
+ def close(self) -> None:
174
+ self._loop.run_until_complete(self._client.close())
175
+
176
+ def __enter__(self) -> InputLayerSync:
177
+ self.connect()
178
+ return self
179
+
180
+ def __exit__(self, *exc: Any) -> None:
181
+ self.close()
182
+
183
+ @property
184
+ def connected(self) -> bool:
185
+ return self._client.connected
186
+
187
+ @property
188
+ def session_id(self) -> str | None:
189
+ return self._client.session_id
190
+
191
+ @property
192
+ def server_version(self) -> str | None:
193
+ return self._client.server_version
194
+
195
+ @property
196
+ def role(self) -> str | None:
197
+ return self._client.role
198
+
199
+ def knowledge_graph(self, name: str, *, create: bool = True) -> KnowledgeGraphSync:
200
+ kg = self._client.knowledge_graph(name, create=create)
201
+ return KnowledgeGraphSync(kg, self._loop)
202
+
203
+ def list_knowledge_graphs(self) -> list[str]:
204
+ return self._loop.run_until_complete(self._client.list_knowledge_graphs())
205
+
206
+ def drop_knowledge_graph(self, name: str) -> None:
207
+ self._loop.run_until_complete(self._client.drop_knowledge_graph(name))
208
+
209
+ def create_user(self, username: str, password: str, role: str = "viewer") -> None:
210
+ self._loop.run_until_complete(self._client.create_user(username, password, role))
211
+
212
+ def drop_user(self, username: str) -> None:
213
+ self._loop.run_until_complete(self._client.drop_user(username))
214
+
215
+ def set_password(self, username: str, new_password: str) -> None:
216
+ self._loop.run_until_complete(self._client.set_password(username, new_password))
217
+
218
+ def set_role(self, username: str, role: str) -> None:
219
+ self._loop.run_until_complete(self._client.set_role(username, role))
220
+
221
+ def list_users(self) -> list[UserInfo]:
222
+ return self._loop.run_until_complete(self._client.list_users())
223
+
224
+ def create_api_key(self, label: str) -> str:
225
+ return self._loop.run_until_complete(self._client.create_api_key(label))
226
+
227
+ def list_api_keys(self) -> list[ApiKeyInfo]:
228
+ return self._loop.run_until_complete(self._client.list_api_keys())
229
+
230
+ def revoke_api_key(self, label: str) -> None:
231
+ self._loop.run_until_complete(self._client.revoke_api_key(label))