Skip to main content

A library to create an application config object with validation and a CLI parser included.

Project description

Dynamic Configuration System with Validation and Metadata

This module provides a flexible and extensible system for defining, validating, and managing configuration fields using metadata.

Main Features

  • Dynamic class creation with named fields
  • Schema-based configuration definition using Schema and Option objects
  • Builtin type and range/length validation, including mandatory-check (required)
  • Support for custom defined validation functions
  • Support for loading from dictionaries (e.g. parsed from JSON/YAML)
  • Access to current config values and their metadata
  • Serialization via to_dict() and to_json()
  • Peak-into-utils like info_vars', 'get_meta and more
  • A Config object is an iterable (for field, value in my_config: ...)
  • Suppport CLI out of the box, often no additional configuration needed
  • Additional generation of inverted-bool fields (e.g. --debug field => --no_debug field)
  • Support for auto generated fields by defining custom functions (e.g. --minutes => --in-seconds)

Example Usages

First you must create a list that contains so called Schema objects; a Schema oject represents a typical configuration item such as:

  • --userrole
  • --timeout
  • --port

A Schema-object defines the fieldname (like --userrole) and the associated metadata of that field such as:

  • field type
  • default value
  • is-required?
  • domain (a set collection)
  • minimum value/length/elements
  • maximum value/length/elements
  • custom validation functions
  • custom auto-field-creation functions
  • help text for the field (to support CLI mode help info)
  • short flag (single char to support options in CLI mode)

Then you pass that schema with 1 or more Schema-objects as a list to the factory function of the Config class; that produces a config object.

Here are some simple examples. The package also comes with a subdirectory (examples) containing more elaborate, working demo Python files. Each file includes a short manual.

schema = [
  Schema("debug", default=False, field_type=bool),
  Schema("timeout", default=5, r_min=1, r_max=60, field_type=int),
]

cfg_1 = Config.config_factory(schema)

print(cfg_1.timeout)       # 5
print(cfg_1.debug)         # False
print(cfg_1.no_debug)      # True   (auto generated config-var)
print(cfg_1.info_vars())   # markdown overview vars

cfg_1.timeout = 99       # raises ConfigRangeError
cfg_1.timeout = 'abc'    # raises ConfigTypeError

Now create an additional new config instance using the same schema, but with a different default value for the timeout option.

cfg_2 = Config.from_dict(schema, {'timeout': 10})

print(cfg_2.timeout)     # 10      (no longer 5 on initialization)

Force that timeout can only be a multiple of 5 (5, 10, 15...). For that a custom validation function is used:

def fn_multiple_of_5(value, cfg):
    if values % 5 != 0:
        raise ConfigValidationError(
                "Value Must be a multiple of 5"

schema = [
  Schema("debug", default_value=False, field_type=bool),
  Schema("timeout", default=5, r_min=5, r_max=60, field_type=int),
         fn_validator=fn_multiple_of_5)
]

cfg = Config.config_factory(schema)
cfg.timeout = 33       # raises ConfigValidationError

Below is a example that demonstrates the auto-create field. It creates derived fields for the values of the fields 'minutes' and 'num_spaces':

  • cfg.spaces : a string with spaces based on the value of field cfg.num_spaces
  • cfg.in_seconds : the time in seconds based on the value of field cfg.minutes
@with_field_name('spaces')
def fn_spaces(value, cfg):
    return ' ' * cfg.num_spaces 

@with_field_name('in_seconds')
def fn_seconds(value, cfg):
    return 60 * cfg.minutes 

schema = [
    Schema("num_spaces|s", default=2, fn_computed=fn_spaces, field_type=int, help_text="Number of spaces."),
    Schema("minutes|m", default=5, fn_computed=fn_seconds, field_type=int, help_text="Duration in minutes"),
]

# Create a config instance
cfg = Config.config_factory(schema)

# Parse the CLI arguments from the terminal.

cli_parser.run_parser(cfg)

print("num-spaces", cfg.num_spaces)
print(f"spaces: '{cfg.spaces}'  (computed)")

print("minutes:", cfg.minutes)
print("seconds:", cfg.in_seconds, "  (computed)")

Key Components

Schema

Defines metadata for a config field, including default value,
type constraints, and optional numeric bounds or testing on
length of 'sized' objects like str and list.
A one or more Schema-objects are as a list passed to the config-factory
which produces a Config-instance with field properties according
the Schema definitions.

Option

A Schema-object is in the Config object converted into an Option object.
These objects contain the metadata from the Schema-objects and
control the validators.

Config

The base class for config objects. Config instances are created
dynamically using the `config_factory()` or `from_dict()` methods.

Intended Use Cases

  • Application configuration
  • Plugin settings
  • User preference systems
  • Validated parameter schemas for dynamic interfaces

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

konvigius-0.0.1.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

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

konvigius-0.0.1-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

Details for the file konvigius-0.0.1.tar.gz.

File metadata

  • Download URL: konvigius-0.0.1.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for konvigius-0.0.1.tar.gz
Algorithm Hash digest
SHA256 2c2b8c2af1f75a0310204d7f75a04db5d212c63984777e0d65f226e4507d3628
MD5 42a4ba95b779a26d49d43f3d28774896
BLAKE2b-256 c342a8b565cf5a7c79bbb11ae842c048843b88a5119c46df6d79a9deb3ce3a76

See more details on using hashes here.

File details

Details for the file konvigius-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: konvigius-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 19.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for konvigius-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 66abc517c398ec87756bf4d677ca7ea519f1784ef7e1cc26c9b655532117ffef
MD5 a35a665ac7eb86d94cb9f2315413b35c
BLAKE2b-256 3dcfb499e413d5c881b10e5031a891544cee0e2c41bd6f5327b145ed6b1ebc02

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