beaver-db 0.16.0__py3-none-any.whl → 0.16.2__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/lists.py CHANGED
@@ -40,38 +40,40 @@ class ListManager[T]:
40
40
  Retrieves an item or slice from the list (e.g., `my_list[0]`, `my_list[1:3]`).
41
41
  """
42
42
  if isinstance(key, slice):
43
- start, stop, step = key.indices(len(self))
44
- if step != 1:
45
- raise ValueError("Slicing with a step is not supported.")
46
-
47
- limit = stop - start
48
- if limit <= 0:
49
- return []
50
-
51
- cursor = self._conn.cursor()
52
- cursor.execute(
53
- "SELECT item_value FROM beaver_lists WHERE list_name = ? ORDER BY item_order ASC LIMIT ? OFFSET ?",
54
- (self._name, limit, start),
55
- )
56
- results = [self._deserialize(row["item_value"]) for row in cursor.fetchall()]
57
- cursor.close()
58
- return results
43
+ with self._conn:
44
+ start, stop, step = key.indices(len(self))
45
+ if step != 1:
46
+ raise ValueError("Slicing with a step is not supported.")
47
+
48
+ limit = stop - start
49
+ if limit <= 0:
50
+ return []
51
+
52
+ cursor = self._conn.cursor()
53
+ cursor.execute(
54
+ "SELECT item_value FROM beaver_lists WHERE list_name = ? ORDER BY item_order ASC LIMIT ? OFFSET ?",
55
+ (self._name, limit, start),
56
+ )
57
+ results = [self._deserialize(row["item_value"]) for row in cursor.fetchall()]
58
+ cursor.close()
59
+ return results
59
60
 
60
61
  elif isinstance(key, int):
61
- list_len = len(self)
62
- if key < -list_len or key >= list_len:
63
- raise IndexError("List index out of range.")
64
-
65
- offset = key if key >= 0 else list_len + key
66
-
67
- cursor = self._conn.cursor()
68
- cursor.execute(
69
- "SELECT item_value FROM beaver_lists WHERE list_name = ? ORDER BY item_order ASC LIMIT 1 OFFSET ?",
70
- (self._name, offset),
71
- )
72
- result = cursor.fetchone()
73
- cursor.close()
74
- return self._deserialize(result["item_value"])
62
+ with self._conn:
63
+ list_len = len(self)
64
+ if key < -list_len or key >= list_len:
65
+ raise IndexError("List index out of range.")
66
+
67
+ offset = key if key >= 0 else list_len + key
68
+
69
+ cursor = self._conn.cursor()
70
+ cursor.execute(
71
+ "SELECT item_value FROM beaver_lists WHERE list_name = ? ORDER BY item_order ASC LIMIT 1 OFFSET ?",
72
+ (self._name, offset),
73
+ )
74
+ result = cursor.fetchone()
75
+ cursor.close()
76
+ return self._deserialize(result["item_value"])
75
77
 
76
78
  else:
77
79
  raise TypeError("List indices must be integers or slices.")
@@ -81,13 +83,13 @@ class ListManager[T]:
81
83
  if not isinstance(key, int):
82
84
  raise TypeError("List indices must be integers.")
83
85
 
84
- list_len = len(self)
85
- if key < -list_len or key >= list_len:
86
- raise IndexError("List index out of range.")
86
+ with self._conn:
87
+ list_len = len(self)
88
+ if key < -list_len or key >= list_len:
89
+ raise IndexError("List index out of range.")
87
90
 
88
- offset = key if key >= 0 else list_len + key
91
+ offset = key if key >= 0 else list_len + key
89
92
 
90
- with self._conn:
91
93
  cursor = self._conn.cursor()
92
94
  # Find the rowid of the item to update
93
95
  cursor.execute(
@@ -110,13 +112,13 @@ class ListManager[T]:
110
112
  if not isinstance(key, int):
111
113
  raise TypeError("List indices must be integers.")
112
114
 
113
- list_len = len(self)
114
- if key < -list_len or key >= list_len:
115
- raise IndexError("List index out of range.")
115
+ with self._conn:
116
+ list_len = len(self)
117
+ if key < -list_len or key >= list_len:
118
+ raise IndexError("List index out of range.")
116
119
 
117
- offset = key if key >= 0 else list_len + key
120
+ offset = key if key >= 0 else list_len + key
118
121
 
119
- with self._conn:
120
122
  cursor = self._conn.cursor()
121
123
  # Find the rowid of the item to delete
122
124
  cursor.execute(
@@ -206,20 +208,20 @@ class ListManager[T]:
206
208
 
207
209
  def insert(self, index: int, value: T):
208
210
  """Inserts an item at a specific index."""
209
- list_len = len(self)
210
- if index <= 0:
211
- self.prepend(value)
212
- return
213
- if index >= list_len:
214
- self.push(value)
215
- return
216
-
217
- # Midpoint insertion for O(1) inserts
218
- order_before = self._get_order_at_index(index - 1)
219
- order_after = self._get_order_at_index(index)
220
- new_order = order_before + (order_after - order_before) / 2.0
221
-
222
211
  with self._conn:
212
+ list_len = len(self)
213
+ if index <= 0:
214
+ self.prepend(value)
215
+ return
216
+ if index >= list_len:
217
+ self.push(value)
218
+ return
219
+
220
+ # Midpoint insertion for O(1) inserts
221
+ order_before = self._get_order_at_index(index - 1)
222
+ order_after = self._get_order_at_index(index)
223
+ new_order = order_before + (order_after - order_before) / 2.0
224
+
223
225
  self._conn.execute(
224
226
  "INSERT INTO beaver_lists (list_name, item_order, item_value) VALUES (?, ?, ?)",
225
227
  (self._name, new_order, self._serialize(value)),
@@ -1,7 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beaver-db
3
- Version: 0.16.0
3
+ Version: 0.16.2
4
4
  Summary: Fast, embedded, and multi-modal DB based on SQLite for AI-powered applications.
5
+ Classifier: Programming Language :: Python :: 3
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Operating System :: OS Independent
8
+ Classifier: Topic :: Database
9
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
5
10
  Requires-Python: >=3.13
6
11
  Description-Content-Type: text/markdown
7
12
  License-File: LICENSE
@@ -11,6 +16,13 @@ Dynamic: license-file
11
16
 
12
17
  # beaver 🦫
13
18
 
19
+ <!-- Project badges -->
20
+ ![PyPI - Version](https://img.shields.io/pypi/v/beaver-db)
21
+ ![PyPi - Python Version](https://img.shields.io/pypi/pyversions/beaver-db)
22
+ ![Github - Open Issues](https://img.shields.io/github/issues-raw/apiad/beaver)
23
+ ![PyPi - Downloads (Monthly)](https://img.shields.io/pypi/dm/beaver-db)
24
+ ![Github - Commits](https://img.shields.io/github/commit-activity/m/apiad/beaver)
25
+
14
26
  A fast, single-file, multi-modal database for Python, built with the standard `sqlite3` library.
15
27
 
16
28
  `beaver` is the **B**ackend for **E**mbedded, **A**ll-in-one **V**ector, **E**ntity, and **R**elationship storage. It's a simple, local, and embedded database designed to manage complex, modern data types without requiring a database server, built on top of SQLite.
@@ -236,8 +248,8 @@ def summarize(window):
236
248
  return {"mean": statistics.mean(values), "count": len(values)}
237
249
 
238
250
  live_summary = logs.live(
239
- window_duration=timedelta(seconds=10),
240
- sampling_period=timedelta(seconds=1),
251
+ window=timedelta(seconds=10),
252
+ period=timedelta(seconds=1),
241
253
  aggregator=summarize
242
254
  )
243
255
 
@@ -294,6 +306,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
294
306
  - [`graph.py`](examples/graph.py): Shows how to create relationships between documents and perform multi-hop graph traversals.
295
307
  - [`kvstore.py`](examples/kvstore.py): A comprehensive demo of the namespaced dictionary feature.
296
308
  - [`list.py`](examples/list.py): Shows the full capabilities of the persistent list, including slicing and in-place updates.
309
+ - [`logs.py`](examples/logs.py): A short example showing how to build a realtime dashboard with the logging feature.
297
310
  - [`pqueue.py`](examples/pqueue.py): A practical example of using the persistent priority queue for task management.
298
311
  - [`producer_consumer.py`](examples/producer_consumer.py): A demonstration of the distributed task queue system in a multi-process environment.
299
312
  - [`publisher.py`](examples/publisher.py) and [`subscriber.py`](examples/subscriber.py): A pair of examples demonstrating inter-process message passing with the publish/subscribe system.
@@ -301,7 +314,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
301
314
  - [`rerank.py`](examples/rerank.py): Shows how to combine results from vector and text search for more refined results.
302
315
  - [`stress_vectors.py`](examples/stress_vectors.py): A stress test for the vector search functionality.
303
316
  - [`textual_chat.py`](examples/textual_chat.py): A chat application built with `textual` and `beaver` to illustrate the use of several primitives (lists, dicts, and channels) at the same time.
304
- - [`type_hints.py](examples/type_hints.py): Shows how to use type hints with `beaver` to get better IDE support and type safety.
317
+ - [`type_hints.py`](examples/type_hints.py): Shows how to use type hints with `beaver` to get better IDE support and type safety.
305
318
  - [`vector.py`](examples/vector.py): Demonstrates how to index and search vector embeddings, including upserts.
306
319
 
307
320
  ## Roadmap
@@ -4,13 +4,13 @@ beaver/channels.py,sha256=pCO8wFJAHdMzBLKvinI32L_XfU2B91H2qfsj1Tej-bc,9322
4
4
  beaver/collections.py,sha256=Uz241TSs0xRABPYeKenDYmkbaM0PKfvcBX5j0lMzMMA,24306
5
5
  beaver/core.py,sha256=t_UzpqcbF2U8BjmQ9aIWTvUzPuVuOLcPzTrZQ2htjn4,13706
6
6
  beaver/dicts.py,sha256=1BQ9A_cMkJ7l5ayWbDG-4Wi3WtQ-9BKd7Wj_CB7dGlU,5410
7
- beaver/lists.py,sha256=0LT2XjuHs8pDgvW48kk_lfVc-Y-Ulmym0gcVWRESPtA,9708
7
+ beaver/lists.py,sha256=Q7xjyReBWFg47nBrXbt09GvBJkEmXvpW9ptL9xCnXC8,9946
8
8
  beaver/logs.py,sha256=mlJizZU0emlqLwuNeBJSPlict35Vyi35L4eIl5orv-M,9673
9
9
  beaver/queues.py,sha256=IQoeNhcYrVZTuH_4bWhtiEa-EYbFx_2iVKkR254XPnE,5953
10
10
  beaver/types.py,sha256=65rDdj97EegghEkKCNjI67bPYtTTI_jyB-leHdIypx4,1249
11
11
  beaver/vectors.py,sha256=j7RL2Y_xMAF2tPTi6E2LdJqZerSQXlnEQJOGZkefTsA,18358
12
- beaver_db-0.16.0.dist-info/licenses/LICENSE,sha256=1xrIY5JnMk_QDQzsqmVzPIIyCgZAkWCC8kF2Ddo1UT0,1071
13
- beaver_db-0.16.0.dist-info/METADATA,sha256=hNq6GOos295d5QeaUfTqSiLw4MDty9vyzNXpVYV7JzI,17070
14
- beaver_db-0.16.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
- beaver_db-0.16.0.dist-info/top_level.txt,sha256=FxA4XnX5Qm5VudEXCduFriqi4dQmDWpQ64d7g69VQKI,7
16
- beaver_db-0.16.0.dist-info/RECORD,,
12
+ beaver_db-0.16.2.dist-info/licenses/LICENSE,sha256=1xrIY5JnMk_QDQzsqmVzPIIyCgZAkWCC8kF2Ddo1UT0,1071
13
+ beaver_db-0.16.2.dist-info/METADATA,sha256=n3D6D9Yq8aVEFX298MjpI-qWQ0iKYYaMCfYiI9Lme94,17821
14
+ beaver_db-0.16.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
+ beaver_db-0.16.2.dist-info/top_level.txt,sha256=FxA4XnX5Qm5VudEXCduFriqi4dQmDWpQ64d7g69VQKI,7
16
+ beaver_db-0.16.2.dist-info/RECORD,,