Skip to content

brunodavi/envclass

Repository files navigation

EnvClass

python_versions gnu version testing

Manage environment variables in a simple and elegant way

Made from 100% pure Python

Why does this exist

To manage environment variables in an easy way that works for any device (like a cell phone with termux)

If you intend to run in production, use pydantic-settings

Installation

pip install envclass

Quick Start

.env

HOST=0.0.0.0
PORT=1234

CONFIG_FILE=
from envclass import EnvClass


# When declaring the class with _env_file it
# reads the file and casts all attributes
class MyEnv(EnvClass):
    _env_file = '.env'

    TESTING: bool = False

    HOST: str = 'localhost'
    PORT: int

    CONFIG_FILE: str


# Return: '0.0.0.0'
MyEnv.HOST

# Return: False
MyEnv.TESTING

# Return: 1234
MyEnv.PORT

# Return: None
MyEnv.CONFIG_FILE

Supported Types

Currently, only primitive types have been tested, such as:

  • str
  • int
  • bool
  • float

Booleans

Attributes follow Python language conventions for conversion, but bool attributes have specific interpretations when reading environment variables:

bool attributes can be:

  • True, true, or 1 for true.
  • False, false, or 0 for false.

Read Only Attributes

When this configuration is defined, it is not possible to change the attributes

Example:

from envclass import EnvClass


class EnvLock(EnvClass)
    KEY: str = None

# Generates an AttributeError stating 
# that it is read-only
EnvLock.KEY = 'Value'

Lower Attrubutes

Lowercase attributes work the same way, I just thought leaving everything capitalized would look better

Since the name is closest to the environment variable read

Example:

.env

LOWER_KEY='lower'
from envclass import EnvClass

class EnvLower(EnvClass):
    _env_file = '.env'
    lower_key = 'upper'

# Return: 'lower'
EnvLower.lower_key

See your variables

The class is seen this way:

.env

ENV_A=3
ENV_B=1
ENV_C=10
from envclass import EnvClass

class Env(EnvClass):
    _env_file = '.env'
    _prefix = 'ENV'

    A: str
    B: bool = False
    C: int

print(Env)

Output:

ENV_A='3'
ENV_B=True
ENV_C=10

Special Attributes

Env File

By default, this is set to None.

It is used to read the file like .env

Example:

# file: no_load_env.py

from envclass import EnvClass


class NoEnv(EnvClass):
    WAIT_TIME: int = 10


print(NoEnv.WAIT_TIME)

Execution on Linux:

$ WAIT_TIME=5 python no_load_env.py
5

Strict Mode

By default, this is set to True.

This allows using environ[key] to signal when an environment variable is not defined, generating the default KeyError error if the variable does not have a default value. If set to False, attributes that do not exist will return None.

Examples:

from envclass import EnvClass

# Disabled strict mode
class NotStrict(EnvClass):
    _strict = False
    NOT_EXISTS: str

# Returns None
NotStrict.NOT_EXISTS


# Enabled strict mode
# Generates a KeyError
class Strict(EnvClass):
    _strict = True
    NOT_EXISTS: str

Prefix

By default, there is None

This allows adding a string at the beginning of the environment variable name, making it easier to organize.

Example:

.env

DB_USER=dev_user
DB_KEY=dev_key_123
from envclass import EnvClass

class DataBase(EnvClass):
    _env_file = '.env'
    _prefix = 'DB'

    NAME: str = 'Dev'
    HOST: str = 'localhost'

    USER: str
    KEY: str

# Return: 'Dev'
DataBase.NAME

# Return: dev_key_123
DataBase.KEY