The first goal is to allow easy integration of an application with multiple configuration standards, such as environment variables, dotenv files, and Docker Secrets files.
:mod:`cfig` achieves it by allowing the developers of an application to specify where and how configuration values should be loaded from.
..code-block:: python
import cfig
import cfig.sources
config = cfig.Configuration(
sources=[
cfig.sources.EnvironmentSource(),
cfig.sources.EnvironmentSource(prefix="DEV" if __debug__ else "PROD"),
...
],
)
Developer-friendliness
======================
The second goal is to provide a simple and Pythonic interface for developers to define and consume their configuration.
:mod:`cfig` tries to achieve that by employing decorators and functions to create a declarative interface.
..code-block:: python
@config.required()
def SECRET_TOKEN(val: str) -> str:
"""
The token used to encrypt messages. Keep it secret at all costs!
"""
if val.startswith("v1"):
raise cfig.InvalidValueError("Old token, only v2 tokens are supported")
print(f"This is my secret token: {SECRET_TOKEN}. Don't mention it to anybody!")
User-friendliness
=================
Another goal is to simplify deployments for system administrators, providing informative error messages and hints to the user configuring the application.
:mod:`cfig` does that by providing a CLI displaying all possible configuration keys, their docstrings and their values.
..code-block:: python
if __name__ == "__main__":
config.cli()
..code-block:: console
$ python -m mycfig
===== Configuration =====
SECRET_TOKEN → Required, but not set.
The token used to encrypt messages. Keep it secret at all costs!
===== End =====
$ SECRET_TOKEN="v1:potato" python -m mycfig
===== Configuration =====
SECRET_TOKEN → Old token, only v2 tokens are supported
The token used to encrypt messages. Keep it secret at all costs!
===== End =====
$ SECRET_TOKEN="v2:qwertyasdf" python -m mycfig
===== Configuration =====
SECRET_TOKEN = "v2:qwertyasdf"
The token used to encrypt messages. Keep it secret at all costs!
===== End =====
Developer hints
===============
The last goal of :mod:`cfig` is having complete and useful typing, so that developer tools may provide correct and useful type hints on configuration values.