Source code for invenio_s3.ext

# -*- coding: utf-8 -*-
#
# Copyright (C) 2018, 2019 Esteban J. G. Gabancho.
#
# Invenio-S3 is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""S3 file storage support for Invenio."""

from __future__ import absolute_import, print_function

import warnings

import boto3
from flask import current_app
from werkzeug.utils import cached_property

from . import config


[docs]class InvenioS3(object): """Invenio-S3 extension.""" def __init__(self, app=None): """Extension initialization.""" if app: self.init_app(app)
[docs] @cached_property def init_s3fs_info(self): """Gather all the information needed to start the S3FSFileSystem.""" if 'S3_ACCCESS_KEY_ID' in current_app.config: current_app.config['S3_ACCESS_KEY_ID'] = current_app.config[ 'S3_ACCCESS_KEY_ID'] warnings.warn( 'Key S3_ACCCESS_KEY_ID contained a typo and has been ' 'corrected to S3_ACCESS_KEY_ID, support for the ' 'flawed version will be removed.', DeprecationWarning ) if 'S3_SECRECT_ACCESS_KEY' in current_app.config: current_app.config['S3_SECRET_ACCESS_KEY'] = current_app.config[ 'S3_SECRECT_ACCESS_KEY'] warnings.warn( 'Key S3_SECRECT_ACCESS_KEY contained a typo and has been ' 'corrected to S3_SECRET_ACCESS_KEY, support for the ' 'flawed version will be removed.', DeprecationWarning ) info = dict( key=current_app.config.get('S3_ACCESS_KEY_ID', ''), secret=current_app.config.get('S3_SECRET_ACCESS_KEY', ''), client_kwargs={}, config_kwargs={ 's3': { 'addressing_style': 'path', }, 'signature_version': current_app.config.get( 'S3_SIGNATURE_VERSION', 's3v4' ), }, ) s3_endpoint = current_app.config.get('S3_ENDPOINT_URL', None) if s3_endpoint: info['client_kwargs']['endpoint_url'] = s3_endpoint region_name = current_app.config.get('S3_REGION_NAME', None) if region_name: info['client_kwargs']['region_name'] = region_name return info
[docs] def init_app(self, app): """Flask application initialization.""" self.init_config(app) app.extensions['invenio-s3'] = self
[docs] def init_config(self, app): """Initialize configuration.""" for k in dir(config): if k.startswith('S3_'): app.config.setdefault(k, getattr(config, k))