Skip to main content

Build Status

stor provides a cross-compatible CLI and Python API for accessing block and object storage. stor was created so you could write one piece of code to work with local or remote files, without needing to write specialized code to handle failure modes, retrying or temporarily system unavailability. The functional API (i.e., stor.copytree, stor.rmtree, stor.remove, stor.listdir) will work with the same semantics across all storage backends. This makes it really easy to develop/test code locally with files and then take advantage of robust and cheaper object storage when you push to remote.

View full docs for stor at https://counsyl.github.io/stor/ .

Quickstart

pip install stor

stor provides both a CLI and a Python library for manipulating Posix and OBS with a single, cross-compatible API.

Quickstart - CLI

usage: stor [-h] [-c CONFIG_FILE] [--version]
            {list,ls,cp,rm,walkfiles,cat,cd,pwd,clear,url,convert-swiftstack}
            ...

A command line interface for stor.

positional arguments:
  {list,ls,cp,rm,walkfiles,cat,cd,pwd,clear,url,convert-swiftstack}
    list                List contents using the path as a prefix.
    ls                  List path as a directory.
    cp                  Copy a source to a destination path.
    rm                  Remove file at a path.
    walkfiles           List all files under a path that match an optional
                        pattern.
    cat                 Output file contents to stdout.
    cd                  Change directory to a given OBS path.
    pwd                 Get the present working directory of a service or all
                        current directories.
    clear               Clear current directories of a specified service.
    url                 generate URI for path
    convert-swiftstack  convert swiftstack paths

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_FILE, --config CONFIG_FILE
                        File containing configuration settings.
  --version             Print version

You can ls local and remote directories

›› stor ls s3://stor-test-bucket
s3://stor-test-bucket/b.txt
s3://stor-test-bucket/counsyl-storage-utils
s3://stor-test-bucket/file_test.txt
s3://stor-test-bucket/counsyl-storage-utils/
s3://stor-test-bucket/empty/
s3://stor-test-bucket/lots_of_files/
s3://stor-test-bucket/small_test/

Copy files locally or remotely or upload from stdin

›› echo "HELLO WORLD" | stor cp - swift://AUTH_stor_test/hello_world.txt
starting upload of 1 objects
upload complete - 1/1   0:00:00 0.00 MB 0.00 MB/s
›› stor cat swift://AUTH_stor_test/hello_world.txt
HELLO WORLD
›› stor cp swift://AUTH_stor_test/hello_world.txt hello_world.txt
›› stor cat hello_world.txt
HELLO WORLD

Quickstart - Python

List files in a directory, taking advantage of delimiters

>>> stor.listdir('s3://bestbucket')
[S3Path('s3://bestbucket/a/')
 S3Path('s3://bestbucket/b/')]

List all objects in a bucket

>>> stor.list('s3://bestbucket')
[S3Path('s3://bestbucket/a/1.txt')
 S3Path('s3://bestbucket/a/2.txt')
 S3Path('s3://bestbucket/a/3.txt')
 S3Path('s3://bestbucket/b/1.txt')]

Or in a local path

>>> stor.list('stor')
[PosixPath('stor/__init__.py'),
 PosixPath('stor/exceptions.pyc'),
 PosixPath('stor/tests/test_s3.py'),
 PosixPath('stor/tests/test_swift.py'),
 PosixPath('stor/tests/test_integration_swift.py'),
 PosixPath('stor/tests/test_utils.py'),
 PosixPath('stor/posix.pyc'),
 PosixPath('stor/base.py'),

Read and write files from POSIX or OBS, using python file objects.

import stor
with stor.open('/my/exciting.json') as fp:
    data1 = json.load(fp)

data1['read'] = True

with stor.open('s3://bestbucket/exciting.json') as fp:
    json.dump(data1, fp)

Testing code that uses stor

The key design consideration of stor is that your code should be able to transparently use POSIX or any object storage system to read and update files. So, rather than use mocks, we suggest that you structure your test code to point to local filesystem paths and restrict yourself to the functional API. E.g., in your prod settings, you could set DATADIR = 's3://bestbucketever'and when you test, you could use DATADIR = '/somewhat/cool/path/to/test/data', while your actual code just says:

with stor.open(stor.join(DATADIR, experiment)) as fp:
    data = json.load(fp)

Easy! and no mocks required!

Running the Tests

make test

Contributing and Semantic Versioning

We use semantic versioning to communicate when we make API changes to the library. See CONTRIBUTING.md for more details on contributing to stor.

Release files for stor 4.1.1

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

Source distribution (sdist)

Source distribution for stor 4.1.1
File Size Uploaded
stor-4.1.1.tar.gz 1.8 MB Details

Built distribution (wheel)

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

Total release size: 3.9 MB

Release files / stor-4.1.1.tar.gz

Download URL stor-4.1.1.tar.gz
Size 1.8 MB
Tags Source
SHA-256 checksum
How to use checksums
360d37e1f46ed8a6f0b27855b9ceaaf1ac899c0c1ab99e143648ec9c58246050
BLAKE2b-256 checksum
How to use checksums
3e84b04084338764472eaa97fb115211e1a2a8e918106fc8e348e46d080f948f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.2 CPython/3.6.15 Linux/3.13.0-170-generic

Release files / stor-4.1.1-py3-none-any.whl

Download URL stor-4.1.1-py3-none-any.whl
Size 2.1 MB
Tags Python 3
SHA-256 checksum
How to use checksums
6274fb14d7d31c43ae175e0483d1399316f8801dcfea6eb7b91e0f1db68ea835
BLAKE2b-256 checksum
How to use checksums
3590689835f6d25f249d093fbb0293315f702333f067197805cebf7d7ff4fb15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.2 CPython/3.6.15 Linux/3.13.0-170-generic

Release history Release notifications | RSS feed

This release

4.1.1 This release

2 release files

4.1.0

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

3.1.0

2 release files

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.4.6

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

1 release file

1.3.3

1 release file

1.3.2

1 release file

1.3.1

1 release file

1.3.0

1 release file

1.2.2

1 release file

1.2.1

1 release file

1.2.0

1 release file

1.1.2

3 release files

1.1.1

2 release files

1.1.0

2 release files

1.0

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