beaver-db 0.16.0__tar.gz → 0.16.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.

Potentially problematic release.


This version of beaver-db might be problematic. Click here for more details.

@@ -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
@@ -1,16 +1,12 @@
1
- Metadata-Version: 2.4
2
- Name: beaver-db
3
- Version: 0.16.0
4
- Summary: Fast, embedded, and multi-modal DB based on SQLite for AI-powered applications.
5
- Requires-Python: >=3.13
6
- Description-Content-Type: text/markdown
7
- License-File: LICENSE
8
- Requires-Dist: faiss-cpu>=1.12.0
9
- Requires-Dist: numpy>=2.3.3
10
- Dynamic: license-file
11
-
12
1
  # beaver 🦫
13
2
 
3
+ <!-- Project badges -->
4
+ ![PyPI - Version](https://img.shields.io/pypi/v/beaver-db)
5
+ ![PyPi - Python Version](https://img.shields.io/pypi/pyversions/beaver-db)
6
+ ![Github - Open Issues](https://img.shields.io/github/issues-raw/apiad/beaver)
7
+ ![PyPi - Downloads (Monthly)](https://img.shields.io/pypi/dm/beaver-db)
8
+ ![Github - Commits](https://img.shields.io/github/commit-activity/m/apiad/beaver)
9
+
14
10
  A fast, single-file, multi-modal database for Python, built with the standard `sqlite3` library.
15
11
 
16
12
  `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 +232,8 @@ def summarize(window):
236
232
  return {"mean": statistics.mean(values), "count": len(values)}
237
233
 
238
234
  live_summary = logs.live(
239
- window_duration=timedelta(seconds=10),
240
- sampling_period=timedelta(seconds=1),
235
+ window=timedelta(seconds=10),
236
+ period=timedelta(seconds=1),
241
237
  aggregator=summarize
242
238
  )
243
239
 
@@ -294,6 +290,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
294
290
  - [`graph.py`](examples/graph.py): Shows how to create relationships between documents and perform multi-hop graph traversals.
295
291
  - [`kvstore.py`](examples/kvstore.py): A comprehensive demo of the namespaced dictionary feature.
296
292
  - [`list.py`](examples/list.py): Shows the full capabilities of the persistent list, including slicing and in-place updates.
293
+ - [`logs.py`](examples/logs.py): A short example showing how to build a realtime dashboard with the logging feature.
297
294
  - [`pqueue.py`](examples/pqueue.py): A practical example of using the persistent priority queue for task management.
298
295
  - [`producer_consumer.py`](examples/producer_consumer.py): A demonstration of the distributed task queue system in a multi-process environment.
299
296
  - [`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 +298,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
301
298
  - [`rerank.py`](examples/rerank.py): Shows how to combine results from vector and text search for more refined results.
302
299
  - [`stress_vectors.py`](examples/stress_vectors.py): A stress test for the vector search functionality.
303
300
  - [`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.
301
+ - [`type_hints.py`](examples/type_hints.py): Shows how to use type hints with `beaver` to get better IDE support and type safety.
305
302
  - [`vector.py`](examples/vector.py): Demonstrates how to index and search vector embeddings, including upserts.
306
303
 
307
304
  ## Roadmap
@@ -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,5 +1,28 @@
1
+ Metadata-Version: 2.4
2
+ Name: beaver-db
3
+ Version: 0.16.2
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
10
+ Requires-Python: >=3.13
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: faiss-cpu>=1.12.0
14
+ Requires-Dist: numpy>=2.3.3
15
+ Dynamic: license-file
16
+
1
17
  # beaver 🦫
2
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
+
3
26
  A fast, single-file, multi-modal database for Python, built with the standard `sqlite3` library.
4
27
 
5
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.
@@ -225,8 +248,8 @@ def summarize(window):
225
248
  return {"mean": statistics.mean(values), "count": len(values)}
226
249
 
227
250
  live_summary = logs.live(
228
- window_duration=timedelta(seconds=10),
229
- sampling_period=timedelta(seconds=1),
251
+ window=timedelta(seconds=10),
252
+ period=timedelta(seconds=1),
230
253
  aggregator=summarize
231
254
  )
232
255
 
@@ -283,6 +306,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
283
306
  - [`graph.py`](examples/graph.py): Shows how to create relationships between documents and perform multi-hop graph traversals.
284
307
  - [`kvstore.py`](examples/kvstore.py): A comprehensive demo of the namespaced dictionary feature.
285
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.
286
310
  - [`pqueue.py`](examples/pqueue.py): A practical example of using the persistent priority queue for task management.
287
311
  - [`producer_consumer.py`](examples/producer_consumer.py): A demonstration of the distributed task queue system in a multi-process environment.
288
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.
@@ -290,7 +314,7 @@ For more in-depth examples, check out the scripts in the `examples/` directory:
290
314
  - [`rerank.py`](examples/rerank.py): Shows how to combine results from vector and text search for more refined results.
291
315
  - [`stress_vectors.py`](examples/stress_vectors.py): A stress test for the vector search functionality.
292
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.
293
- - [`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.
294
318
  - [`vector.py`](examples/vector.py): Demonstrates how to index and search vector embeddings, including upserts.
295
319
 
296
320
  ## Roadmap
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beaver-db"
3
- version = "0.16.0"
3
+ version = "0.16.2"
4
4
  description = "Fast, embedded, and multi-modal DB based on SQLite for AI-powered applications."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -8,6 +8,13 @@ dependencies = [
8
8
  "faiss-cpu>=1.12.0",
9
9
  "numpy>=2.3.3",
10
10
  ]
11
+ classifiers = [
12
+ "Programming Language :: Python :: 3",
13
+ "License :: OSI Approved :: MIT License",
14
+ "Operating System :: OS Independent",
15
+ "Topic :: Database",
16
+ "Topic :: Software Development :: Libraries :: Application Frameworks",
17
+ ]
11
18
 
12
19
  [tool.hatch.build.targets.wheel]
13
20
  packages = ["beaver"]
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