Python library for uploading files to R2 and registering them with the r2index API
Project description
elaunira-r2index
Python library for uploading and downloading files to/from Cloudflare R2 with the r2index API.
Installation
pip install elaunira-r2index
Usage
Sync Client
from elaunira.r2index import R2IndexClient
client = R2IndexClient(
index_api_url="https://r2index.example.com",
index_api_token="your-bearer-token",
r2_access_key_id="your-r2-access-key-id",
r2_secret_access_key="your-r2-secret-access-key",
r2_endpoint_url="https://your-account-id.r2.cloudflarestorage.com",
)
# Upload and register a file
record = client.upload(
bucket="my-bucket",
local_path="./myfile.zip",
category="software",
entity="myapp",
extension="zip",
media_type="application/zip",
remote_path="/releases/myapp",
remote_filename="myapp.zip",
remote_version="v1",
tags=["release", "stable"],
)
# Download a file and record the download
# IP address is auto-detected, user agent defaults to "elaunira-r2index/<version>"
path, record = client.download(
bucket="my-bucket",
object_id="/releases/myapp/v1/myapp.zip",
destination="./downloads/myfile.zip",
)
Async Client
from elaunira.r2index import AsyncR2IndexClient
async with AsyncR2IndexClient(
index_api_url="https://r2index.example.com",
index_api_token="your-bearer-token",
r2_access_key_id="your-r2-access-key-id",
r2_secret_access_key="your-r2-secret-access-key",
r2_endpoint_url="https://your-account-id.r2.cloudflarestorage.com",
) as client:
# Upload
record = await client.upload(
bucket="my-bucket",
local_path="./myfile.zip",
category="software",
entity="myapp",
extension="zip",
media_type="application/zip",
remote_path="/releases/myapp",
remote_filename="myapp.zip",
remote_version="v1",
tags=["release", "stable"],
)
# Download
path, record = await client.download(
bucket="my-bucket",
object_id="/releases/myapp/v1/myapp.zip",
destination="./downloads/myfile.zip",
)
Transfer Configuration
Control multipart transfer settings with R2TransferConfig:
from elaunira.r2index import R2IndexClient, R2TransferConfig
client = R2IndexClient(
index_api_url="https://r2index.example.com",
index_api_token="your-bearer-token",
r2_access_key_id="your-r2-access-key-id",
r2_secret_access_key="your-r2-secret-access-key",
r2_endpoint_url="https://your-account-id.r2.cloudflarestorage.com",
)
# Custom transfer settings
transfer_config = R2TransferConfig(
multipart_threshold=100 * 1024 * 1024, # 100MB (default)
multipart_chunksize=32 * 1024 * 1024, # 32MB chunks
max_concurrency=64, # 64 parallel threads
use_threads=True, # Enable threading (default)
)
path, record = client.download(
bucket="my-bucket",
object_id="/data/files/v2/largefile.zip",
destination="./downloads/largefile.zip",
transfer_config=transfer_config,
)
Default max_concurrency is 2x the number of CPU cores (minimum 4).
Progress Tracking
def on_progress(bytes_transferred: int) -> None:
print(f"Downloaded: {bytes_transferred / 1024 / 1024:.1f} MB")
path, record = client.download(
bucket="my-bucket",
object_id="/releases/myapp/v1/myapp.zip",
destination="./downloads/myfile.zip",
progress_callback=on_progress,
)
Deleting Files
# Delete from R2 storage
client.delete_from_r2(
bucket="my-bucket",
object_id="/releases/myapp/v1/myapp.zip",
)
# Delete from index (metadata only)
client.delete(file_id)
# Or delete by remote tuple
client.delete_by_tuple(RemoteTuple(
bucket="my-bucket",
remote_path="/releases/myapp",
remote_filename="myapp.zip",
remote_version="v1",
))
License
MIT
Project details
Release history Release notifications | RSS feed
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 elaunira_r2index-0.5.0.tar.gz.
File metadata
- Download URL: elaunira_r2index-0.5.0.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f5149c657b68e2f16857995cf238c2dc927d58ee4702b93a6b631b0cbff257a
|
|
| MD5 |
b282ba8941fdb6bbb789def642efc2b3
|
|
| BLAKE2b-256 |
ab716214c18aa083a53121719592959900bfb1a406006635392b5102a37bbd39
|
File details
Details for the file elaunira_r2index-0.5.0-py3-none-any.whl.
File metadata
- Download URL: elaunira_r2index-0.5.0-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
295d9daba755135c3049f13679eda5f1d2f86206df73148c847f50be6f151183
|
|
| MD5 |
6393a5a6e4ba83bf73cf4c872f21e72c
|
|
| BLAKE2b-256 |
87295be39b20252454a340fb4d4b0c5a6ba08d086b85cd542644130e4910ba56
|