Abstraction level for object storages.
Project description
file-keeper
Abstraction layer for reading, writing and managing file-like objects.
The package implements drivers for a number of storage types(local filesystem, redis, AWS S3, etc.) and defines a set of tools to simplify building your own drivers for storage you are using.
Read the documentation for a full user guide.
Features
- Unified API: Consistent interface across multiple storage backends
- Multiple Storage Backends: Support for file system, memory, S3, GCS, Azure, Redis, and more
- Type Safety: Comprehensive type annotations for better development experience
- Security: Built-in protection against directory traversal and other attacks
- Extensible: Plugin architecture for adding custom storage adapters
- Comprehensive Testing: Extensive test coverage with security-focused tests
API Overview
Creating Storage
Use make_storage() to create storage instances:
import file_keeper as fk
# Create memory storage for testing
storage = fk.make_storage("sandbox", {"type": "file_keeper:memory"})
# Create filesystem storage
storage = fk.make_storage("fs", {
"type": "file_keeper:fs",
"path": "/path/to/files",
"initialize": True
})
File Operations
# Upload a file
upload = fk.make_upload(b"file content")
result = storage.upload("filename.txt", upload)
# Read file content
content = storage.content(result)
# Check if file exists
exists = storage.exists(result)
# Remove file
removed = storage.remove(result)
Key Functions
make_storage(name, settings): Create a storage instancemake_upload(data): Create an upload object from dataget_storage(name, settings=None): Get or create a named storage instance from the pool
Usage
Initialize storage pointing to /tmp/example folder:
import os
from file_keeper import make_storage
storage = make_storage("sandbox", {
"type": "file_keeper:fs",
"path": "/tmp/example",
# this option creates the folder if it does not exist.
# Without it storage raises an error if folder is missing
"initialize": True,
})
assert os.path.isdir("/tmp/example")
Upload file into the storage initialized in the previous step and play with it a bit:
from file_keeper import make_upload
upload = make_upload(b"hello world")
# save the data and verify its presence in the system
result = storage.upload("hello.txt", upload)
assert result.size == 11
assert os.path.isfile("/tmp/example/hello.txt")
# change location of the file
moved_result = storage.move("moved-hello.txt", result, storage)
assert not os.path.exists("/tmp/example/hello.txt")
assert os.path.isfile("/tmp/example/moved-hello.txt")
# read the file
assert storage.content(moved_result) == b"hello world"
# remove the file
storage.remove(moved_result)
assert not os.path.exists("/tmp/example/moved-hello.txt")
Development
Install dev extras:
pip install -e '.[dev]'
Run unittests:
pytest
Run typecheck:
pyright
License
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 file_keeper-0.1.0.tar.gz.
File metadata
- Download URL: file_keeper-0.1.0.tar.gz
- Upload date:
- Size: 53.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f209e4b95d40e892158c1889b2b1f944b77bb884beb48cb72699b68e655c17c
|
|
| MD5 |
0f0dd0c4b1b10ca1281ca102562eab89
|
|
| BLAKE2b-256 |
cb1b5a486acec39c57d35af67ca5da221898e0e10959316cc4532ffd1d9365e7
|
File details
Details for the file file_keeper-0.1.0-py3-none-any.whl.
File metadata
- Download URL: file_keeper-0.1.0-py3-none-any.whl
- Upload date:
- Size: 68.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67eaf0d1acd8a2a360253bbc406e55e6742336655629a95efc188d0dc6eea2fb
|
|
| MD5 |
0e6d4efe276031ef03fe519f34fe84ad
|
|
| BLAKE2b-256 |
07413677a4df0861d65f76511c4f79179fc96a113e68d243e9d92125f974986f
|