Skip to main content

Yaml config package

Project description

Russian version: README.ru.md

Dyacon

Dyacon is a library for working with YAML configurations in Python. It provides tools for convenient configuration loading and processing and supports loading values from environment variables and other sources, such as Google Secret Manager.

Using multiple configuration files allows you to store multiple sets of settings for one service simultaneously, making it easy to switch between them for different purposes, such as testing or debugging.

Installation

You can install dyacon using pip:

pip install dyacon

If you want to use Google Secret Manager support, install the library with the appropriate options and set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your Google Cloud service account file:

pip install "dyacon[google]"

Why Use Dyacon?

The Dyacon library is designed to simplify working with YAML configurations in your Python applications. It offers the following features:

  • Combining Multiple YAML Files into One: Dyacon allows you to create a hierarchy of configurations by collecting data from multiple files. This is convenient for splitting configuration into different files and components. For more details, read the Loading Configuration section.

  • Loading Values from Environment Variables: Dyacon allows you to include values from environment variables in your configuration. You can use the special syntax ${env_variable_name:default_value} to specify the name of the environment variable to look for and a default value.

    # config/config.yaml
    token: "${API_TOKEN:default_value}" 
    
    # config.py
    from dataclasses import dataclass
    from dyacon import read_config, Load
    
    @dataclass
    class Config:
        token: str = Load()
    
    config = read_config(Config)
    
  • Loading Values from Google Secret Manager: If you work in the Google Cloud, Dyacon provides a loader for Google Secret Manager. You can load confidential data such as passwords and keys from Secret Manager using the syntax !{env_variable_name:project_id:default_value}.

    # config/config.yaml
    token: "!{API_TOKEN:my-project:default_value}" 
    
    # config.py
    from dataclasses import dataclass
    from dyacon import read_config, Load
    from dyacon.loaders.external import GoogleCloudSecretLoader
    
    @dataclass
    class Config:
        token: str = Load([GoogleCloudSecretLoader()])
    
    config = read_config(Config)
    

Usage

Loading Configuration

Dyacon provides tools for loading configuration from a YAML file and converting it into Python objects. A target configuration file must be created in which other files will be included, if necessary. For example, in the example below, the file config/config.yaml includes the file db/local.yaml. If you want to use settings for a production environment, you can create a file with a different name, such as db/prod.yaml, and include it in config/config.yaml using the !include db/prod.yaml directive. The path in the !include directive should be relative to the file in which it is used.

As a result, we would only need to change one line in the configuration file to switch to different settings.

# config/config.yaml
db: !include db/local.yaml
# config/db/local.yaml
host: localhost
port: 3306
name: local_db
# config.py
from dataclasses import dataclass
from dyacon import read_config

@dataclass
class DbConfig:
    host: str
    port: int
    name: str

@dataclass
class Config:
    db: DbConfig

config = read_config(Config)
print(config.db.host) # localhost

The read_config function takes an optional path argument that specifies the target YAML file to load. If the argument is not provided, Dyacon will look for the config/config.yaml file relative to the current working directory.

Load Descriptor

The Load descriptor allows you to inject automatic configuration value loading from various sources. Load takes a list of loaders that will be used to load values. By default, the EnvLoader loader is used, which loads values from environment variables. You can add other loaders to load values from other sources.

The descriptor accepts optional arguments default, default_factory, and required.

If a field in the configuration class is marked with the Load descriptor, but that field is not present in the configuration YAML file, the required argument will be checked. If the required value is set to True, a ValueError exception will be raised. Otherwise, the value obtained from default_factory or default will be used. The function provided in default_factory will be called without arguments.

# config.py
from dataclasses import dataclass
from dyacon import read_config, Load

@dataclass
class Config:
    token: str = Load(default_factory=lambda: "default_value")

config = read_config(Config)

Loaders

Dyacon provides several built-in loaders that can be used with the Load descriptor.

EnvLoader

The EnvLoader loader loads values from environment variables. To load values, use the ${env_variable_name:default_value} syntax. If the environment variable is not set, the default value will be used.

GoogleCloudSecretLoader

The GoogleCloudSecretLoader loader loads values from Google Secret Manager. To load values, use the !{env_variable_name:project_id:default_value} syntax. To use this loader, you need to install the google-cloud-secret-manager library with the following command:

pip install "dyacon[google]"

or

pip install google-cloud-secret-manager

You also need to set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your Google Cloud service account file.

To use the GoogleCloudSecretLoader loader, pass it in the list of loaders for the Load descriptor. You can also implement your own descriptor by inheriting from Load and overriding the __init__ method.

from typing import List, Optional, Callable, Any
from dyacon import Load, Loader
from dyacon.loaders.external import GoogleCloudSecretLoader

class NewLoad(Load):
    def __init__(
        self,
        loaders: Optional[List[Loader]] = None,
        *,
        default: Optional[str] = None,
        default_factory: Optional[Callable[[], Any]] = None,
        required: bool = False,
    ):
        super().__init__(
            loaders,
            default=default,
            default_factory=default_factory,
            required=required,
        )
        self.loaders.append(GoogleCloudSecretLoader())

Contributions and Feedback

If you have ideas, suggestions, or find bugs, please share them on GitHub. Your contributions are welcome!

License

Dyacon is distributed under the MIT license. See the LICENSE file for details.


Author: Aleksei Morozov | GitHub

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

dyacon-0.0.10.tar.gz (10.6 kB view details)

Uploaded Source

Built Distribution

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

dyacon-0.0.10-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file dyacon-0.0.10.tar.gz.

File metadata

  • Download URL: dyacon-0.0.10.tar.gz
  • Upload date:
  • Size: 10.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.8.18

File hashes

Hashes for dyacon-0.0.10.tar.gz
Algorithm Hash digest
SHA256 8efc724ab9368514ff9ee8b02d939e3e9af58c82be0d4300f7bb0c03fae26d35
MD5 18eb34b79e73fc9c507a7a084ae32a1c
BLAKE2b-256 963bfc866b0c1751c01b3780a8e3e259bb88a07cea24dd78e133b3b08d5e660b

See more details on using hashes here.

File details

Details for the file dyacon-0.0.10-py3-none-any.whl.

File metadata

  • Download URL: dyacon-0.0.10-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.8.18

File hashes

Hashes for dyacon-0.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 837914612eca2acce865126954cfa2fc659adb52b26036dba0ce2eea284db729
MD5 ffce867cba1e504d833f4b23f6d6fa60
BLAKE2b-256 877b1435eff1590f711778881fedf73cc2fac8064a0f3f26e79184c7aaf94891

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