Skip to main content

Python application configuration via the environment

Project description

Envier

Python application configuration from the environment

Synopsis

Envier is a Python library for extracting configuration from environment variables in a declarative and (eventually) 12-factor-app-compliant way.

Usage

The following example shows how to declare the configuration for an application that uses the MYAPP_DEBUG, MYAPP_SERVICE_HOST and MYAPP_SERVICE_PORT variables from the environment.

>>> from envier import Env
>>> 
>>> class GlobalConfig(Env):
>>>     __prefix__ = "myapp"
>>>     
>>>     debug_mode = Env.var(bool, "debug", default=False)
>>> 
>>>     service_host = Env.var(str, "service.host", default="localhost")
>>>     service_port = Env.var(int, "service.port", default=3000)
>>> 
>>>     _is_default_port = Env.der(bool, lambda c: c.service_port == c.spec.service_port.default)
>>> 
>>> config = GlobalConfig()
>>> config.service_port
3000
>>> config._is_default_port
True

Configurations can also be nested to create namespaces:

>>> from envier import Env
>>> 
>>> class ServiceConfig(Env):
>>>     __prefix__ = "service"
>>> 
>>>     host = Env.var(str, "host", default="localhost")
>>>     port = Env.var(int, "port", default=3000)
>>> 
>>> class GlobalConfig(Env):
>>>     __prefix__ = "myapp"
>>>     
>>>     debug_mode = Env.var(bool, "debug", default=False)
>>> 
>>>     service = ServiceConfig
>>> 
>>> config = GlobalConfig()
>>> config.service.port
3000

The same configuration can be obtained with implicit nesting by declaring the ServiceConfig subclass inside GlobalConfig, and setting the class attribute __item__ to the name of the item the sub-configuration should be assigned to, viz.

>>> from envier import Env
>>> 
>>> class GlobalConfig(Env):
>>>     __prefix__ = "myapp"
>>>     
>>>     debug_mode = Env.var(bool, "debug", default=False)
>>> 
>>>     class ServiceConfig(Env):
>>>         __item__ = __prefix__ = "service"
>>>         
>>>         host = Env.var(str, "host", default="localhost")
>>>         port = Env.var(int, "port", default=3000)
>>> 
>>> config = GlobalConfig()
>>> config.service.port
3000

Type Checking

The library ships with a mypy plugin to allow for type checking. If you want to use it, either install the library with the mypy extra or ensure that mypy is installed, and then add envier.mypy to the list of extra plugins in the mypy configuration.

Sphinx Plugin

The library comes with a Sphinx plugin at envier.sphinx to allow generating documentation from the configuration spec class directly. It exposes the envier directive that takes a mandatory argument, the configuration spec class in the form module:class; additionally, the options heading and recursive can be used to control whether to add heading and whether to recursively get help information from nested configuration spec classes respectively. By default, the plugin will display the table heading and will not recurse over nested configuration spec classes.

Here is an example for a configuration class GlobalConfig located in the myapp.config module. We omit the table header and recurse over nested configuration.

.. envier:: myapp.config:GlobalConfig
   :heading: false
   :recursive: true

Roadmap

  • Add support for environment files.
  • Rely on type hints as support for older versions of Python is dropped.
  • Derivations might require an evaluation order.

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

envier-0.4.0.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

envier-0.4.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: envier-0.4.0.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for envier-0.4.0.tar.gz
Algorithm Hash digest
SHA256 e68dcd1ed67d8b6313883e27dff3e701b7fba944d2ed4b7f53d0cc2e12364a82
MD5 299ff936df92b0be05ad63d788ada0d6
BLAKE2b-256 68a238c63b90a637c337df34e60cd2838353d9d8c4ff3bfa5c434903a934fd06

See more details on using hashes here.

File details

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

File metadata

  • Download URL: envier-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for envier-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7b91af0f16ea3e56d91ec082f038987e81b441fc19c657a8b8afe0909740a706
MD5 89de04c542a8bee6107d5345ab32dc0d
BLAKE2b-256 6a98f444573540319ed549ea39986d935412a18228c323a11e07f2dd2fda549b

See more details on using hashes here.

Supported by

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