userharbor-inmemory is a minimal, contract-tested UserStore implementation for UserHarbor. It can be installed directly for tests and examples or used as a GitHub template when building a custom storage integration.
[!WARNING] All data is process-local and is lost when the store instance is discarded. This package is not a persistent database and is not intended for production storage.
Installation
pip install userharbor-inmemory
The package depends on userharbor and has no database or framework dependencies.
Usage
from userharbor import UserHarbor
from userharbor_inmemory import InMemoryUserStore
store = InMemoryUserStore()
harbor = UserHarbor(
secret_key="your-secret-key",
store=store,
email_sender=email_sender,
)
Each InMemoryUserStore instance starts empty and keeps its data for the lifetime of that instance.
The store implements the complete UserHarbor persistence contract:
- users and password hashes
- case-insensitive username lookup and uniqueness with original casing preserved
- email verification and password reset tokens
- sessions and session refresh
- roles and permissions
- user-role and role-permission assignments
- commit, rollback, and nested transaction behavior
Each user has at most one active email verification token and one active password reset token. Storing a replacement invalidates the previous token. Users may have multiple active sessions.
Use as an integration template
Select Use this template on GitHub and create a new repository. The generated repository starts with a complete implementation and a passing contract suite, so backend code can be replaced incrementally while the tests continue to verify UserStore behavior.
GitHub copies files without replacing project-specific names. After creating a repository:
- Rename the distribution in
pyproject.toml. - Rename the
userharbor_inmemorypackage andInMemoryUserStoreclass. - Update project metadata, links, badges, and this README.
- Replace the in-memory dictionaries and snapshot transaction with the target backend.
- Adapt the
user_storefixture intests/conftest.pyto create and clean up the backend. - Keep backend-specific tests separate from the shared contract suite.
- Run the complete test suite before publishing.
The contract tests stay intentionally small in this repository:
# tests/test_user_store_contract.py
from userharbor.testing.user_store_contract import * # noqa: F403
# tests/conftest.py
import pytest
from userharbor_inmemory import InMemoryUserStore
@pytest.fixture
def user_store() -> InMemoryUserStore:
return InMemoryUserStore()
See the UserStore contract testing guide and custom integrations guide for the complete behavioral requirements.
Development
Install the project and run its tests:
uv sync
uv run pytest
The suite imports the shared contract distributed with UserHarbor. Tests specific to this package remain in tests/test_public_api.py.
To develop against an unpublished local UserHarbor checkout, keep both repositories in the same parent directory and run:
uv run --with-editable ../userharbor pytest
Limitations
InMemoryUserStore is deliberately small. It does not provide persistence across process restarts, cross-process sharing, durable transactions, or concurrency guarantees. Its snapshot-based transaction implementation exists to reproduce the atomic behavior required by UserHarbor in tests and examples.
License
UserHarbor In-Memory is licensed under the MIT License. See LICENSE for details.
Metadata
Release files for userharbor-inmemory 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| userharbor_inmemory-0.3.0.tar.gz | 4.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| userharbor_inmemory-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.2 kB
Release files / userharbor_inmemory-0.3.0.tar.gz
| Download URL | userharbor_inmemory-0.3.0.tar.gz |
|---|---|
| Size | 4.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43d44dbe51cf2854227c3348af1607c271527631696c3555c40ad558bc378ac4
|
|
BLAKE2b-256 checksum How to use checksums |
596c5316f0ae6431e157a72d41b45b995086ac1fac8a20dad59ba8cf4ed67754
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / userharbor_inmemory-0.3.0-py3-none-any.whl
| Download URL | userharbor_inmemory-0.3.0-py3-none-any.whl |
|---|---|
| Size | 5.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
59b1ced19f2a3d21e160b9d6d28f74978b360b0c46fdbc0141a3c8b39cd93367
|
|
BLAKE2b-256 checksum How to use checksums |
c45e66f0e385dc181b4006f413a676d7dabb3d8d83eff3304937de1949ce245b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|