From 8a0e52c3a1c0c9ff4e5d0d191ab3b5cb03580a61 Mon Sep 17 00:00:00 2001 From: Isaac Tewolde Date: Wed, 2 Apr 2014 20:19:10 +0000 Subject: [PATCH 1/2] added versioning support. fixed default create bucket behaviour, now checks if bucket exists first --- s3file.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/s3file.py b/s3file.py index 890769d..a02e6ef 100644 --- a/s3file.py +++ b/s3file.py @@ -14,7 +14,7 @@ def s3open(*args, **kwargs): class S3File(object): - def __init__(self, url, key=None, secret=None, expiration_days=0, private=False, content_type=None, create=True): + def __init__(self, url, key=None, secret=None, expiration_days=0, private=False, content_type=None, create=True, versioning=False): from boto.s3.connection import S3Connection from boto.s3.key import Key @@ -36,15 +36,31 @@ def __init__(self, url, key=None, secret=None, expiration_days=0, private=False, self.name = "s3://" + bucket + self.url.path - if create: - self.bucket = self.client.create_bucket(bucket) - else: - self.bucket = self.client.get_bucket(bucket, validate=False) + self.bucket = self.client.lookup(bucket, validate=False) + if self.bucket is None: + if create: + self.bucket = self.client.create_bucket(bucket) + if versioning is True: + bucket.configure_versioning(True) + else: + raise Exception(self.bucket) self.key = Key(self.bucket) self.key.key = self.url.path.lstrip("/") + self.version_id = None self.buffer.truncate(0) + def get_versions(self): + return self.bucket.list_versions(prefix=self.key.key) + + def set_version(self, version_id): + self.version_id = version_id + self.buffer.truncate(0) + + @classmethod + def delete(cls, url, key, secret, all_versions = False): + pass + def __enter__(self): return self @@ -58,7 +74,7 @@ def _remote_read(self): if self._readreq: self.buffer.truncate(0) if self.key.exists(): - self.key.get_contents_to_file(self.buffer) + self.key.get_contents_to_file(self.buffer, version_id = self.version_id) self.buffer.seek(0) self._readreq = False @@ -81,7 +97,7 @@ def _remote_write(self): headers["Expires"] = then.strftime("%a, %d %b %Y %H:%M:%S GMT") headers["Cache-Control"] = 'max-age=%d' % (self.expiration_days * 24 * 3600,) - self.key.set_contents_from_file(self.buffer, headers=headers, rewind=True) + self.key.set_contents_from_file(self.buffer, headers=headers, rewind=True, version_id=self.version_id) def close(self): """ Close the file and write contents to S3. From 333e3574619db16d666c5d0ec0ca4f26308f26cc Mon Sep 17 00:00:00 2001 From: Isaac Tewolde Date: Wed, 2 Apr 2014 21:27:25 +0000 Subject: [PATCH 2/2] removed permission setting as this was casing a 403 error --- s3file.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/s3file.py b/s3file.py index a02e6ef..f165d09 100644 --- a/s3file.py +++ b/s3file.py @@ -84,9 +84,10 @@ def _remote_write(self): if self._writereq: self.truncate(self.tell()) - headers = { - "x-amz-acl": "private" if self.private else "public-read" - } + #headers = { + # "x-amz-acl": "private" if self.private else "public-read" + #} + headers = {} if self.content_type: headers["Content-Type"] = self.content_type @@ -96,8 +97,8 @@ def _remote_write(self): then = now + datetime.timedelta(self.expiration_days) headers["Expires"] = then.strftime("%a, %d %b %Y %H:%M:%S GMT") headers["Cache-Control"] = 'max-age=%d' % (self.expiration_days * 24 * 3600,) - - self.key.set_contents_from_file(self.buffer, headers=headers, rewind=True, version_id=self.version_id) + + self.key.set_contents_from_file(self.buffer, headers=headers, rewind=True) def close(self): """ Close the file and write contents to S3.