Skip to main content

Environment variables parsing and validation using python type hints

Project description

Envarify

Environment variables parsing and validation using python type hints

Usage

Having some environment variables:

export TIMEOUT_S=2.5
export API_KEY=some_key
export ALLOWED_IDS=1,2,3
export ENABLE_FEATURE=true

We can create a config object in Python:

from envarify import BaseConfig, EnvVar, SecretString

class MyConfig(BaseConfig):
    timeout_s: float = EnvVar("TIMEOUT_S")
    api_key: SecretString = EnvVar("API_KEY")
    allowed_ids: set[int] = EnvVar("ALLOWED_IDS")
    enable_feature: bool = EnvVar("ENABLE_FEATURE", default=False)
    optional_arg: str | None = EnvVar("OPTIONAL_ARG", default=None)

config = MyConfig.fromenv()
print(config)
#> MyConfig(timeout_s=2.5, api_key='******', allowed_ids={1,2,3}, enable_feature=True, optional_arg=None)

Missing environment variables

If there are required environment variables not set, they will be grouped into one error e.g.:

config = MyConfig.fromenv()
#> MissingEnvVarsError: TIMEOUT_S, API_KEY, ALLOWED_IDS

Supported Types

  • Built-in/standard library types

    • int
    • float
    • bool
    • str
    • typing.StrEnum
    • datetime.date
    • datetime.datetime
  • Special types

    • SecretString

      Masks sensitive environment variables by displaying ****** when printed or logged. The actual value is accessible via the reveal() method, and memory is cleared when object is no longer needed.

      from envarify import BaseConfig, EnvVar, SecretString
      
      class MyConfig(BaseConfig):
          api_key: SecretString = EnvVar("API_KEY")
      
      config = MyConfig.fromenv()
      print(config.api_key)
      
      #> MyConfig(api_key='******')
      
    • Url

      Validates that string is a URL.

      from envarify import BaseConfig, EnvVar, Url
      
      class MyConfig(BaseConfig):
          url: Url = EnvVar("ws://example.com")
      
      config = MyConfig.fromenv()
      print(config.api_key)
      
      #> MyConfig(url='ws://example.com')
      
    • HttpUrl

      Same as Url but validates for http protocol

    • HttpsUrl

      Same as Url but validates for https protocol

    • AnyHttpUrl

      Same as Url but validates for either http or https protocol

  • Dictionary

    • dict / typing.Dict type reads environmental variable as JSON
  • Sequences (delimiter separated values)

    • list[T] / typing.List[T]

    • set[T] / typing.Set[T]

    • tuple[T] / typing.Tuple[T]

      where T is any primitive type

  • BaseConfig subtype itself

    With environment variables COMPONENT_TIMEOUT=5 and OTHER=dummy you can do:

    from envarify import BaseConfig, EnvVar
    
    class ComponentConfig(BaseConfig):
        timeout: int = EnvVar("COMPONENT_TIMEOUT")
    
    class ApplicationConfig(BaseConfig):
        component: ComponentConfig
        other: str = EnvVar("OTHER")
    
    config = ApplicationConfig.fromenv()
    print(config)
    #> ApplicationConfig(component=ComponentConfig(timeout=5), other='dummy')
    

Testing

In tests for your application you don't have to worry about mocking the environment variables. Instead just create a mock config object:

mock_config = MyConfig(timeout_s=4.2, api_key="dummy", allowed_ids={1,2,3}, enable_feature=True)

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

envarify-1.5.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

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

envarify-1.5.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file envarify-1.5.0.tar.gz.

File metadata

  • Download URL: envarify-1.5.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for envarify-1.5.0.tar.gz
Algorithm Hash digest
SHA256 f440bcdcd19697385a99eed35864eef805f252084ffa57200dc5cd4e48db8082
MD5 7398c806d35b4ec9bb227024a844d8cb
BLAKE2b-256 0da01f3089a7e5e554d8aaf5d02d0ab34937dba7cf74c909011f0e4f2dec124b

See more details on using hashes here.

File details

Details for the file envarify-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: envarify-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for envarify-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ad054407eff60732204e6accf1e73106f14db8e0713a6503be9d3256235b4e13
MD5 c4b6c3089f2419dadb28784cf86df7bd
BLAKE2b-256 5d00e592e0567b7590eab3045c55bc4e78c19c4edc273f5379ac02f13ecd8c44

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