s3dol
s3 (through boto3) with a simple (dict-like or list-like) interface
To install: pip install s3dol
Quick start
import s3dol
s = s3dol.s3_store("my-bucket") # MutableMapping[str, bytes]
s["hello.txt"] = b"world"
s["hello.txt"] # b'world'
list(s)
"hello.txt" in s
del s["hello.txt"]
s = s3dol.s3_store("my-bucket", prefix="logs/") # scoped to a prefix
s = s3dol.s3_store("open-data", anon=True) # public bucket, no credentials
s = s3dol.s3_store("b", preset="minio", endpoint_url="http://localhost:9000")
Starting from nothing (the default never creates a bucket from a typo):
s = s3dol.s3_store("brand-new-bucket", on_missing_bucket="create")
Big objects go through the same interface — no upload_multipart method:
s["video.mp4"] = s3dol.Filepath("/tmp/video.mp4") # streamed, multipart above 8 MiB
s["stream.bin"] = s3dol.Chunks(chunk_iterator) # never fully in memory
Keyed capabilities are stores you index, not methods (a dol key wrapper
hands a method the unmapped key — so s3dol has none):
s3dol.handles(s)["video.mp4"].read(offset=0, length=1024) # ranged read
s3dol.handles(s)["video.mp4"].url(expires_in=3600) # presigned URL
s3dol.urls(s)["video.mp4"] # ...or directly
s3dol.info(s)["video.mp4"].size # one HeadObject
Everything else is a free function taking the store first:
s3dol.sub(s, "folder/")
s3dol.prefixes(s)
s3dol.delete_many(s, ["a", "b"])
s3dol.delete_bucket(endpoint, "name", force=True)
Test without a cloud — no network, no docker, no moto:
from s3dol.testing import mock_s3, run_conformance
def test_my_service():
assert MediaService(mock_s3(data={"a.mp4": b"..."})).play("a.mp4")
run_conformance(make_store) is exported too: run the same laws against your
own store (or a sibling *dol package's).
Heads-up: v1 is coming — run s3dol.diagnose() now
A major, behaviour-clarifying v1 is in progress
(design: misc/docs/architecture.md and the ADRs in
misc/docs/decisions/). Today's S3Store will keep
working through a compatibility shim, but a few v0 behaviours were bugs
(e.g. an explicit endpoint_url= being silently dropped whenever
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY are exported) and v1 fixes them —
which can move where your data goes.
Before upgrading to v1, run the diagnosis with the same arguments you pass
S3Store today, in the environment you deploy in:
import s3dol
s3dol.diagnose(bucket_name="my-bucket", endpoint_url="...", path="...")
It prints what resolves (endpoint, region, signing, credential source — never a secret), where each value came from, and a v0-vs-v1 divergence table telling you whether the upgrade changes anything for your call. It never raises; a failing resolution is part of the report.
Set up credentials
Recommended prerequisite to make getting started easier but not required.
Option 1: Environment Variables
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION=us-west-2
Option 2: Configure Default Profile in Credentials File
Add credentails in ~/.aws/credentials
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Option 3: Configure Default Profile with AWS CLI
brew instal awscli
Set credentails with CLI
aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]:
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file s3dol-1.0.0.tar.gz.
File metadata
- Download URL: s3dol-1.0.0.tar.gz
- Upload date:
- Size: 177.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
253723f5b4f8a7a219091b55040d82c222f07fb7b45dd8cf9ebbea6a19649b69
|
|
| MD5 |
a638df6f2e6b0d2e87dc0574556cdab2
|
|
| BLAKE2b-256 |
44b3b37d004c61dec28d13000ec33c323f9babb584f7b2b74fff617804fa173b
|
File details
Details for the file s3dol-1.0.0-py3-none-any.whl.
File metadata
- Download URL: s3dol-1.0.0-py3-none-any.whl
- Upload date:
- Size: 108.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3875136225cbb22227bda618fb8fb5fc691849d08a6cb6f8c455cabb83876b78
|
|
| MD5 |
fb1c4788ea72cc7ee9eac387d2d8b217
|
|
| BLAKE2b-256 |
45c95e6c72413f2b13499a29bb312486e775452a197571ad8e8ba300ff682f1f
|