Skip to main content

A library that offers a simple method of loading and accessing environmental variables and `.env` file values.

Project description

secretbox

Code style: black pre-commit pre-commit.ci status Python Tests

A library that offers a simple method of loading and accessing environmental variables, .env file values, and other sources of secrets. The class stores values to state when load methods are called.

Loaded values are also injected into the local environ. This is to assist with adjacent libraries that reference os.environ values by default. Required values can be kept in a .env file instead of managing a script to load them into the environment.

Requirements

  • Python >= 3.6 <= 3.9

Optional Dependencies

  • boto3
  • boto3-stubs[secretsmanager]

Install

$ pip install secretbox

Optional AWS Secret Manager support

$ pip install secretbox[aws]

Example use with auto_load

import sys

from secretbox import SecretBox

secrets = SecretBox(auto_load=True)


def main() -> int:
    """Main function"""
    my_sevice_password = secrets.get("SERVICE_PW")
    # More code

    return 0


if __name__ == "__main__":
    sys.exit(main())

Default Behavior:

  • On initialization the SecretBox() class does nothing. By calling .load() we cause the class to load all the currently available environ variables. It also looks for and loads, if found, a .env file in the working directory. From there we can access those values with .get("KEY_NAME").

SecretBox arguments:

SecretBox(filename: str = ".env", aws_sstore_name: Optional[str] = None, aws_region: Optional[str] = None, auto_load: bool = False)

filename

  • You can specify a .env formatted file and location, overriding the default behavior to load the .env from the working directory

aws_sstore_name

  • When provided, an attempt to load values from named AWS secrets manager will be made. Requires aws_region to be provided. Requires boto3 and boto3-stubs[secretsmanager] to be installed
  • Note: Can be provided with the AWS_SSTORE_NAME environment variable.

aws_region_name

  • When provided, an attempt to load values from the given AWS secrets manager found in this region will be made. Requires aws_sstore_name to be provided. Requires boto3 and boto3-stubs[secretsmanager] to be installed
  • Note: Can be provided with the AWS_REGION_NAME environment variable.

auto_load

  • If true, the load() method will be auto-exectued on initialization

Load Order

Secret values are loaded, and over-written if pre-existing, in the following order:

  1. Local environment variables
  2. .env file
  3. AWS secret store [optional]

SecretBox methods:

.get(["Key Name"], ("default"))

  • Returns the string value of the loaded value by key name. If the key does not exist, an empty string will be returned "" or the provided optional default value.
  • Note: This method pulls from the instance's state and does not reflect changes to the environment before/after loading.

.load()

  • Runs all importer methods. If optional dependencies are not installed, e.g. boto3, the importer is skipped.

.load_env_vars()

  • Loads all existing os.environ values into state.

.load_env_file()

  • Loads .env file or any file provided with the filename argument on initialization.

.load_aws_store()

  • Loads secrets from AWS secret manager. Requires aws_sstore_name and aws_region to have been provided. Will raise NotImplementedError if library requirements are missing.

.env file format

Current format for the .env file supports strings only and is parsed in the following order:

  • Each seperate line is considered a new possible key/value set
  • Each set is delimted by the first = found
  • Leading and trailing whitespace are removed
  • Matched leading/trailing single quotes or double quotes will be stripped from values (not keys).

I'm open to suggestions on standards to follow here.

This .env example:

# Comments are ignored

KEY=value

Invalid lines without the equal sign delimiter will also be ignored

Will be parsed as:

{"KEY": "value"}

This .env example:

PASSWORD = correct horse battery staple
USER_NAME="not_admin"

MESSAGE = '    Totally not an "admin" account logging in'

Will be parsed as:

{
    "PASSWORD": "correct horse battery staple",
    "USER_NAME": "not_admin",
    "MESSAGE": '    Toally not an "admin" account logging in',
}

Local developer installation

It is highly recommended to use a venv for installation. Leveraging a venv will ensure the installed dependency files will not impact other python projects.

Clone this repo and enter root directory of repo:

$ git clone https://github.com/Preocts/secretbox
$ cd secretbox

Create and activate venv:

# Linux/MacOS
python3 -m venv venv
. venv/bin/activate

# Windows
python -m venv venv
venv\Scripts\activate.bat
# or
py -m venv venv
venv\Scripts\activate.bat

Your command prompt should now have a (venv) prefix on it.

Install editable library and development requirements:

# Linux/MacOS
pip install -r requirements-dev.txt
pip install --editable .[aws,tests]

# Windows
python -m pip install -r requirements-dev.txt
python -m pip install --editable .[aws,test]
# or
py -m pip install -r requirements-dev.txt
py -m pip install --editable .[aws,test]

Install pre-commit hooks to local repo:

pre-commit install
pre-commit autoupdate

Run tests

tox

To exit the venv:

deactivate

Makefile

This repo has a Makefile with some quality of life scripts if your system supports make.

  • install : Clean all artifacts, update pip, install requirements with no updates
  • update : Clean all artifacts, update pip, update requirements, install everything
  • clean-pyc : Deletes python/mypy artifacts
  • clean-tests : Deletes tox, coverage, and pytest artifacts
  • build-dist : Build source distribution and wheel distribution

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

secretbox-1.4.0.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

secretbox-1.4.0-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file secretbox-1.4.0.tar.gz.

File metadata

  • Download URL: secretbox-1.4.0.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10

File hashes

Hashes for secretbox-1.4.0.tar.gz
Algorithm Hash digest
SHA256 84ce11b6588aa4999cd24213b3cfa43dca551600dd53fb1e81ed0e4967d7a312
MD5 2d11d3a5f564135bf9af2cd33a2c07e7
BLAKE2b-256 53d0e0f7da18a679f30e2ee57731467d3ff33ff845997aa1af783eec53937edf

See more details on using hashes here.

File details

Details for the file secretbox-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: secretbox-1.4.0-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10

File hashes

Hashes for secretbox-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2093c69516b1b360609ad526d285d8d177ab5904f2620982f307b3f5374cb7ff
MD5 33dcfbbe605eabe7deb7907cc47e313d
BLAKE2b-256 738099c6c9041d14c959c0e41e624cee71249526cb78e6a1b90bbb1918e49431

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