beaver-db 0.19.2__py3-none-any.whl → 0.19.3__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.
Potentially problematic release.
This version of beaver-db might be problematic. Click here for more details.
- beaver/__init__.py +1 -1
- beaver/blobs.py +36 -1
- beaver/collections.py +39 -3
- beaver/dicts.py +36 -3
- beaver/lists.py +37 -3
- beaver/locks.py +20 -7
- beaver/queues.py +38 -3
- {beaver_db-0.19.2.dist-info → beaver_db-0.19.3.dist-info}/METADATA +1 -1
- beaver_db-0.19.3.dist-info/RECORD +19 -0
- beaver_db-0.19.2.dist-info/RECORD +0 -19
- {beaver_db-0.19.2.dist-info → beaver_db-0.19.3.dist-info}/WHEEL +0 -0
- {beaver_db-0.19.2.dist-info → beaver_db-0.19.3.dist-info}/entry_points.txt +0 -0
- {beaver_db-0.19.2.dist-info → beaver_db-0.19.3.dist-info}/licenses/LICENSE +0 -0
beaver/__init__.py
CHANGED
beaver/blobs.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
3
|
from typing import Any, Dict, Iterator, NamedTuple, Optional, Type, TypeVar
|
|
4
|
-
|
|
5
4
|
from .types import JsonSerializable, IDatabase
|
|
5
|
+
from .locks import LockManager
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class Blob[M](NamedTuple):
|
|
@@ -16,10 +16,13 @@ class Blob[M](NamedTuple):
|
|
|
16
16
|
class BlobManager[M]:
|
|
17
17
|
"""A wrapper providing a Pythonic interface to a blob store in the database."""
|
|
18
18
|
|
|
19
|
+
# In beaver/blobs.py, inside class BlobManager[M]:
|
|
19
20
|
def __init__(self, name: str, db: IDatabase, model: Type[M] | None = None):
|
|
20
21
|
self._name = name
|
|
21
22
|
self._db = db
|
|
22
23
|
self._model = model
|
|
24
|
+
lock_name = f"__lock__blob__{name}"
|
|
25
|
+
self._lock = LockManager(db, lock_name)
|
|
23
26
|
|
|
24
27
|
def _serialize(self, value: M) -> str | None:
|
|
25
28
|
"""Serializes the given value to a JSON string."""
|
|
@@ -135,3 +138,35 @@ class BlobManager[M]:
|
|
|
135
138
|
|
|
136
139
|
def __repr__(self) -> str:
|
|
137
140
|
return f"BlobManager(name='{self._name}')"
|
|
141
|
+
|
|
142
|
+
def acquire(
|
|
143
|
+
self,
|
|
144
|
+
timeout: Optional[float] = None,
|
|
145
|
+
lock_ttl: Optional[float] = None,
|
|
146
|
+
poll_interval: Optional[float] = None,
|
|
147
|
+
) -> "BlobManager[M]":
|
|
148
|
+
"""
|
|
149
|
+
Acquires an inter-process lock on this blob store, blocking until acquired.
|
|
150
|
+
|
|
151
|
+
Parameters override the default settings of the underlying LockManager.
|
|
152
|
+
"""
|
|
153
|
+
self._lock.acquire(
|
|
154
|
+
timeout=timeout,
|
|
155
|
+
lock_ttl=lock_ttl,
|
|
156
|
+
poll_interval=poll_interval
|
|
157
|
+
)
|
|
158
|
+
return self
|
|
159
|
+
|
|
160
|
+
def release(self):
|
|
161
|
+
"""
|
|
162
|
+
Releases the inter-process lock on this blob store.
|
|
163
|
+
"""
|
|
164
|
+
self._lock.release()
|
|
165
|
+
|
|
166
|
+
def __enter__(self) -> "BlobManager[M]":
|
|
167
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
168
|
+
return self.acquire()
|
|
169
|
+
|
|
170
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
171
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
172
|
+
self.release()
|
beaver/collections.py
CHANGED
|
@@ -3,15 +3,16 @@ import sqlite3
|
|
|
3
3
|
import threading
|
|
4
4
|
import uuid
|
|
5
5
|
from enum import Enum
|
|
6
|
-
from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar
|
|
6
|
+
from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar, Optional
|
|
7
7
|
from .types import Model, stub, IDatabase
|
|
8
|
+
from .locks import LockManager
|
|
8
9
|
|
|
9
10
|
try:
|
|
10
11
|
import numpy as np
|
|
11
12
|
from .vectors import VectorIndex
|
|
12
13
|
except ImportError:
|
|
13
|
-
np = stub("This feature requires to install beaver-db[
|
|
14
|
-
VectorIndex = stub("This feature requires to install beaver-db[
|
|
14
|
+
np = stub("This feature requires to install beaver-db[vector]")()
|
|
15
|
+
VectorIndex = stub("This feature requires to install beaver-db[vector]")
|
|
15
16
|
|
|
16
17
|
# --- Fuzzy Search Helper Functions ---
|
|
17
18
|
|
|
@@ -135,6 +136,9 @@ class CollectionManager[D: Document]:
|
|
|
135
136
|
self._compaction_lock = threading.Lock()
|
|
136
137
|
self._compaction_thread: threading.Thread | None = None
|
|
137
138
|
|
|
139
|
+
lock_name = f"__lock__collection__{name}"
|
|
140
|
+
self._lock = LockManager(db, lock_name)
|
|
141
|
+
|
|
138
142
|
def _flatten_metadata(self, metadata: dict, prefix: str = "") -> dict[str, Any]:
|
|
139
143
|
"""Flattens a nested dictionary for indexing."""
|
|
140
144
|
flat_dict = {}
|
|
@@ -643,6 +647,38 @@ class CollectionManager[D: Document]:
|
|
|
643
647
|
cursor.close()
|
|
644
648
|
return count
|
|
645
649
|
|
|
650
|
+
def acquire(
|
|
651
|
+
self,
|
|
652
|
+
timeout: Optional[float] = None,
|
|
653
|
+
lock_ttl: Optional[float] = None,
|
|
654
|
+
poll_interval: Optional[float] = None,
|
|
655
|
+
) -> "CollectionManager[D]":
|
|
656
|
+
"""
|
|
657
|
+
Acquires an inter-process lock on this collection, blocking until acquired.
|
|
658
|
+
This guarantees exclusive access for multi-step atomic operations
|
|
659
|
+
(e.g., index + connect).
|
|
660
|
+
|
|
661
|
+
Parameters override the default settings of the underlying LockManager.
|
|
662
|
+
"""
|
|
663
|
+
self._lock.acquire(
|
|
664
|
+
timeout=timeout, lock_ttl=lock_ttl, poll_interval=poll_interval
|
|
665
|
+
)
|
|
666
|
+
return self
|
|
667
|
+
|
|
668
|
+
def release(self):
|
|
669
|
+
"""
|
|
670
|
+
Releases the inter-process lock on this collection.
|
|
671
|
+
"""
|
|
672
|
+
self._lock.release()
|
|
673
|
+
|
|
674
|
+
def __enter__(self) -> "CollectionManager[D]":
|
|
675
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
676
|
+
return self.acquire()
|
|
677
|
+
|
|
678
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
679
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
680
|
+
self.release()
|
|
681
|
+
|
|
646
682
|
|
|
647
683
|
def rerank[D: Document](
|
|
648
684
|
*results: list[D], weights: list[float] | None = None, k: int = 60
|
beaver/dicts.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
3
|
import time
|
|
4
|
-
from typing import Any, Iterator, Tuple, Type
|
|
5
|
-
|
|
4
|
+
from typing import Any, Iterator, Tuple, Type, Optional
|
|
6
5
|
from .types import JsonSerializable, IDatabase
|
|
6
|
+
from .locks import LockManager
|
|
7
7
|
|
|
8
8
|
class DictManager[T]:
|
|
9
9
|
"""A wrapper providing a Pythonic interface to a dictionary in the database."""
|
|
@@ -12,6 +12,8 @@ class DictManager[T]:
|
|
|
12
12
|
self._name = name
|
|
13
13
|
self._db = db
|
|
14
14
|
self._model = model
|
|
15
|
+
lock_name = f"__lock__dict__{name}"
|
|
16
|
+
self._lock = LockManager(db, lock_name)
|
|
15
17
|
|
|
16
18
|
def _serialize(self, value: T) -> str:
|
|
17
19
|
"""Serializes the given value to a JSON string."""
|
|
@@ -147,4 +149,35 @@ class DictManager[T]:
|
|
|
147
149
|
cursor.close()
|
|
148
150
|
|
|
149
151
|
def __repr__(self) -> str:
|
|
150
|
-
return f"DictManager(name='{self._name}')"
|
|
152
|
+
return f"DictManager(name='{self._name}')"
|
|
153
|
+
|
|
154
|
+
def acquire(
|
|
155
|
+
self,
|
|
156
|
+
timeout: Optional[float] = None,
|
|
157
|
+
lock_ttl: Optional[float] = None,
|
|
158
|
+
poll_interval: Optional[float] = None,
|
|
159
|
+
) -> "DictManager[T]":
|
|
160
|
+
"""
|
|
161
|
+
Acquires an inter-process lock on this dictionary, blocking until acquired.
|
|
162
|
+
Parameters override the default settings of the underlying LockManager.
|
|
163
|
+
"""
|
|
164
|
+
self._lock.acquire(
|
|
165
|
+
timeout=timeout,
|
|
166
|
+
lock_ttl=lock_ttl,
|
|
167
|
+
poll_interval=poll_interval
|
|
168
|
+
)
|
|
169
|
+
return self
|
|
170
|
+
|
|
171
|
+
def release(self):
|
|
172
|
+
"""
|
|
173
|
+
Releases the inter-process lock on this dictionary.
|
|
174
|
+
"""
|
|
175
|
+
self._lock.release()
|
|
176
|
+
|
|
177
|
+
def __enter__(self) -> "DictManager[T]":
|
|
178
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
179
|
+
return self.acquire()
|
|
180
|
+
|
|
181
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
182
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
183
|
+
self.release()
|
beaver/lists.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import sqlite3
|
|
3
|
-
from typing import Any, Iterator, Type, Union
|
|
4
|
-
|
|
3
|
+
from typing import Any, Iterator, Type, Union, Optional
|
|
5
4
|
from .types import JsonSerializable, IDatabase
|
|
5
|
+
from .locks import LockManager
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class ListManager[T]:
|
|
@@ -12,6 +12,8 @@ class ListManager[T]:
|
|
|
12
12
|
self._name = name
|
|
13
13
|
self._db = db
|
|
14
14
|
self._model = model
|
|
15
|
+
lock_name = f"__lock__list__{name}"
|
|
16
|
+
self._lock = LockManager(db, lock_name)
|
|
15
17
|
|
|
16
18
|
def _serialize(self, value: T) -> str:
|
|
17
19
|
"""Serializes the given value to a JSON string."""
|
|
@@ -261,4 +263,36 @@ class ListManager[T]:
|
|
|
261
263
|
cursor.execute(
|
|
262
264
|
"DELETE FROM beaver_lists WHERE rowid = ?", (rowid_to_delete,)
|
|
263
265
|
)
|
|
264
|
-
return self._deserialize(value_to_return)
|
|
266
|
+
return self._deserialize(value_to_return)
|
|
267
|
+
|
|
268
|
+
def acquire(
|
|
269
|
+
self,
|
|
270
|
+
timeout: Optional[float] = None,
|
|
271
|
+
lock_ttl: Optional[float] = None,
|
|
272
|
+
poll_interval: Optional[float] = None,
|
|
273
|
+
) -> "ListManager[T]":
|
|
274
|
+
"""
|
|
275
|
+
Acquires an inter-process lock on this list, blocking until acquired.
|
|
276
|
+
|
|
277
|
+
Parameters override the default settings of the underlying LockManager.
|
|
278
|
+
"""
|
|
279
|
+
self._lock.acquire(
|
|
280
|
+
timeout=timeout,
|
|
281
|
+
lock_ttl=lock_ttl,
|
|
282
|
+
poll_interval=poll_interval
|
|
283
|
+
)
|
|
284
|
+
return self
|
|
285
|
+
|
|
286
|
+
def release(self):
|
|
287
|
+
"""
|
|
288
|
+
Releases the inter-process lock on this list, allowing the next waiting process access.
|
|
289
|
+
"""
|
|
290
|
+
self._lock.release()
|
|
291
|
+
|
|
292
|
+
def __enter__(self) -> "ListManager[T]":
|
|
293
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
294
|
+
return self.acquire()
|
|
295
|
+
|
|
296
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
297
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
298
|
+
self.release()
|
beaver/locks.py
CHANGED
|
@@ -55,7 +55,11 @@ class LockManager:
|
|
|
55
55
|
self._waiter_id = f"pid:{os.getpid()}:id:{uuid.uuid4()}"
|
|
56
56
|
self._acquired = False # State to track if this instance holds the lock
|
|
57
57
|
|
|
58
|
-
def acquire(self
|
|
58
|
+
def acquire(self,
|
|
59
|
+
timeout: float|None = None,
|
|
60
|
+
lock_ttl: float |None = None,
|
|
61
|
+
poll_interval: float |None = None,
|
|
62
|
+
) -> "LockManager":
|
|
59
63
|
"""
|
|
60
64
|
Blocks until the lock is acquired or the timeout expires.
|
|
61
65
|
|
|
@@ -66,9 +70,18 @@ class LockManager:
|
|
|
66
70
|
# This instance already holds the lock
|
|
67
71
|
return self
|
|
68
72
|
|
|
73
|
+
if timeout is None:
|
|
74
|
+
timeout = self._timeout
|
|
75
|
+
|
|
76
|
+
if lock_ttl is None:
|
|
77
|
+
lock_ttl = self._lock_ttl
|
|
78
|
+
|
|
79
|
+
if poll_interval is None:
|
|
80
|
+
poll_interval = self._poll_interval
|
|
81
|
+
|
|
69
82
|
start_time = time.time()
|
|
70
83
|
requested_at = time.time()
|
|
71
|
-
expires_at = requested_at +
|
|
84
|
+
expires_at = requested_at + lock_ttl
|
|
72
85
|
|
|
73
86
|
conn = self._db.connection
|
|
74
87
|
|
|
@@ -113,19 +126,19 @@ class LockManager:
|
|
|
113
126
|
return self
|
|
114
127
|
|
|
115
128
|
# 5. Check for timeout
|
|
116
|
-
if
|
|
117
|
-
if (time.time() - start_time) >
|
|
129
|
+
if timeout is not None:
|
|
130
|
+
if (time.time() - start_time) > timeout:
|
|
118
131
|
# We timed out. Remove ourselves from the queue and raise.
|
|
119
132
|
self._release_from_queue()
|
|
120
133
|
raise TimeoutError(
|
|
121
|
-
f"Failed to acquire lock '{self._lock_name}' within {
|
|
134
|
+
f"Failed to acquire lock '{self._lock_name}' within {timeout}s."
|
|
122
135
|
)
|
|
123
136
|
|
|
124
137
|
# 6. Wait politely before polling again
|
|
125
138
|
# Add +/- 10% jitter to the poll interval to avoid thundering herd
|
|
126
|
-
jitter =
|
|
139
|
+
jitter = poll_interval * 0.1
|
|
127
140
|
sleep_time = random.uniform(
|
|
128
|
-
|
|
141
|
+
poll_interval - jitter, poll_interval + jitter
|
|
129
142
|
)
|
|
130
143
|
time.sleep(sleep_time)
|
|
131
144
|
|
beaver/queues.py
CHANGED
|
@@ -2,10 +2,9 @@ import asyncio
|
|
|
2
2
|
import json
|
|
3
3
|
import sqlite3
|
|
4
4
|
import time
|
|
5
|
-
from typing import Any, Literal, NamedTuple, Type, overload
|
|
6
|
-
|
|
5
|
+
from typing import Any, Literal, NamedTuple, Type, overload, Optional
|
|
7
6
|
from .types import JsonSerializable, IDatabase
|
|
8
|
-
|
|
7
|
+
from .locks import LockManager
|
|
9
8
|
|
|
10
9
|
class QueueItem[T](NamedTuple):
|
|
11
10
|
"""A data class representing a single item retrieved from the queue."""
|
|
@@ -54,6 +53,8 @@ class QueueManager[T]:
|
|
|
54
53
|
self._name = name
|
|
55
54
|
self._db = db
|
|
56
55
|
self._model = model
|
|
56
|
+
lock_name = f"__lock__queue__{name}"
|
|
57
|
+
self._lock = LockManager(db, lock_name)
|
|
57
58
|
|
|
58
59
|
def _serialize(self, value: T) -> str:
|
|
59
60
|
"""Serializes the given value to a JSON string."""
|
|
@@ -184,3 +185,37 @@ class QueueManager[T]:
|
|
|
184
185
|
|
|
185
186
|
def __repr__(self) -> str:
|
|
186
187
|
return f"QueueManager(name='{self._name}')"
|
|
188
|
+
|
|
189
|
+
def acquire(
|
|
190
|
+
self,
|
|
191
|
+
timeout: Optional[float] = None,
|
|
192
|
+
lock_ttl: Optional[float] = None,
|
|
193
|
+
poll_interval: Optional[float] = None,
|
|
194
|
+
) -> "QueueManager[T]":
|
|
195
|
+
"""
|
|
196
|
+
Acquires an inter-process lock on this queue, blocking until acquired.
|
|
197
|
+
This ensures that a sequence of operations (e.g., batch-getting tasks)
|
|
198
|
+
is performed atomically without interruption from other processes.
|
|
199
|
+
|
|
200
|
+
Parameters override the default settings of the underlying LockManager.
|
|
201
|
+
"""
|
|
202
|
+
self._lock.acquire(
|
|
203
|
+
timeout=timeout,
|
|
204
|
+
lock_ttl=lock_ttl,
|
|
205
|
+
poll_interval=poll_interval
|
|
206
|
+
)
|
|
207
|
+
return self
|
|
208
|
+
|
|
209
|
+
def release(self):
|
|
210
|
+
"""
|
|
211
|
+
Releases the inter-process lock on this queue.
|
|
212
|
+
"""
|
|
213
|
+
self._lock.release()
|
|
214
|
+
|
|
215
|
+
def __enter__(self) -> "QueueManager[T]":
|
|
216
|
+
"""Acquires the lock upon entering a 'with' statement."""
|
|
217
|
+
return self.acquire()
|
|
218
|
+
|
|
219
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
220
|
+
"""Releases the lock when exiting a 'with' statement."""
|
|
221
|
+
self.release()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
beaver/__init__.py,sha256=DBnqxMZ-ZIvX14_FoC_ZGmYqcqhQtpLG1VXjNVCcPdc,125
|
|
2
|
+
beaver/blobs.py,sha256=gauxfWOCMoP6mq61JRj-TVqqkXMAcVI2taBGYnJXsxg,5527
|
|
3
|
+
beaver/channels.py,sha256=kIuwKMDBdDQObaKT23znsMXzfpKfE7pXSxvf-u4LlpY,9554
|
|
4
|
+
beaver/cli.py,sha256=Sxm-mYU3LGd4tIqw-5LHb0ektWebjV9vn51hm-CMJD0,2232
|
|
5
|
+
beaver/collections.py,sha256=Vc5ZF5gVIACx2XeL25PxgOcW7iF6lBInO-cnfyBBUeo,27299
|
|
6
|
+
beaver/core.py,sha256=JRkRvc0Sb3FT9KlR3YbmiPcqCQ686dFKmHSNZ_UJ_aE,17100
|
|
7
|
+
beaver/dicts.py,sha256=0csA1fvQb3rB2yQvwuq_kzgJ0YPp-wifBLkNcuiUltI,6582
|
|
8
|
+
beaver/lists.py,sha256=vKZPVRiw0BRSx4JKaboGnWXfwNGkHX8cBFH59qQX1yY,11258
|
|
9
|
+
beaver/locks.py,sha256=b6cHgAI1YQxKmVdLLzNw9fcGvk4V3SQS_wUaQTHSsUk,6630
|
|
10
|
+
beaver/logs.py,sha256=a5xenwl5NZeegIU0dWVEs67lvaHzzw-JRAZtEzNNO3E,9529
|
|
11
|
+
beaver/queues.py,sha256=wTlxsu12grcIPbosA1S0_23Tot4Wv3BWXeKyq4dRPKk,7709
|
|
12
|
+
beaver/server.py,sha256=At3BoEV7JfpYjNtyHMdPUF8shj4V4D5nStXWb6Bv53A,15947
|
|
13
|
+
beaver/types.py,sha256=m0ohT7A8r0Y1a7bJEx4VanLaOUWU2VYxaLHPsVPjrIw,1651
|
|
14
|
+
beaver/vectors.py,sha256=EGZf1s364-rMubxkYoTcjBl72lRRxM1cUwypjsoC6ec,18499
|
|
15
|
+
beaver_db-0.19.3.dist-info/METADATA,sha256=gRJetTcWICFhi0kQUFeNt773vTZkZYF-iRFqCtUXqjE,23431
|
|
16
|
+
beaver_db-0.19.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
17
|
+
beaver_db-0.19.3.dist-info/entry_points.txt,sha256=bd5E2s45PoBdtdR9-ToKSdLNhmHp8naV1lWP5mOzlrc,42
|
|
18
|
+
beaver_db-0.19.3.dist-info/licenses/LICENSE,sha256=1xrIY5JnMk_QDQzsqmVzPIIyCgZAkWCC8kF2Ddo1UT0,1071
|
|
19
|
+
beaver_db-0.19.3.dist-info/RECORD,,
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
beaver/__init__.py,sha256=HjTNjk3x58Pw9Iv_eAPVL088wDVEua-JEgecZ28NgMc,125
|
|
2
|
-
beaver/blobs.py,sha256=U5n6NLRQGAzsePGR2SJPRXHy22K8T9cJVMIb0JGzsY0,4399
|
|
3
|
-
beaver/channels.py,sha256=kIuwKMDBdDQObaKT23znsMXzfpKfE7pXSxvf-u4LlpY,9554
|
|
4
|
-
beaver/cli.py,sha256=Sxm-mYU3LGd4tIqw-5LHb0ektWebjV9vn51hm-CMJD0,2232
|
|
5
|
-
beaver/collections.py,sha256=UAQAuRxJRCqY5PHfxJNm3CdKqMNuyY8DOLdodvY6jpk,26107
|
|
6
|
-
beaver/core.py,sha256=JRkRvc0Sb3FT9KlR3YbmiPcqCQ686dFKmHSNZ_UJ_aE,17100
|
|
7
|
-
beaver/dicts.py,sha256=Xp8lPfQt08O8zCbptQLWQLO79OxG6uAVER6ryj3SScQ,5495
|
|
8
|
-
beaver/lists.py,sha256=rfJ8uTNLkMREYc0uGx0z1VKt2m3eR9hvbdvDD58EbmQ,10140
|
|
9
|
-
beaver/locks.py,sha256=GWDSRkPw2lrAQfXIRqvkc5PK9zZ2eLYWKTuzHTs9j_A,6321
|
|
10
|
-
beaver/logs.py,sha256=a5xenwl5NZeegIU0dWVEs67lvaHzzw-JRAZtEzNNO3E,9529
|
|
11
|
-
beaver/queues.py,sha256=Fr3oie63EtceSoiC8EOEDSLu1tDI8q2MYLXd8MEeC3g,6476
|
|
12
|
-
beaver/server.py,sha256=At3BoEV7JfpYjNtyHMdPUF8shj4V4D5nStXWb6Bv53A,15947
|
|
13
|
-
beaver/types.py,sha256=m0ohT7A8r0Y1a7bJEx4VanLaOUWU2VYxaLHPsVPjrIw,1651
|
|
14
|
-
beaver/vectors.py,sha256=EGZf1s364-rMubxkYoTcjBl72lRRxM1cUwypjsoC6ec,18499
|
|
15
|
-
beaver_db-0.19.2.dist-info/METADATA,sha256=Iec3mTpq384nkp_R8fD2AGjXHRzarA93uxL623ZtyVE,23431
|
|
16
|
-
beaver_db-0.19.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
17
|
-
beaver_db-0.19.2.dist-info/entry_points.txt,sha256=bd5E2s45PoBdtdR9-ToKSdLNhmHp8naV1lWP5mOzlrc,42
|
|
18
|
-
beaver_db-0.19.2.dist-info/licenses/LICENSE,sha256=1xrIY5JnMk_QDQzsqmVzPIIyCgZAkWCC8kF2Ddo1UT0,1071
|
|
19
|
-
beaver_db-0.19.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|