Metadata-Version: 2.4
Name: shelfdb
Version: 2.1.0rc1
Summary: A tiny database for Python
Author: Nitipit Nontasuwan
Author-email: Nitipit Nontasuwan <nitipit@gmail.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Dist: cyclopts>=4.10.2
Requires-Dist: dictify>=4.0.0,<4.1
Requires-Dist: dill>=0.4.0,<0.5
Requires-Dist: lmdb>=1.7.3,<2
Requires-Dist: msgpack>=1.1.2,<2
Requires-Dist: structlog>=25.1.0,<26
Requires-Dist: uvloop>=0.22.0,<0.23 ; sys_platform == 'linux'
Requires-Python: >=3.12
Description-Content-Type: text/markdown

# shelfdb

Tiny LMDB-backed shelf database utilities.

## Server

Run the protocol server:

```bash
shelfdb server
```

Run the protocol server on a custom address:

```bash
shelfdb server --url "tcp://0.0.0.0:17001" --db-path ./db
```

## Client

Connect a client:

```python
from shelfdb.client import Client

client = await Client.connect("tcp://127.0.0.1:31337")
```

Unix sockets also work:

```python
from shelfdb.client import Client

client = await Client.connect("unix:///tmp/shelfdb.sock")
```

## Example

```python
from shelfdb.client import Client

client = await Client.connect("tcp://127.0.0.1:31337")

try:
    async with client.transaction() as tx:
        users = tx.shelf("users")

        count = await users.count().query()
        alice = await users.key("alice").item().query()
        admins = await users.filter(
            lambda item: item.value["role"] == "admin"
        ).sort(reverse=True).query()

    async with client.transaction(write=True) as tx:
        users = tx.shelf("users")

        await users.put("eve", {"role": "user"}).query()
        await users.key("eve").update(
            lambda item: {**item.value, "role": "admin"}
        ).query()
finally:
    await client.close()
```
