Skip to main content

Common library used alongside jsexton-portfolio chalice applications.

Project description

Pyocle

Socle - A plain low block or plinth serving as a support for a column, urn, statue, etc. or as the foundation of a wall.

Common library used alongside jsexton-portfolio chalice applications.

Responses

Portfolio APIs have a standard response structure they must follow. This library contains models and response builders to help remain consistent with these defined standards response models.

Models

Response Body

{
  "success": true,
  "meta": { },
  "data": { }
}

Response Meta Field

{
  "message": "Message depending on the type of response",
  "errorDetails": [],
  "paginationDetails": { },
  "schemas": { }
}

Building Responses

import pyocle

ok_response = pyocle.response.ok({'some': 'data'})
created_response = pyocle.response.created({'some': 'data'})

# In most cases, the error handler will handle these responses for you if you defined
# the pydantic models correctly and you are using form.resolve_form for all incoming data.
bad_response = pyocle.response.bad(error_details=[], schemas={})

internal_error_response = pyocle.response.internal_error()

Serialization Helpers

Camel Case Property Naming Convention

It is a portfolio API standard that all field names should be camel case when serialized to the response body. Pyocle offers a mixin to assist in this conversion.

from pyocle.serialization import CamelCaseAttributesMixin

class MyResponse(CamelCaseAttributesMixin):
    def __init__(self):
        self.snake_case_attribute = 'snake_case_attribute'

When using jsonpickle or any built in pyocle response builders, the resulting json will contain camel cased attrbiute names.

Error Handling

Pyocle comes with an error_handler decorator that can be used to decorate all endpoints that require error handling.

from chalice import Chalice
import pyocle

app = Chalice(app_name='my-portfolio-service')

@app.route('/')
@pyocle.response.error_handler
def some_portfolio_endpoint():
    pass

Resolving Forms

When resolving forms or incoming data with pyocle, use the resolve_form function. The function accepts the incoming data and a form object that inherits from pydantic's BaseModel to match against. If the incoming data complies with the specified form, the form object is returned. Make sure the form is a subclass of BaseModel, if not, an exception will be raised. Otherwise an exception is raised with information detailing what went wrong. These exceptions normally work very closely with pyocle's error_handler.

from chalice import Chalice
from pydantic import BaseModel
import pyocle

app = Chalice(app_name='my-portfolio-service')

class SomeForm(BaseModel):
    test_data: str

@app.route('/')
@pyocle.response.error_handler
def some_portfolio_endpoint():
    incoming_data = app.current_request.raw_body
    form = pyocle.form.resolve_form(incoming_data, SomeForm)

    ...

Common Services

Pyocle comes with a few common services used through out portfolio services out of the box.

Key Management Service

The KeyManagementService is used to interface with AWS KMS for encrypting and decrypting information. Most common use case is decrypting connection strings for databases.

Encrypt

from pyocle.service.kms import KeyManagementService, EncryptForm

kms = KeyManagementService()
form = EncryptForm(
    key_id='key id',
    plain_text='some cipher text'
)
kms_response = kms.encrypt(form)

Decrypt

from pyocle.service.kms import KeyManagementService, DecryptForm

kms = KeyManagementService()
form = DecryptForm(
    cipher_text_blob='some cipher text'
)
kms_response = kms.decrypt(form)

Simple Email Service

The SimpleEmailService is used to interface with AWS SES allowing consumers to send emails.

from pyocle.service.ses import SimpleEmailService, EmailForm

ses = SimpleEmailService()
form = EmailForm(
    source='the source of the email',
    to_addresses=['some', 'email', 'addresses'],
    subject='some subject line',
    text='some email message'
)
ses.send_email(form)

Simple Notification Service

The SimpleNotificationService is used to interface with AWS SNS allowing messages to be published to various topics.

from pyocle.service.sns import SimpleNotificationService, PublishMessageForm

sns = SimpleNotificationService()
form = PublishMessageForm(
    message='some message, can also be a dictionary and will be converted to json',
    topic_arn='topic arn'
)
sns.publish(form)

Configuration

Environment Variables

In order to safely retrieve an environment variable, make use of the env_var() function. A default value can be given and will be used if the given environment variable could not be found.

import pyocle

environment_variable = pyocle.config.env_var('some_env_var_name', default='found')

Encrypted Environment Variables

Sometimes environment variables are encrypted. Use the encrypted_env_var() function to retrieve these values in their plain text forms.

import pyocle

decrypted_environment_variable = pyocle.config.encrypted_env_var('some_env_var_name')

By default the function makes use of a kms decrypter. To specify a custom decrypter simply pass the decryption function as a decrypter and any additional values that may be need to decrypt to attrs

import pyocle

additional_info = {
    'password': 'password123'
}

def my_decrypter(value, **kwargs) -> str:
    """decrypt and return"""

decrypted_environment_variable = pyocle.config.encrypted_env_var('some_env_var_name', decrypter=my_decrypter, attrs=additional_info)

Connection Strings

Connection strings should be encrypted with KMS and stored in the correct chalice stage environment variables as 'CONNECTION_STING'. When retrieving these values, make use of the connection_string() function. connection_string() will retrieve the environment connection string and decrypt using KMS while only returning the actual usable connection string.

import pyocle

connection_string = pyocle.config.connection_string()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyocle-0.4.0.tar.gz (16.7 kB view details)

Uploaded Source

Built Distribution

pyocle-0.4.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file pyocle-0.4.0.tar.gz.

File metadata

  • Download URL: pyocle-0.4.0.tar.gz
  • Upload date:
  • Size: 16.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.2

File hashes

Hashes for pyocle-0.4.0.tar.gz
Algorithm Hash digest
SHA256 073284361652746e1d62565fd15e94336dc8c6d34176db5862b25978e89f814a
MD5 1aa7f2623b7c7b3545ce345a7accde6b
BLAKE2b-256 50d1d0fe9c1572c294cabc4b8e3a91690eac5ee8691c9ac1d0f4839696b99555

See more details on using hashes here.

File details

Details for the file pyocle-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: pyocle-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.2

File hashes

Hashes for pyocle-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 66953ec2674d8d7c1a7306b627e71f2672cee8d042b1de89d422a90a8f80a061
MD5 0790c3c83c8c7e40468867c3e69e65d7
BLAKE2b-256 582ad84a0400d86b04e65930f3fb61fe6fb669a9652286a3ffd4fd976361d049

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page