OFS is a bucket/object storage library.
It provides a common API for storing bitstreams (plus related metadata) in ‘bucket/object’ stores such as:
S3, Google Storage, Eucalytus, Archive.org
Filesystem (via pairtree)
‘REST’ Store (see remote/reststore.py - implementation at http://bitbucket.org/pudo/repod/)
Riak (buggy)
add a backend here - just implement the methods in base.py
Why use the library:
Abstraction: write common code but use different storage backends
More than a filesystem, less than a database - support for metadata as well as bitstreams
Requirements
For all boto-based stores (Google Storage, S3 etc) require boto>=2.0.
Example Usage
(local version - depends on ‘pairtree’, and ‘simplejson’):
>>> from ofs.local import PTOFS
>>> o = PTOFS()
(Equivalent to 'o = PTOFS(storage_dir = "data", uri_base="urn:uuid:", hashing_type="md5")')
# Claim a bucket - this will add the bucket to the list of existing ones
>>> uuid_id = o.claim_bucket()
>>> uuid_id
'4aaa43cdf5ba44e2ad25acdbd1cf2f70'
# Choose a bucket name - if it exists, a new UUID one will be formed instead and returned
>>> bucket_id = o.claim_bucket("foo")
>>> bucket_id
'foo'
>>> bucket_id = o.claim_bucket("foo")
>>> bucket_id
'1bf93208521545879e79c13614cd12f0'
# Store a file:
>>> o.put_stream(bucket_id, "foo.txt", open("foo....))
{'_label': 'foo.txt', '_content_length': 10, '_checksum': 'md5:10feda25f8da2e2ebfbe646eea351224', '_last_modified': '2010-08-02T11:37:21', '_creation_date': '2010-08-02T11:37:21'}
# or:
>>> o.put_stream(bucket_id, "foo.txt", "asidaisdiasjdiajsidjasidji")
{'_label': 'foo.txt', '_content_length': 10, '_checksum': 'md5:10feda25f8da2e2ebfbe646eea351224', '_last_modified': '2010-08-02T11:37:21', '_creation_date': '2010-08-02T11:37:21'}
# adding a file with some parameters:
>>> o.put_stream(bucket_id, "foooo", "asidaisdiasjdiajsidjasidji", params={"original_uri":"http://...."})
{'_label': 'foooo', 'original_uri': 'http://....', '_last_modified': '2010-08-02T11:39:11', '_checksum': 'md5:3d690d7e0f4479c5a7038b8a4572d0fe', '_creation_date': '2010-08-02T11:39:11', '_content_length': 26}
# Get the underlying URL pointing to a resource
>>> o.get_url(bucket_id, "foo")
[typical local pairtree response:]
"file:///opt/ofs_store/pairtree_root/1b/f9/32/......./obj/foo"
[typical remote response]
"http://..."
"ftp://..."
# adding to existing metadata:
>>> o.update_metadata(bucket_id, "foooo", {'foo':'bar'})
{'_label': 'foooo', 'original_uri': 'http://....', '_last_modified': '2010-08-02T11:39:11', '_checksum': 'md5:3d690d7e0f4479c5a7038b8a4572d0fe', '_creation_date': '2010-08-02T11:39:11', '_content_length': 26, 'foo': 'bar'}
# Remove keys
>>> o.remove_metadata_keys(bucket_id, "foooo", ['foo'])
{'_label': 'foooo', 'original_uri': 'http://....', '_last_modified': '2010-08-02T11:39:11', '_checksum': 'md5:3d690d7e0f4479c5a7038b8a4572d0fe', '_creation_date': '2010-08-02T11:39:11', '_content_length': 26}
# Delete blob
>>> o.exists(bucket_id, "foooo")
True
>>> o.del_stream(bucket_id, "foooo")
>>> o.exists(bucket_id, "foooo")
False
# Iterate through ids for buckets held:
>>> for item in o.list_buckets():
... print(item)
...
447536aa0f1b411089d12399738ede8e
4a726b0a33974480a2a26d34fa0d494d
4aaa43cdf5ba44e2ad25acdbd1cf2f70
.... etc
# Display the labels in a specific bucket:
>>>o.list_labels("1bf93208521545879e79c13614cd12f0")
[u'foo.txt']
Developer
Tests use plain unittest but recommend using nose.
To run the botostore tests you’ll need to copy test.ini.tmpl to test.ini and put in details for a google storage account.
Changelog
v0.4.1: 2011-08-13
Set checksum (md5) based on etag (botostore backends) if not set
v0.4: 2011-04-28
New authenticate_request method for boto based backends.
Improved update_medata in botostore (no need to download and re-upload).
v0.3: 2011-01-20
S3Bounce backend (use authorization credentials from CKAN).
Use setuptools plugins with ofs.backend to allow for 3rd party backends
ofs_upload command
v0.2: 2010-11-20
Google Storage support.
REST store
v0.1: 2010-10-14
Initial implemenation with PairTree and S3
Metadata
Release files for ofs 0.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ofs-0.4.3.tar.gz | 153.6 kB | Without provenance | Details for ofs-0.4.3.tar.gz |
Release files / ofs-0.4.3.tar.gz
| Download URL | ofs-0.4.3.tar.gz |
|---|---|
| Size | 153.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
aa57c237a0b3af44e988a4dbc8d504610c86851303338708eb39ff32766281f0
|
|
BLAKE2b-256 checksum How to use checksums |
5990d7b380d3c7098a3e6df8b95c679bd8a89bd92d6617d7740c0f03faaf4c85
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for ofs 0.4.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.