Skip to main content

s3dol

s3 (through boto3) with a simple (dict-like or list-like) interface

To install: pip install s3dol

Documentation

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

Install 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]:

Metadata

Release files for s3dol 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for s3dol 1.0.0
File Size Uploaded
s3dol-1.0.0.tar.gz 177.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for s3dol 1.0.0
File Interpreter ABI Platform
s3dol-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 286.4 kB

Release files / s3dol-1.0.0.tar.gz

Download URL s3dol-1.0.0.tar.gz
Size 177.7 kB
Tags Source
SHA-256 checksum
How to use checksums
253723f5b4f8a7a219091b55040d82c222f07fb7b45dd8cf9ebbea6a19649b69
BLAKE2b-256 checksum
How to use checksums
44b3b37d004c61dec28d13000ec33c323f9babb584f7b2b74fff617804fa173b
Upload date
Uploaded using Trusted Publishing?
What is 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}

Release files / s3dol-1.0.0-py3-none-any.whl

Download URL s3dol-1.0.0-py3-none-any.whl
Size 108.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3875136225cbb22227bda618fb8fb5fc691849d08a6cb6f8c455cabb83876b78
BLAKE2b-256 checksum
How to use checksums
45c95e6c72413f2b13499a29bb312486e775452a197571ad8e8ba300ff682f1f
Upload date
Uploaded using Trusted Publishing?
What is 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}

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

1 release file

0.1.0

1 release file

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page