-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
45 changed files
with
1,703 additions
and
1,147 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
# This workflow will install Python dependencies, run S3 tests with a variety of Python versions | ||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | ||
|
||
name: pytest-s3 | ||
|
||
on: | ||
pull_request: | ||
branches: [master] | ||
push: | ||
branches: [master] | ||
|
||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
strategy: | ||
matrix: | ||
python-version: [3.6, 3.7, 3.8, 3.9] | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: Set up Python ${{ matrix.python-version }} | ||
uses: actions/setup-python@v2 | ||
with: | ||
python-version: ${{ matrix.python-version }} | ||
|
||
- name: Install dependencies | ||
run: | | ||
python -m pip install --upgrade pip | ||
pip install -e . | ||
pip install -r DEV_REQUIREMENTS.txt | ||
pip install -r S3_REQUIREMENTS.txt | ||
- name: Test with pytest | ||
run: | | ||
pytest tests/s3 --cov=spock --cov-config=.coveragerc --junitxml=junit/test-results-${{ matrix.python-version }}.xml --cov-report=xml --cov-report=html | ||
- name: Upload pytest test results | ||
uses: actions/upload-artifact@v2 | ||
with: | ||
name: pytest-results-${{ matrix.python-version }} | ||
path: junit/test-results-${{ matrix.python-version }}.xml | ||
# Use always() to always run this step to publish test results when there are test failures | ||
if: ${{ always() }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
-r REQUIREMENTS.txt | ||
coveralls | ||
coverage | ||
moto | ||
portray | ||
pytest | ||
pytest-cov | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
boto3 | ||
botocore | ||
hurry.filesize | ||
s3transfer |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
# S3 Support | ||
|
||
When installed with the S3 addon `spock` will attempt to identify S3 URI(s) (e.g. `s3://<bucket-name>/<key>`) and handle | ||
them automatically. The user only needs to provide an active `boto3.session.Session` to an `S3Config` object and pass | ||
it to the `ConfigArgBuilder`. | ||
|
||
|
||
### Installing | ||
|
||
Install `spock` with the extra s3 related dependencies. | ||
|
||
```bash | ||
pip install spock-config[s3] | ||
``` | ||
|
||
### Creating a boto3 Session | ||
|
||
The user must provide an active `boto3.session.Session` object to `spock` in order for the library to automatically | ||
handle S3 URI(s). Configuration is **highly dependent** upon your current AWS setup/security. Please refer to the | ||
`boto3` docs for [session](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html) and | ||
[credentials](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) for help on how to | ||
correctly configure your `boto3.session.Session`. | ||
|
||
For instance, let's just suppose we are going to get our tokens via SAML authorization | ||
where we already have the SAMLAssertion, RoleArn, and PrincipalArn stored as env variables: | ||
|
||
```python | ||
import boto3 | ||
import os | ||
|
||
client = boto3.client('sts') | ||
|
||
token = client.assume_role_with_saml( | ||
RoleArn=os.environ.get("RoleArn"), PrincipalArn=os.environ.get("PrincipalArn"), | ||
SAMLAssertion=os.environ.get("SamlString") | ||
) | ||
|
||
credentials = token['Credentials'] | ||
|
||
session = boto3.Session( | ||
aws_access_key_id=credentials['AccessKeyId'], | ||
aws_secret_access_key=credentials['SecretAccessKey'], | ||
aws_session_token=credentials['SessionToken'], | ||
region_name=os.environ.get('AWS_REGION')) | ||
``` | ||
|
||
### Using the S3Config Object | ||
|
||
As an example let's create a basic `@spock` decorated class, instantiate a `S3Config` object from `spock.addons` with | ||
the `boto3.session.Session` we created above, and pass it to the `ConfigArgBuilder`. | ||
|
||
```python | ||
from spock.addons import S3Config | ||
from spock.builder import ConfigArgBuilder | ||
from spock.config import spock | ||
from typing import List | ||
|
||
@spock | ||
class BasicConfig: | ||
"""Basic spock configuration for example purposes | ||
Attributes: | ||
parameter: simple boolean that flags rounding | ||
fancy_parameter: parameter that multiplies a value | ||
fancier_parameter: parameter that gets added to product of val and fancy_parameter | ||
most_fancy_parameter: values to apply basic algebra to | ||
""" | ||
parameter: bool | ||
fancy_parameter: float | ||
fancier_parameter: float | ||
most_fancy_parameter: List[int] | ||
|
||
def main(): | ||
# Create an S3Config object and pass in the boto3 session | ||
s3_config = S3Config( | ||
session=session | ||
) | ||
# Chain the generate function to the ConfigArgBuilder call | ||
# Pass in the S3Config object | ||
config = ConfigArgBuilder( | ||
BasicConfig, | ||
desc='S3 example', | ||
s3_config=s3_config | ||
).generate() | ||
``` | ||
|
||
### Defining the configuration file with a S3 URI | ||
|
||
Usually we pass a relative or absolute system path as the configuration file command line argument. Here we pass | ||
in a S3 URI instead: | ||
|
||
```bash | ||
$ python simple.py -c s3://my-bucket/path/to/file/config.yaml | ||
``` | ||
|
||
With a `S3Config` object passed into the `ConfigArgBuilder` the S3 URI will automatically be handled by `spock`. | ||
|
||
### Saving to a S3 URI | ||
|
||
Similarly, we usually pass a relative or absolute system path to the `SavePath` special argument type or | ||
to the `user_specified_path` kwarg. Again, instead we give a S3 URI: | ||
|
||
```python | ||
def main(): | ||
# Create an S3Config object and pass in the boto3 session | ||
s3_config = S3Config( | ||
session=session | ||
) | ||
# Chain the generate function to the ConfigArgBuilder call | ||
# Pass in the S3Config object | ||
config = ConfigArgBuilder( | ||
BasicConfig, | ||
desc='S3 example', | ||
s3_config=s3_config | ||
).save(user_specified_path="s3://my-bucket/path/to/file/").generate() | ||
``` | ||
|
||
With a `S3Config` object passed into the `ConfigArgBuilder` the S3 URI will automatically be handled by `spock`. | ||
|
||
### S3Transfer ExtraArgs | ||
|
||
If you require any other settings for uploading or downloading files from S3 the `S3Config` class has two extra | ||
attributes: | ||
|
||
`download_config` which takes a `S3DownloadConfig` object from `spock.addons` which supports all ExtraArgs from | ||
[S3Transfer.ALLOWED_DOWNLOAD_ARGS](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/s3.html#boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS) | ||
|
||
`upload_config` which takes a `S3UploadConfig` object from `spock.addons` which supports all ExtraArgs from | ||
[S3Transfer.ALLOWED_UPLOAD_ARGS](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/s3.html#boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
# Copyright 2019 FMR LLC <opensource@fidelity.com> | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
""" | ||
Spock is a framework that helps manage complex parameter configurations for Python applications | ||
Please refer to the documentation provided in the README.md | ||
""" | ||
from spock.addons.s3.utils import S3Config | ||
from spock.addons.s3.configs import S3DownloadConfig | ||
from spock.addons.s3.configs import S3UploadConfig | ||
|
||
__all__ = ["s3", "S3Config", "S3DownloadConfig", "S3UploadConfig"] |
Oops, something went wrong.