{"id":756,"library":"envier","title":"Envier","description":"Envier is a Python library for extracting configuration from environment variables in a declarative and 12-factor-app-compliant way. It focuses on type-hinting and clear definition of environment variable mappings to Python objects. The library is currently at version 0.6.1 and is actively maintained with regular releases.","status":"active","version":"0.6.1","language":"python","source_language":"en","source_url":"https://github.com/DataDog/envier","tags":["configuration","environment variables","declarative config","12-factor app","env","dataclass-like"],"install":[{"cmd":"pip install envier","lang":"bash","label":"Install stable version"}],"dependencies":[{"reason":"Required for the optional mypy plugin for type checking.","package":"mypy","optional":true}],"imports":[{"symbol":"Env","correct":"from envier import Env"}],"quickstart":{"code":"import os\nfrom envier import Env\n\n# Set environment variables for the example\nos.environ['MYAPP_DEBUG'] = os.environ.get('MYAPP_DEBUG', 'True')\nos.environ['MYAPP_SERVICE_HOST'] = os.environ.get('MYAPP_SERVICE_HOST', 'example.com')\nos.environ['MYAPP_SERVICE_PORT'] = os.environ.get('MYAPP_SERVICE_PORT', '8080')\n\nclass GlobalConfig(Env):\n    __prefix__ = \"myapp\"\n\n    debug_mode = Env.var(bool, \"debug\", default=False)\n\n    service_host = Env.var(str, \"service.host\", default=\"localhost\")\n    service_port = Env.var(int, \"service.port\", default=3000)\n\n# Instantiate the configuration\nconfig = GlobalConfig()\n\nprint(f\"Debug Mode: {config.debug_mode}\")\nprint(f\"Service Host: {config.service_host}\")\nprint(f\"Service Port: {config.service_port}\")\n\n# Expected output if env vars are not set:\n# Debug Mode: True\n# Service Host: example.com\n# Service Port: 8080\n\n# Clean up environment variables (optional, but good for isolated testing)\ndel os.environ['MYAPP_DEBUG']\ndel os.environ['MYAPP_SERVICE_HOST']\ndel os.environ['MYAPP_SERVICE_PORT']","lang":"python","description":"This example demonstrates how to define a configuration class using `envier.Env`, specify environment variable mappings with `Env.var`, and handle prefixes for nested configurations. It sets temporary environment variables to ensure the example is runnable."},"warnings":[{"fix":"Review the usage of `HelpInfo` and adapt to its new `namedtuple` structure. Consult the latest documentation for correct access.","message":"The internal structure and exposure of `HelpInfo` was refactored. Code directly importing `HelpInfo` or relying on its previous class-based implementation might break.","severity":"breaking","affected_versions":">=0.6.0"},{"fix":"Migrate to a different documentation generation approach or manually maintain environment variable documentation.","message":"The Sphinx plugin for auto-generating environment variable documentation was removed. Users who relied on this feature will need to find an alternative documentation generation method.","severity":"breaking","affected_versions":">=0.5.0"},{"fix":"Upgrade to the latest version to benefit from bug fixes. Carefully review and test configurations involving nested structures and prefixes.","message":"There have been multiple bug fixes (v0.6.1, v0.2.1, v0.2.0) related to the handling of `include` with `namespace` and prefixes for sub-configuration items. Users should thoroughly test configurations involving nested structures and custom prefixes, as these areas have historically shown inconsistencies.","severity":"gotcha","affected_versions":"<0.6.1, <0.2.1, <0.2.0 (fixed in later versions)"},{"fix":"Ensure you are using `envier` version 0.5.2 or newer when defining configuration variables with `Optional[Type]`.","message":"A bug affecting the proper handling of `Optional` types in configuration variables was fixed in version 0.5.2.","severity":"gotcha","affected_versions":"<0.5.2"}],"env_vars":null,"last_verified":"2026-05-12T18:38:09.946Z","next_check":"2026-06-27T00:00:00.000Z","problems":[{"fix":"Install the 'envier' library using pip: `pip install envier`","cause":"The 'envier' library has not been installed in the Python environment where the code is being run.","error":"ModuleNotFoundError: No module named 'envier'"},{"fix":"Set the environment variable `YOUR_VARIABLE_NAME` in your shell or `.env` file before running the application, or provide a default value in your `envier` configuration class, e.g., `YOUR_VARIABLE_NAME: str = 'default_value'` or `YOUR_VARIABLE_NAME: str = field(default='default_value')`.","cause":"A configuration field defined in an `envier` dataclass is marked as required (by default, or explicitly with `default=...` not present) but the corresponding environment variable is not found.","error":"envier.errors.MissingValueError: Required environment variable 'YOUR_VARIABLE_NAME' is not set."},{"fix":"Ensure the environment variable `YOUR_NUMBER_VARIABLE` contains a value that can be successfully converted to the declared type. For example, if it's an `int`, provide a string like '123' instead of 'abc'.","cause":"The value of an environment variable cannot be converted to the Python type specified in the `envier` dataclass (e.g., 'abc' cannot be converted to an integer).","error":"envier.errors.InvalidTypeError: Environment variable 'YOUR_NUMBER_VARIABLE' ('abc') cannot be converted to <class 'int'>."},{"fix":"Verify that the attribute `missing_attribute` is correctly defined in your `envier` dataclass (e.g., `class Settings(Env): missing_attribute: str`) and that you are using the correct casing and spelling when accessing it.","cause":"You are trying to access an attribute on your `envier` settings object that was not defined in its corresponding dataclass or is misspelled.","error":"AttributeError: 'Settings' object has no attribute 'missing_attribute'"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":80,"quickstart_tag":"verified","pypi_latest":"0.6.1","cli_name":"","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","installed_version":null,"pypi_latest":"0.6.1","is_stale":null,"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"17.9M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"17.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":1.5,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"18M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"19.7M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":0.7,"disk_size":"19.7M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":1.7,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"20M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"11.6M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":1.5,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"12M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.7,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.8,"disk_size":"11.3M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.8,"disk_size":"11.2M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":1.5,"import_time_s":0.02,"mem_mb":0.6,"disk_size":"12M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":0.6,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.3M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"17.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":1.7,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"envier","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.01,"mem_mb":0.5,"disk_size":"18M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":"verified","tag_description":"quickstart runs on critical runtimes, recently tested","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}