CenterForOpenScience/waterbutler

View on GitHub
waterbutler/providers/s3/metadata.py

Summary

Maintainability
A
2 hrs
Test Coverage
import os

from waterbutler.core import metadata


def strip_char(str, chars):
    if str.startswith(chars):
        return str[len(chars):]
    return str


class S3Metadata(metadata.BaseMetadata):

    @property
    def provider(self):
        return 's3'

    @property
    def name(self):
        return os.path.split(self.path)[1]


class S3FileMetadataHeaders(S3Metadata, metadata.BaseFileMetadata):

    def __init__(self, path, headers):
        self._path = path
        # Cast to dict to clone as the headers will
        # be destroyed when the request leaves scope
        super().__init__(dict(headers))

    @property
    def path(self):
        return '/' + strip_char(self._path, self.raw.get('base_folder', ''))

    @property
    def size(self):
        return self.raw['Content-Length']

    @property
    def content_type(self):
        return self.raw['Content-Type']

    @property
    def modified(self):
        return self.raw['Last-Modified']

    @property
    def created_utc(self):
        return None

    @property
    def etag(self):
        return self.raw['Etag'].replace('"', '')

    @property
    def extra(self):
        md5 = self.raw['Etag'].replace('"', '')
        return {
            'md5': md5,
            'encryption': self.raw.get('x-amz-server-side-encryption', ''),
            'hashes': {
                'md5': md5,
            },
        }


class S3FileMetadata(S3Metadata, metadata.BaseFileMetadata):

    @property
    def path(self):
        return '/' + strip_char(self.raw['Key'], self.raw.get('base_folder', ''))

    @property
    def size(self):
        return int(self.raw['Size'])

    @property
    def modified(self):
        return self.raw['LastModified']

    @property
    def created_utc(self):
        return None

    @property
    def content_type(self):
        return None  # TODO

    @property
    def etag(self):
        return self.raw['ETag'].replace('"', '')

    @property
    def extra(self):
        md5 = self.raw['ETag'].replace('"', '')
        return {
            'md5': md5,
            'hashes': {
                'md5': md5,
            },
        }


class S3FolderKeyMetadata(S3Metadata, metadata.BaseFolderMetadata):

    @property
    def name(self):
        return self.raw['Key'].split('/')[-2]

    @property
    def path(self):
        return '/' + strip_char(self.raw['Key'], self.raw.get('base_folder', ''))


class S3FolderMetadata(S3Metadata, metadata.BaseFolderMetadata):

    @property
    def name(self):
        return self.raw['Prefix'].split('/')[-2]

    @property
    def path(self):
        if self.raw.get('base_folder', ''):
            return '/' + strip_char(self.raw['Prefix'], self.raw.get('base_folder', ''))
        return '/' + self.raw['Prefix']


# TODO dates!
class S3Revision(metadata.BaseFileRevisionMetadata):

    @property
    def version_identifier(self):
        return 'version'

    @property
    def version(self):
        if self.raw['IsLatest'] == 'true':
            return 'Latest'
        return self.raw['VersionId']

    @property
    def modified(self):
        return self.raw['LastModified']

    @property
    def extra(self):
        return {
            'md5': self.raw['ETag'].replace('"', '')
        }