anystore
Store anything anywhere. anystore provides a high-level storage and retrieval interface for various supported store backends, such as redis, sql, file, http, cloud-storages and anything else supported by fsspec.
Think of it as a key -> value store, and anystore acts as a cache backend. And when keys become filenames and values become byte blobs, anystore becomes actually a file-like storage backend – but always with the same and interchangeable interface.
Why?
In our several data engineering projects we always wrote boilerplate code that handles the featureset of anystore but not in a reusable way. This library shall be a stable foundation for data wrangling related python projects.
Examples
Base cli interface:
anystore -i ./local/foo.txt -o s3://mybucket/other.txt
echo "hello" | anystore -o sftp://user:password@host:/tmp/world.txt
anystore -i https://dataresearchcenter.org > index.html
anystore --store sqlite:///db keys <prefix>
anystore --store redis://localhost put foo "bar"
anystore --store redis://localhost get foo # -> "bar"
Use in your applications:
from anystore import smart_read, smart_write
data = smart_read("s3://mybucket/data.txt")
smart_write(".local/data", data)
Simple cache example via decorator:
Use case: @anycache is used for api view cache in ftmq-api
from anystore import get_store, anycache
cache = get_store("redis://localhost")
@anycache(store=cache, key_func=lambda q: f"api/list/{q.make_key()}", ttl=60)
def get_list_view(q: Query) -> Response:
result = ... # complex computing will be cached
return result
Mirror file collections:
from anystore import get_store
source = get_store("https://example.org/documents/archive1") # directory listing
target = get_store("s3://mybucket/files", backend_config={"client_kwargs": {
"aws_access_key_id": "my-key",
"aws_secret_access_key": "***",
"endpoint_url": "https://s3.local"
}}) # can be configured via ENV as well
for path in source.iterate_keys():
# streaming copy:
with source.open(path) as i:
with target.open(path, "wb") as o:
while chunk := i.read(8192):
o.write(chunk)
Documentation
Find the docs at docs.investigraph.dev/lib/anystore
Used by
- ftmq, a query interface layer for followthemoney data
- investigraph, a framework to manage collections of structured followthemoney data
- ftmq-api, a simple api on top off
ftmqbuilt with FastApi - ftm-geocode, batch parse and geocode addresses from followthemoney entities
- ftm-lakehouse, a library to crawl, store and move around document collections and structured FollowTheMoney data (in progress)
- The OpenAleph suite in general
Development
This package is using poetry for packaging and dependencies management, so first install it.
Clone this repository to a local destination.
Within the repo directory, run
poetry install --with dev
This installs a few development dependencies, including pre-commit which needs to be registered:
poetry run pre-commit install
Before creating a commit, this checks for correct code formatting (isort, black) and some other useful stuff (see: .pre-commit-config.yaml)
testing
anystore uses pytest as the testing framework.
make test
License and Copyright
anystore, (C) 2024 investigativedata.io
anystore, (C) 2025 investigativedata.io, Data and Researc Center – DARC
anystore is licensed under the AGPLv3 or later license.
Prior to version 0.3.0, anystore was released under the GPL-3.0 license.
Release files for anystore 1.2.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| anystore-1.2.7.tar.gz | 58.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| anystore-1.2.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 133.4 kB
Release files / anystore-1.2.7.tar.gz
| Download URL | anystore-1.2.7.tar.gz |
|---|---|
| Size | 58.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0b260aca816c785bcb70a09f3b6fbc48b95becd65d102800b90554c1dd3803e
|
|
BLAKE2b-256 checksum How to use checksums |
0d46b951d7c5a69693f40f364849be4e3c1963cc16a82104318f23716803af91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.1 CPython/3.14.4 Linux/7.0.0-29-generic
|
Release files / anystore-1.2.7-py3-none-any.whl
| Download URL | anystore-1.2.7-py3-none-any.whl |
|---|---|
| Size | 75.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5ae746054178c94f4f910d49165099dcdd46ab83a4f283b00129081e53a7676b
|
|
BLAKE2b-256 checksum How to use checksums |
61221cd5a0269c52950c954d452b8c9e22e4fd279f26dc5448ac2ae75a0caf83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.1 CPython/3.14.4 Linux/7.0.0-29-generic
|