poetry
Easily manage your application settings and secrets
Welcome to Stela
Stela were the "information
files" of ancient times. This library aims to simplify your project
configurations, proposing an opinionated way to manage your project
using dotenv files, or using any source you need.
Install
$ pip install stela
Documentation
Key features:
- Learn once, use everywhere. Stela aims to be easily used in any Python project or Framework.
- Separate settings from secrets from environments. Instead of using a single dotenv file to store all your settings,
we use multiple dotenv files, one for each environment. This way, you can split secrets from settings, and you can
have different values for the same setting in different environments.
- Easy to implement. Use the command
stela init
to initialize your project and configure .env
and .gitignore
files. - Easy to use. To access you configuration just include
from stela import env
in your code. Simple as that. - One Interface, Any Source. You're not limited to dotenv files. Create your custom logic to import data from any
source you need.
Quick Start
Run Stela initialization command. This command will create .env
, .env.local
, .stela
and .gitignore
files.
$ stela init --default
Create the dotenv files and add your settings and secrets.
# Add project settings and fake project secrets to .env
# This file will be commited to your repository
API_URL="http://localhost:8000"
DB_URL="db://fake_user:fake_password@local_db:0000/name"
from stela import env
API_URL = env.API_URL
DATABASE_URL_CONNECTION = env.DB_URL
# Add real secrets to .env.local
# This file will be ignored by git
DB_URL="db://real_user:real_password@real_db:0000/name"
A single, simple API to access your settings and secrets:
from stela import env
API_URL = env.API_URL
DATABASE_URL_CONNECTION = env.DB_URL
Custom Sources
Use a custom, optional, final loader function to load your settings from any source you need.
[stela]
final_loader = "path.to.my.final_loader"
import boto3
from stela.config import StelaOptions
def final_loader(options: StelaOptions, env_data: dict[str, any]) -> dict[str, any]:
"""Load settings from AWS Parameter Store (SSM) to current Stela data.
Data returned must be a Python Dictionary.
Dict keys will be converted to env properties.
Ex. {'Foo': 'Bar'} will be available as env.Foo
:param env_data: Data parsed from dotenv file (the first loader)
:param options: Stela Options obj
:return dict[str, any]
"""
ssm = boto3.client('ssm')
environment = options.current_environment
response = ssm.get_parameters_by_path(
Path=f'/my-project/settings/{environment}',
WithDecryption=True
)
api_url = response['Parameters']['ApiUrl']
env_data.update({'API_URL': api_url})
return env_data
Got your settings and secrets from both dotenv files and SSM Parameter Store:
from stela import env
API_URL = env.API_URL
DATABASE_URL_CONNECTION = env.DB_URL
That's it! Check our Documentation for tons of customization and advice.
Not working?
Don't panic. Get a towel and, please, open an
issue.