Source code for poulet_py.config.settings
"""
Configuration settings.
This module defines the application's configuration settings using Pydantic's
`BaseSettings` and `BaseModel`. It supports loading configuration from environment
variables and a `.env` file.
Usage Examples
--------------
1. Accessing Default Settings:
>>> from poulet_py.config.settings import settings
>>> print(settings.log.level) # Output: "info"
>>> print(settings.log.file) # Output: None
2. Overriding Settings with Environment Variables:
Set environment variables before running the application:
```bash
export LOG__LEVEL="debug"
export LOG__FILE="/var/log/myapp.log"
```
Then access the settings in your code:
>>> from poulet_py.config.settings import settings
>>> print(settings.log.level) # Output: "debug"
>>> print(settings.log.file) # Output: "/var/log/myapp.log"
3. Loading Settings from a `.env` File:
Create a `.env` file in the project root:
```env
LOG__LEVEL=warning
LOG__FILE=/tmp/app.log
```
Then access the settings in your code:
>>> from poulet_py.config.settings import settings
>>> print(settings.log.level) # Output: "warning"
>>> print(settings.log.file) # Output: "/tmp/app.log"
4. Programmatically Updating Settings:
>>> from poulet_py.config.settings import Settings
>>> custom_settings = Settings(log={"level": "error", "file": "/custom/path.log"})
>>> print(custom_settings.log.level) # Output: "error"
>>> print(custom_settings.log.file) # Output: "/custom/path.log"
"""
from dotenv import find_dotenv
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings, SettingsConfigDict
[docs]
class Log(BaseModel):
level: str = Field("info", description="The logging level")
file: str | None = Field(
None,
description="""The file path for logging. If `None`,
logging is done to the console.
""",
)
[docs]
class Settings(BaseSettings):
"""
This class loads configuration from environment variables and a `.env` file.
It supports nested configuration using the `env_nested_delimiter`
(e.g., `LOG__LEVEL`).
"""
model_config = SettingsConfigDict(
env_nested_delimiter="__",
env_file=find_dotenv(),
env_file_encoding="utf-8",
extra="ignore",
)
log: Log = Field(Log(), description="Logging configuration settings")
# Global instance of the `Settings` class
SETTINGS = Settings()
"""
An instance of the `Settings` class.
This instance holds the application's configuration, loaded from environment
variables and a `.env` file.
It can be imported and used throughout the application to access
configuration settings.
Example
-------
To access the logging level:
>>> from poulet_py.config.settings import SETTINGS
>>> print(SETTINGS.log.level)
"""