kurrentdbclient 1.2b1__tar.gz → 1.2.2__tar.gz
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.
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/PKG-INFO +2 -2
- kurrentdbclient-1.2.2/kurrentdbclient/.DS_Store +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/__init__.py +1 -1
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/asyncio_client.py +59 -41
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/client.py +2 -1
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/common.py +6 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/exceptions.py +6 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/__init__.py +15 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/spanners.py +112 -2
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/utils.py +3 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/pyproject.toml +4 -3
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/LICENSE +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/README.md +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/connection.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/connection_spec.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/events.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/gossip.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/__init__.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/attributes.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/package.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/instrumentation/opentelemetry/version.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/persistent.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/projections.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/errors_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/errors_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/errors_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/cluster_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/cluster_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/cluster_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/gossip_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/gossip_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/gossip_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/persistent_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/persistent_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/persistent_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/shared_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/shared_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/shared_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/status_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/status_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/status_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/streams_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/streams_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/streams_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/streams_pb2.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/streams_pb2.pyi +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/streams_pb2_grpc.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/py.typed +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/streams.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/unpack_error_status.py +0 -0
- {kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/v2streams.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kurrentdbclient
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Python gRPC Client for KurrentDB
|
|
5
5
|
License: BSD-3-Clause
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Author: John Bywater
|
|
8
8
|
Author-email: john.bywater@appropriatesoftware.net
|
|
9
9
|
Requires-Python: >=3.10
|
|
10
|
-
Classifier: Development Status ::
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: License :: OSI Approved :: BSD License
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
Binary file
|
|
@@ -52,6 +52,7 @@ from kurrentdbclient.exceptions import (
|
|
|
52
52
|
GrpcError,
|
|
53
53
|
NodeIsNotLeaderError,
|
|
54
54
|
NotFoundError,
|
|
55
|
+
ProgrammingError,
|
|
55
56
|
ServiceUnavailableError,
|
|
56
57
|
)
|
|
57
58
|
|
|
@@ -70,6 +71,7 @@ def autoreconnect(f: _TCallable) -> _TCallable:
|
|
|
70
71
|
async def autoreconnect_decorator(
|
|
71
72
|
client: AsyncKurrentDBClient, *args: Any, **kwargs: Any
|
|
72
73
|
) -> Any:
|
|
74
|
+
await client.connect()
|
|
73
75
|
try:
|
|
74
76
|
return await f(client, *args, **kwargs)
|
|
75
77
|
|
|
@@ -129,22 +131,36 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
129
131
|
private_key=private_key,
|
|
130
132
|
certificate_chain=certificate_chain,
|
|
131
133
|
)
|
|
134
|
+
self._connection: AsyncKurrentDBConnection | None = None
|
|
132
135
|
self._is_reconnection_required = Event()
|
|
133
|
-
self.
|
|
136
|
+
self._connection_lock = Lock()
|
|
137
|
+
|
|
138
|
+
async def connect(self) -> None:
|
|
139
|
+
if self._connection is None:
|
|
140
|
+
async with self._connection_lock:
|
|
141
|
+
if self._connection is None:
|
|
142
|
+
self._connection = await self._connect()
|
|
143
|
+
else: # for coverage with Python <= 3.11
|
|
144
|
+
pass
|
|
134
145
|
|
|
135
146
|
@property
|
|
136
|
-
def
|
|
137
|
-
|
|
147
|
+
def connection(self) -> AsyncKurrentDBConnection:
|
|
148
|
+
connection = self._connection
|
|
149
|
+
if connection is None:
|
|
150
|
+
msg = "Connection was never established"
|
|
151
|
+
raise ProgrammingError(msg)
|
|
152
|
+
return connection
|
|
138
153
|
|
|
139
|
-
|
|
140
|
-
|
|
154
|
+
@property
|
|
155
|
+
def connection_target(self) -> str:
|
|
156
|
+
return self.connection.grpc_target
|
|
141
157
|
|
|
142
158
|
async def reconnect(self, grpc_target: str | None = None) -> None:
|
|
143
159
|
self._is_reconnection_required.set()
|
|
144
|
-
async with self.
|
|
160
|
+
async with self._connection_lock:
|
|
145
161
|
if self._is_reconnection_required.is_set():
|
|
146
162
|
new = await self._connect(grpc_target)
|
|
147
|
-
old, self._connection = self.
|
|
163
|
+
old, self._connection = self.connection, new
|
|
148
164
|
await old.close()
|
|
149
165
|
self._is_reconnection_required.clear()
|
|
150
166
|
else: # pragma: no cover
|
|
@@ -283,7 +299,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
283
299
|
if isinstance(events, NewEvent):
|
|
284
300
|
events = [events]
|
|
285
301
|
|
|
286
|
-
return await self.
|
|
302
|
+
return await self.connection.streams.batch_append(
|
|
287
303
|
stream_name=stream_name,
|
|
288
304
|
current_version=current_version,
|
|
289
305
|
events=events,
|
|
@@ -308,7 +324,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
308
324
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
309
325
|
if isinstance(events, NewEvents):
|
|
310
326
|
events = [events]
|
|
311
|
-
return await self.
|
|
327
|
+
return await self.connection.v2streams.multi_append(
|
|
312
328
|
events=events,
|
|
313
329
|
timeout=timeout,
|
|
314
330
|
metadata=self._call_metadata,
|
|
@@ -334,7 +350,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
334
350
|
"""
|
|
335
351
|
Reads recorded events in "all streams" in the database.
|
|
336
352
|
"""
|
|
337
|
-
return await self.
|
|
353
|
+
return await self.connection.streams.read(
|
|
338
354
|
commit_position=commit_position,
|
|
339
355
|
backwards=backwards,
|
|
340
356
|
resolve_links=resolve_links,
|
|
@@ -442,7 +458,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
442
458
|
"""
|
|
443
459
|
Reads recorded events from the named stream.
|
|
444
460
|
"""
|
|
445
|
-
return await self.
|
|
461
|
+
return await self.connection.streams.read(
|
|
446
462
|
stream_name=stream_name,
|
|
447
463
|
stream_position=stream_position,
|
|
448
464
|
backwards=backwards,
|
|
@@ -531,7 +547,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
531
547
|
Starts a catch-up subscription, from which all
|
|
532
548
|
recorded events in the database can be received.
|
|
533
549
|
"""
|
|
534
|
-
return await self.
|
|
550
|
+
return await self.connection.streams.read(
|
|
535
551
|
commit_position=commit_position,
|
|
536
552
|
from_end=from_end,
|
|
537
553
|
resolve_links=resolve_links,
|
|
@@ -637,7 +653,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
637
653
|
Starts a catch-up subscription from which
|
|
638
654
|
recorded events in a stream can be received.
|
|
639
655
|
"""
|
|
640
|
-
return await self.
|
|
656
|
+
return await self.connection.streams.read(
|
|
641
657
|
stream_name=stream_name,
|
|
642
658
|
stream_position=stream_position,
|
|
643
659
|
from_end=from_end,
|
|
@@ -662,7 +678,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
662
678
|
) -> None:
|
|
663
679
|
# Todo: Reconsider using current_version=None to indicate "stream exists"?
|
|
664
680
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
665
|
-
await self.
|
|
681
|
+
await self.connection.streams.delete(
|
|
666
682
|
stream_name=stream_name,
|
|
667
683
|
current_version=current_version,
|
|
668
684
|
timeout=timeout,
|
|
@@ -681,7 +697,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
681
697
|
credentials: grpc.CallCredentials | None = None,
|
|
682
698
|
) -> None:
|
|
683
699
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
684
|
-
await self.
|
|
700
|
+
await self.connection.streams.tombstone(
|
|
685
701
|
stream_name=stream_name,
|
|
686
702
|
current_version=current_version,
|
|
687
703
|
timeout=timeout,
|
|
@@ -699,12 +715,13 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
699
715
|
credentials: grpc.CallCredentials | None = None,
|
|
700
716
|
) -> int | Literal[StreamState.NO_STREAM]:
|
|
701
717
|
"""
|
|
702
|
-
Returns the current position of the end of a stream
|
|
718
|
+
Returns the current position of the end of a stream,
|
|
719
|
+
or StreamState.NO_STREAM if the stream is not found.
|
|
703
720
|
"""
|
|
704
721
|
try:
|
|
705
722
|
events = [
|
|
706
723
|
e
|
|
707
|
-
async for e in await self.
|
|
724
|
+
async for e in await self.connection.streams.read(
|
|
708
725
|
stream_name=stream_name,
|
|
709
726
|
backwards=True,
|
|
710
727
|
limit=1,
|
|
@@ -841,7 +858,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
841
858
|
"""
|
|
842
859
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
843
860
|
|
|
844
|
-
await self.
|
|
861
|
+
await self.connection.persistent_subscriptions.create(
|
|
845
862
|
group_name=group_name,
|
|
846
863
|
from_end=from_end,
|
|
847
864
|
commit_position=commit_position,
|
|
@@ -973,7 +990,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
973
990
|
"""
|
|
974
991
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
975
992
|
|
|
976
|
-
await self.
|
|
993
|
+
await self.connection.persistent_subscriptions.create(
|
|
977
994
|
group_name=group_name,
|
|
978
995
|
stream_name=stream_name,
|
|
979
996
|
from_end=from_end,
|
|
@@ -1011,7 +1028,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1011
1028
|
"""
|
|
1012
1029
|
Reads a persistent subscription on all streams.
|
|
1013
1030
|
"""
|
|
1014
|
-
return await self.
|
|
1031
|
+
return await self.connection.persistent_subscriptions.read(
|
|
1015
1032
|
group_name=group_name,
|
|
1016
1033
|
event_buffer_size=event_buffer_size,
|
|
1017
1034
|
max_ack_batch_size=max_ack_batch_size,
|
|
@@ -1039,7 +1056,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1039
1056
|
"""
|
|
1040
1057
|
Reads a persistent subscription on one stream.
|
|
1041
1058
|
"""
|
|
1042
|
-
return await self.
|
|
1059
|
+
return await self.connection.persistent_subscriptions.read(
|
|
1043
1060
|
group_name=group_name,
|
|
1044
1061
|
stream_name=stream_name,
|
|
1045
1062
|
event_buffer_size=event_buffer_size,
|
|
@@ -1064,7 +1081,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1064
1081
|
"""
|
|
1065
1082
|
Gets info for a persistent subscription.
|
|
1066
1083
|
"""
|
|
1067
|
-
return await self.
|
|
1084
|
+
return await self.connection.persistent_subscriptions.get_info(
|
|
1068
1085
|
group_name=group_name,
|
|
1069
1086
|
stream_name=stream_name,
|
|
1070
1087
|
timeout=timeout,
|
|
@@ -1083,7 +1100,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1083
1100
|
"""
|
|
1084
1101
|
Lists all persistent subscriptions.
|
|
1085
1102
|
"""
|
|
1086
|
-
return await self.
|
|
1103
|
+
return await self.connection.persistent_subscriptions.list(
|
|
1087
1104
|
timeout=timeout,
|
|
1088
1105
|
metadata=self._call_metadata,
|
|
1089
1106
|
credentials=credentials or self._call_credentials,
|
|
@@ -1101,7 +1118,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1101
1118
|
"""
|
|
1102
1119
|
Lists persistent stream subscriptions.
|
|
1103
1120
|
"""
|
|
1104
|
-
return await self.
|
|
1121
|
+
return await self.connection.persistent_subscriptions.list(
|
|
1105
1122
|
stream_name=stream_name,
|
|
1106
1123
|
timeout=timeout,
|
|
1107
1124
|
metadata=self._call_metadata,
|
|
@@ -1262,7 +1279,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1262
1279
|
extra_statistics=extra_statistics,
|
|
1263
1280
|
)
|
|
1264
1281
|
|
|
1265
|
-
await self.
|
|
1282
|
+
await self.connection.persistent_subscriptions.update(
|
|
1266
1283
|
group_name=group_name,
|
|
1267
1284
|
stream_name=stream_name,
|
|
1268
1285
|
**kwargs,
|
|
@@ -1417,7 +1434,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1417
1434
|
extra_statistics=extra_statistics,
|
|
1418
1435
|
)
|
|
1419
1436
|
|
|
1420
|
-
await self.
|
|
1437
|
+
await self.connection.persistent_subscriptions.update(
|
|
1421
1438
|
group_name=group_name,
|
|
1422
1439
|
**kwargs,
|
|
1423
1440
|
timeout=timeout if timeout is not None else self._default_deadline,
|
|
@@ -1437,7 +1454,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1437
1454
|
) -> None:
|
|
1438
1455
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1439
1456
|
|
|
1440
|
-
await self.
|
|
1457
|
+
await self.connection.persistent_subscriptions.replay_parked(
|
|
1441
1458
|
group_name=group_name,
|
|
1442
1459
|
stream_name=stream_name,
|
|
1443
1460
|
timeout=timeout,
|
|
@@ -1460,7 +1477,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1460
1477
|
"""
|
|
1461
1478
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1462
1479
|
|
|
1463
|
-
await self.
|
|
1480
|
+
await self.connection.persistent_subscriptions.delete(
|
|
1464
1481
|
group_name=group_name,
|
|
1465
1482
|
stream_name=stream_name,
|
|
1466
1483
|
timeout=timeout,
|
|
@@ -1485,7 +1502,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1485
1502
|
"""
|
|
1486
1503
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1487
1504
|
|
|
1488
|
-
await self.
|
|
1505
|
+
await self.connection.projections.create(
|
|
1489
1506
|
query=query,
|
|
1490
1507
|
name=name,
|
|
1491
1508
|
emit_enabled=emit_enabled,
|
|
@@ -1511,7 +1528,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1511
1528
|
"""
|
|
1512
1529
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1513
1530
|
|
|
1514
|
-
await self.
|
|
1531
|
+
await self.connection.projections.update(
|
|
1515
1532
|
name=name,
|
|
1516
1533
|
query=query,
|
|
1517
1534
|
emit_enabled=emit_enabled,
|
|
@@ -1537,7 +1554,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1537
1554
|
"""
|
|
1538
1555
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1539
1556
|
|
|
1540
|
-
await self.
|
|
1557
|
+
await self.connection.projections.delete(
|
|
1541
1558
|
name=name,
|
|
1542
1559
|
delete_emitted_streams=delete_emitted_streams,
|
|
1543
1560
|
delete_state_stream=delete_state_stream,
|
|
@@ -1561,7 +1578,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1561
1578
|
"""
|
|
1562
1579
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1563
1580
|
|
|
1564
|
-
return await self.
|
|
1581
|
+
return await self.connection.projections.get_statistics(
|
|
1565
1582
|
name=name,
|
|
1566
1583
|
timeout=timeout,
|
|
1567
1584
|
metadata=self._call_metadata,
|
|
@@ -1581,7 +1598,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1581
1598
|
"""
|
|
1582
1599
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1583
1600
|
|
|
1584
|
-
return await self.
|
|
1601
|
+
return await self.connection.projections.list_statistics(
|
|
1585
1602
|
timeout=timeout,
|
|
1586
1603
|
metadata=self._call_metadata,
|
|
1587
1604
|
credentials=credentials or self._call_credentials,
|
|
@@ -1600,7 +1617,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1600
1617
|
"""
|
|
1601
1618
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1602
1619
|
|
|
1603
|
-
return await self.
|
|
1620
|
+
return await self.connection.projections.list_statistics(
|
|
1604
1621
|
all=True,
|
|
1605
1622
|
timeout=timeout,
|
|
1606
1623
|
metadata=self._call_metadata,
|
|
@@ -1621,7 +1638,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1621
1638
|
"""
|
|
1622
1639
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1623
1640
|
|
|
1624
|
-
await self.
|
|
1641
|
+
await self.connection.projections.disable(
|
|
1625
1642
|
name=name,
|
|
1626
1643
|
write_checkpoint=True,
|
|
1627
1644
|
timeout=timeout,
|
|
@@ -1643,7 +1660,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1643
1660
|
"""
|
|
1644
1661
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1645
1662
|
|
|
1646
|
-
await self.
|
|
1663
|
+
await self.connection.projections.disable(
|
|
1647
1664
|
name=name,
|
|
1648
1665
|
write_checkpoint=False,
|
|
1649
1666
|
timeout=timeout,
|
|
@@ -1665,7 +1682,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1665
1682
|
"""
|
|
1666
1683
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1667
1684
|
|
|
1668
|
-
await self.
|
|
1685
|
+
await self.connection.projections.enable(
|
|
1669
1686
|
name=name,
|
|
1670
1687
|
timeout=timeout,
|
|
1671
1688
|
metadata=self._call_metadata,
|
|
@@ -1686,7 +1703,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1686
1703
|
"""
|
|
1687
1704
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1688
1705
|
|
|
1689
|
-
await self.
|
|
1706
|
+
await self.connection.projections.reset(
|
|
1690
1707
|
name=name,
|
|
1691
1708
|
write_checkpoint=True,
|
|
1692
1709
|
timeout=timeout,
|
|
@@ -1709,7 +1726,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1709
1726
|
"""
|
|
1710
1727
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1711
1728
|
|
|
1712
|
-
return await self.
|
|
1729
|
+
return await self.connection.projections.get_state(
|
|
1713
1730
|
name=name,
|
|
1714
1731
|
partition=partition,
|
|
1715
1732
|
timeout=timeout,
|
|
@@ -1752,7 +1769,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1752
1769
|
"""
|
|
1753
1770
|
timeout = timeout if timeout is not None else self._default_deadline
|
|
1754
1771
|
|
|
1755
|
-
return await self.
|
|
1772
|
+
return await self.connection.projections.restart_subsystem(
|
|
1756
1773
|
timeout=timeout,
|
|
1757
1774
|
metadata=self._call_metadata,
|
|
1758
1775
|
credentials=credentials or self._call_credentials,
|
|
@@ -1761,7 +1778,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1761
1778
|
async def close(self) -> None:
|
|
1762
1779
|
if not self._is_closed:
|
|
1763
1780
|
try:
|
|
1764
|
-
esdb_connection = self.
|
|
1781
|
+
esdb_connection = self.connection
|
|
1765
1782
|
del self._connection
|
|
1766
1783
|
except AttributeError: # pragma: no cover
|
|
1767
1784
|
pass
|
|
@@ -1770,6 +1787,7 @@ class AsyncKurrentDBClient(BaseKurrentDBClient):
|
|
|
1770
1787
|
self._is_closed = True
|
|
1771
1788
|
|
|
1772
1789
|
async def __aenter__(self) -> Self:
|
|
1790
|
+
await self.connect()
|
|
1773
1791
|
return self
|
|
1774
1792
|
|
|
1775
1793
|
async def __aexit__(self, *args: object, **kwargs: Any) -> None:
|
|
@@ -733,7 +733,8 @@ class KurrentDBClient(BaseKurrentDBClient):
|
|
|
733
733
|
credentials: grpc.CallCredentials | None = None,
|
|
734
734
|
) -> int | Literal[StreamState.NO_STREAM]:
|
|
735
735
|
"""
|
|
736
|
-
Returns the current position of the end of a stream
|
|
736
|
+
Returns the current position of the end of a stream,
|
|
737
|
+
or StreamState.NO_STREAM if the stream is not found.
|
|
737
738
|
"""
|
|
738
739
|
try:
|
|
739
740
|
last_event = next(
|
|
@@ -37,6 +37,7 @@ from kurrentdbclient.exceptions import (
|
|
|
37
37
|
GrpcDeadlineExceededError,
|
|
38
38
|
GrpcError,
|
|
39
39
|
InternalError,
|
|
40
|
+
InvalidCommitPositionError,
|
|
40
41
|
KurrentDBClientError,
|
|
41
42
|
MaximumSubscriptionsReachedError,
|
|
42
43
|
MultiAppendToSameStreamError,
|
|
@@ -319,6 +320,11 @@ def handle_rpc_error(e: grpc.RpcError) -> KurrentDBClientError: # noqa: PLR0911
|
|
|
319
320
|
):
|
|
320
321
|
# Projections.Delete does this....
|
|
321
322
|
return OperationFailedError(details_str)
|
|
323
|
+
# no cover <25.1: start
|
|
324
|
+
if "Unexpected FilteredReadAllResult: InvalidPosition" in details_str:
|
|
325
|
+
# Commit position does not exist.
|
|
326
|
+
return InvalidCommitPositionError(details_str)
|
|
327
|
+
# no cover <25.1: stop
|
|
322
328
|
return UnknownError(details_str) # pragma: no cover
|
|
323
329
|
|
|
324
330
|
if e.code() == grpc.StatusCode.ABORTED:
|
|
@@ -20,6 +20,7 @@ from kurrentdbclient.instrumentation.opentelemetry.spanners import (
|
|
|
20
20
|
span_append_to_stream,
|
|
21
21
|
span_catchup_subscription,
|
|
22
22
|
span_get_stream,
|
|
23
|
+
span_multi_append_to_stream,
|
|
23
24
|
span_persistent_subscription,
|
|
24
25
|
span_read_stream,
|
|
25
26
|
)
|
|
@@ -68,6 +69,12 @@ class KurrentDBClientInstrumentor(_BaseInstrumentor):
|
|
|
68
69
|
spanner_func=span_append_to_stream,
|
|
69
70
|
tracer=tracer,
|
|
70
71
|
)
|
|
72
|
+
apply_spanner(
|
|
73
|
+
patched_class=KurrentDBClient,
|
|
74
|
+
spanned_func=KurrentDBClient.multi_append_to_stream,
|
|
75
|
+
spanner_func=span_multi_append_to_stream,
|
|
76
|
+
tracer=tracer,
|
|
77
|
+
)
|
|
71
78
|
apply_spanner(
|
|
72
79
|
patched_class=KurrentDBClient,
|
|
73
80
|
spanned_func=KurrentDBClient.subscribe_to_stream,
|
|
@@ -112,6 +119,7 @@ class KurrentDBClientInstrumentor(_BaseInstrumentor):
|
|
|
112
119
|
|
|
113
120
|
def _uninstrument(self, **kwargs: Any) -> None:
|
|
114
121
|
unwrap(KurrentDBClient, "append_to_stream")
|
|
122
|
+
unwrap(KurrentDBClient, "multi_append_to_stream")
|
|
115
123
|
unwrap(KurrentDBClient, "subscribe_to_stream")
|
|
116
124
|
unwrap(KurrentDBClient, "subscribe_to_all")
|
|
117
125
|
unwrap(KurrentDBClient, "read_subscription_to_stream")
|
|
@@ -136,6 +144,12 @@ class AsyncKurrentDBClientInstrumentor(_BaseInstrumentor):
|
|
|
136
144
|
spanner_func=span_append_to_stream,
|
|
137
145
|
tracer=tracer,
|
|
138
146
|
)
|
|
147
|
+
apply_spanner(
|
|
148
|
+
patched_class=AsyncKurrentDBClient,
|
|
149
|
+
spanned_func=AsyncKurrentDBClient.multi_append_to_stream,
|
|
150
|
+
spanner_func=span_multi_append_to_stream,
|
|
151
|
+
tracer=tracer,
|
|
152
|
+
)
|
|
139
153
|
apply_spanner(
|
|
140
154
|
patched_class=AsyncKurrentDBClient,
|
|
141
155
|
spanned_func=AsyncKurrentDBClient.subscribe_to_stream,
|
|
@@ -176,6 +190,7 @@ class AsyncKurrentDBClientInstrumentor(_BaseInstrumentor):
|
|
|
176
190
|
|
|
177
191
|
def _uninstrument(self, **kwargs: Any) -> None:
|
|
178
192
|
unwrap(AsyncKurrentDBClient, "append_to_stream")
|
|
193
|
+
unwrap(AsyncKurrentDBClient, "multi_append_to_stream")
|
|
179
194
|
unwrap(AsyncKurrentDBClient, "subscribe_to_stream")
|
|
180
195
|
unwrap(AsyncKurrentDBClient, "subscribe_to_all")
|
|
181
196
|
unwrap(AsyncKurrentDBClient, "read_subscription_to_stream")
|
|
@@ -32,6 +32,7 @@ from kurrentdbclient import (
|
|
|
32
32
|
AsyncReadResponse,
|
|
33
33
|
KurrentDBClient,
|
|
34
34
|
NewEvent,
|
|
35
|
+
NewEvents,
|
|
35
36
|
ReadResponse,
|
|
36
37
|
RecordedEvent,
|
|
37
38
|
StreamState,
|
|
@@ -70,14 +71,17 @@ if TYPE_CHECKING:
|
|
|
70
71
|
|
|
71
72
|
|
|
72
73
|
STREAMS_APPEND = "streams.append"
|
|
74
|
+
STREAMS_MULTI_APPEND = "streams.multi-append"
|
|
73
75
|
STREAMS_SUBSCRIBE = "streams.subscribe"
|
|
74
76
|
SPAN_NAMES_BY_CLIENT_METHOD = {
|
|
75
77
|
KurrentDBClient.append_to_stream.__qualname__: STREAMS_APPEND,
|
|
78
|
+
KurrentDBClient.multi_append_to_stream.__qualname__: STREAMS_MULTI_APPEND,
|
|
76
79
|
KurrentDBClient.subscribe_to_all.__qualname__: STREAMS_SUBSCRIBE,
|
|
77
80
|
KurrentDBClient.subscribe_to_stream.__qualname__: STREAMS_SUBSCRIBE,
|
|
78
81
|
KurrentDBClient.read_subscription_to_all.__qualname__: STREAMS_SUBSCRIBE,
|
|
79
82
|
KurrentDBClient.read_subscription_to_stream.__qualname__: STREAMS_SUBSCRIBE,
|
|
80
83
|
AsyncKurrentDBClient.append_to_stream.__qualname__: STREAMS_APPEND,
|
|
84
|
+
AsyncKurrentDBClient.multi_append_to_stream.__qualname__: STREAMS_MULTI_APPEND,
|
|
81
85
|
AsyncKurrentDBClient.subscribe_to_all.__qualname__: STREAMS_SUBSCRIBE,
|
|
82
86
|
AsyncKurrentDBClient.subscribe_to_stream.__qualname__: STREAMS_SUBSCRIBE,
|
|
83
87
|
AsyncKurrentDBClient.read_subscription_to_all.__qualname__: STREAMS_SUBSCRIBE,
|
|
@@ -85,11 +89,13 @@ SPAN_NAMES_BY_CLIENT_METHOD = {
|
|
|
85
89
|
}
|
|
86
90
|
SPAN_KINDS_BY_CLIENT_METHOD = {
|
|
87
91
|
KurrentDBClient.append_to_stream.__qualname__: SpanKind.PRODUCER,
|
|
92
|
+
KurrentDBClient.multi_append_to_stream.__qualname__: SpanKind.PRODUCER,
|
|
88
93
|
KurrentDBClient.subscribe_to_all.__qualname__: SpanKind.CONSUMER,
|
|
89
94
|
KurrentDBClient.subscribe_to_stream.__qualname__: SpanKind.CONSUMER,
|
|
90
95
|
KurrentDBClient.read_subscription_to_all.__qualname__: SpanKind.CONSUMER,
|
|
91
96
|
KurrentDBClient.read_subscription_to_stream.__qualname__: SpanKind.CONSUMER,
|
|
92
97
|
AsyncKurrentDBClient.append_to_stream.__qualname__: SpanKind.PRODUCER,
|
|
98
|
+
AsyncKurrentDBClient.multi_append_to_stream.__qualname__: SpanKind.PRODUCER,
|
|
93
99
|
AsyncKurrentDBClient.subscribe_to_all.__qualname__: SpanKind.CONSUMER,
|
|
94
100
|
AsyncKurrentDBClient.subscribe_to_stream.__qualname__: SpanKind.CONSUMER,
|
|
95
101
|
AsyncKurrentDBClient.read_subscription_to_all.__qualname__: SpanKind.CONSUMER,
|
|
@@ -346,6 +352,30 @@ class AsyncAppendToStreamMethod(Protocol):
|
|
|
346
352
|
pass # pragma: no cover
|
|
347
353
|
|
|
348
354
|
|
|
355
|
+
class MultiAppendToStreamMethod(Protocol):
|
|
356
|
+
def __call__(
|
|
357
|
+
self,
|
|
358
|
+
/,
|
|
359
|
+
events: NewEvents | Iterable[NewEvents],
|
|
360
|
+
*,
|
|
361
|
+
timeout: float | None = None,
|
|
362
|
+
credentials: grpc.CallCredentials | None = None,
|
|
363
|
+
) -> int:
|
|
364
|
+
pass # pragma: no cover
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class AsyncMultiAppendToStreamMethod(Protocol):
|
|
368
|
+
async def __call__(
|
|
369
|
+
self,
|
|
370
|
+
/,
|
|
371
|
+
events: NewEvents | Iterable[NewEvents],
|
|
372
|
+
*,
|
|
373
|
+
timeout: float | None = None,
|
|
374
|
+
credentials: grpc.CallCredentials | None = None,
|
|
375
|
+
) -> int:
|
|
376
|
+
pass # pragma: no cover
|
|
377
|
+
|
|
378
|
+
|
|
349
379
|
@overload
|
|
350
380
|
def span_append_to_stream(
|
|
351
381
|
tracer: Tracer,
|
|
@@ -401,7 +431,7 @@ def span_append_to_stream(
|
|
|
401
431
|
db_operation_name=span_name,
|
|
402
432
|
stream_name=stream_name,
|
|
403
433
|
)
|
|
404
|
-
events =
|
|
434
|
+
events = _set_context_in_new_event_objects(span.get_span_context(), events)
|
|
405
435
|
yield spanned_func(
|
|
406
436
|
stream_name,
|
|
407
437
|
current_version=current_version,
|
|
@@ -416,6 +446,67 @@ def span_append_to_stream(
|
|
|
416
446
|
_set_span_ok(span)
|
|
417
447
|
|
|
418
448
|
|
|
449
|
+
@overload
|
|
450
|
+
def span_multi_append_to_stream(
|
|
451
|
+
tracer: Tracer,
|
|
452
|
+
instance: BaseKurrentDBClient,
|
|
453
|
+
spanned_func: AsyncMultiAppendToStreamMethod,
|
|
454
|
+
/,
|
|
455
|
+
events: NewEvents | Iterable[NewEvents],
|
|
456
|
+
*,
|
|
457
|
+
timeout: float | None = None,
|
|
458
|
+
credentials: grpc.CallCredentials | None = None,
|
|
459
|
+
) -> AsyncSpannerResponse[int]:
|
|
460
|
+
pass # pragma: no cover
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
@overload
|
|
464
|
+
def span_multi_append_to_stream(
|
|
465
|
+
tracer: Tracer,
|
|
466
|
+
instance: BaseKurrentDBClient,
|
|
467
|
+
spanned_func: MultiAppendToStreamMethod,
|
|
468
|
+
/,
|
|
469
|
+
events: NewEvents | Iterable[NewEvents],
|
|
470
|
+
*,
|
|
471
|
+
timeout: float | None = None,
|
|
472
|
+
credentials: grpc.CallCredentials | None = None,
|
|
473
|
+
) -> SpannerResponse[int]:
|
|
474
|
+
pass # pragma: no cover
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def span_multi_append_to_stream(
|
|
478
|
+
tracer: Tracer,
|
|
479
|
+
instance: BaseKurrentDBClient,
|
|
480
|
+
spanned_func: MultiAppendToStreamMethod | AsyncMultiAppendToStreamMethod,
|
|
481
|
+
/,
|
|
482
|
+
events: NewEvents | Iterable[NewEvents],
|
|
483
|
+
*,
|
|
484
|
+
timeout: float | None = None,
|
|
485
|
+
credentials: grpc.CallCredentials | None = None,
|
|
486
|
+
) -> OverloadedSpannerResponse[int, int]: # pragma: <25.1 no cover
|
|
487
|
+
|
|
488
|
+
span_name, span_kind = _get_span_name_and_kind(spanned_func)
|
|
489
|
+
|
|
490
|
+
with _start_span(tracer, span_name, span_kind) as span:
|
|
491
|
+
try:
|
|
492
|
+
_enrich_span(
|
|
493
|
+
span=span,
|
|
494
|
+
client=instance,
|
|
495
|
+
db_operation_name=span_name,
|
|
496
|
+
)
|
|
497
|
+
events = _set_context_in_new_events_objects(span.get_span_context(), events)
|
|
498
|
+
yield spanned_func(
|
|
499
|
+
events=events,
|
|
500
|
+
timeout=timeout,
|
|
501
|
+
credentials=credentials,
|
|
502
|
+
)
|
|
503
|
+
except Exception as e:
|
|
504
|
+
_set_span_error(span, e)
|
|
505
|
+
raise
|
|
506
|
+
else:
|
|
507
|
+
_set_span_ok(span)
|
|
508
|
+
|
|
509
|
+
|
|
419
510
|
class CatchupSubscriptionMethod(Protocol):
|
|
420
511
|
def __call__(
|
|
421
512
|
self,
|
|
@@ -1035,7 +1126,7 @@ METADATA_TRACE_ID = "$traceId"
|
|
|
1035
1126
|
METADATA_SPAN_ID = "$spanId"
|
|
1036
1127
|
|
|
1037
1128
|
|
|
1038
|
-
def
|
|
1129
|
+
def _set_context_in_new_event_objects(
|
|
1039
1130
|
context: SpanContext, events: NewEvent | Iterable[NewEvent]
|
|
1040
1131
|
) -> Sequence[NewEvent]:
|
|
1041
1132
|
# Kind of propagate OpenTelemetry context in "standard KurrentDB" style.
|
|
@@ -1063,6 +1154,25 @@ def _set_context_in_events(
|
|
|
1063
1154
|
return reconstructed_events
|
|
1064
1155
|
|
|
1065
1156
|
|
|
1157
|
+
def _set_context_in_new_events_objects(
|
|
1158
|
+
context: SpanContext, events: NewEvents | Iterable[NewEvents]
|
|
1159
|
+
) -> Sequence[NewEvents]: # pragma: <25.1 no cover
|
|
1160
|
+
# Kind of propagate OpenTelemetry context in "standard KurrentDB" style.
|
|
1161
|
+
if isinstance(events, NewEvents):
|
|
1162
|
+
events = [events]
|
|
1163
|
+
return [
|
|
1164
|
+
NewEvents(
|
|
1165
|
+
new_events_obj.stream_name,
|
|
1166
|
+
_set_context_in_new_event_objects(
|
|
1167
|
+
context,
|
|
1168
|
+
new_events_obj.events,
|
|
1169
|
+
),
|
|
1170
|
+
current_version=new_events_obj.current_version,
|
|
1171
|
+
)
|
|
1172
|
+
for new_events_obj in events
|
|
1173
|
+
]
|
|
1174
|
+
|
|
1175
|
+
|
|
1066
1176
|
def _extract_context_from_event(
|
|
1067
1177
|
recorded_event: NewEvent | RecordedEvent,
|
|
1068
1178
|
) -> Context | None:
|
|
@@ -18,6 +18,7 @@ import wrapt
|
|
|
18
18
|
from opentelemetry.trace import Span, SpanKind, Status, StatusCode, Tracer
|
|
19
19
|
from typing_extensions import ParamSpec
|
|
20
20
|
|
|
21
|
+
from kurrentdbclient import AsyncKurrentDBClient
|
|
21
22
|
from kurrentdbclient.instrumentation.opentelemetry.attributes import Attributes
|
|
22
23
|
|
|
23
24
|
if TYPE_CHECKING:
|
|
@@ -76,6 +77,8 @@ def apply_spanner(
|
|
|
76
77
|
args: Any,
|
|
77
78
|
kwargs: Any,
|
|
78
79
|
) -> R:
|
|
80
|
+
if isinstance(instance, AsyncKurrentDBClient):
|
|
81
|
+
await instance.connect()
|
|
79
82
|
# Use the spanner function to execute the spanned function.
|
|
80
83
|
with async_spanner(tracer, instance, original, *args, **kwargs) as result:
|
|
81
84
|
return await result
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "kurrentdbclient"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.2.2"
|
|
8
8
|
description = "Python gRPC Client for KurrentDB"
|
|
9
9
|
license = { text = "BSD-3-Clause" }
|
|
10
10
|
readme = "README.md"
|
|
@@ -14,8 +14,8 @@ authors = [
|
|
|
14
14
|
]
|
|
15
15
|
classifiers = [
|
|
16
16
|
# "Development Status :: 3 - Alpha",
|
|
17
|
-
"Development Status :: 4 - Beta",
|
|
18
|
-
|
|
17
|
+
# "Development Status :: 4 - Beta",
|
|
18
|
+
"Development Status :: 5 - Production/Stable",
|
|
19
19
|
"License :: OSI Approved :: BSD License",
|
|
20
20
|
"Programming Language :: Python :: 3",
|
|
21
21
|
"Programming Language :: Python :: 3.10",
|
|
@@ -80,6 +80,7 @@ exclude = '''
|
|
|
80
80
|
| build
|
|
81
81
|
| dist
|
|
82
82
|
| kurrentdbclient/protos
|
|
83
|
+
| docs/node_modules
|
|
83
84
|
)/
|
|
84
85
|
'''
|
|
85
86
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2.pyi
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/google/rpc/code_pb2_grpc.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/errors_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/errors_pb2.pyi
RENAMED
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2.pyi
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/kurrent/rpc/rpc_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/cluster_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/gossip_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/persistent_pb2.pyi
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/persistent_pb2_grpc.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2.pyi
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/projections_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/shared_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/status_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v1/streams_pb2_grpc.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2.pyi
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/errors_pb2_grpc.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/streams_pb2.py
RENAMED
|
File without changes
|
{kurrentdbclient-1.2b1 → kurrentdbclient-1.2.2}/kurrentdbclient/protos/v2/streams/streams_pb2.pyi
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|