Validation helpers for plugin configuration dataclasses
Schema Metadata Constants
Constants for field metadata keys used in dataclass configuration. These enable validation and are compatible with JSON schema generation for UI form builders.
Field Validation
Functions for validating field values against metadata constraints.
def validate_field_value( value:Any, # Value to validate metadata:Dict, # Field metadata containing constraints field_name:str='', # Field name for error messages)->Tuple: # (is_valid, error_message)
Validate a value against field metadata constraints.
def config_to_dict( config:Any, # Configuration dataclass instance)->Dict: # Dictionary representation of the configuration
Convert a configuration dataclass instance to a dictionary.
Converts a dataclass configuration instance to a dictionary for serialization or passing to other systems. Also accepts dict input for passthrough convenience.
def dict_to_config( config_class:Type, # Configuration dataclass type data:Optional=None, # Dictionary with configuration values validate:bool=False, # Whether to validate against metadata constraints)->T: # Instance of the configuration dataclass
Create a configuration dataclass instance from a dictionary.
# Test dataclass_to_jsonschema using ExampleConfig defined below# (This test runs after the ExampleConfig is defined in the notebook)def _test_jsonschema():"""Test JSON schema generation with ExampleConfig.""" schema = dataclass_to_jsonschema(ExampleConfig)# Check structureassert schema["name"] =="ExampleConfig"assert schema["type"] =="object"assert"properties"in schema# Check field propertiesassert schema["properties"]["model"]["type"] =="string"assert schema["properties"]["model"]["title"] =="Model"assert schema["properties"]["model"]["enum"] == ["tiny", "base", "small", "medium", "large"]assert schema["properties"]["model"]["default"] =="base"assert schema["properties"]["temperature"]["type"] =="number"assert schema["properties"]["temperature"]["minimum"] ==0.0assert schema["properties"]["temperature"]["maximum"] ==1.0assert schema["properties"]["batch_size"]["type"] =="integer"assert schema["properties"]["enabled"]["type"] =="boolean"assert schema["properties"]["tags"]["type"] =="array"print("dataclass_to_jsonschema tests passed")return schema
Example: Working with Configuration Dataclasses
from dataclasses import dataclass, fieldfrom typing import List@dataclassclass ExampleConfig:"""Example configuration dataclass with metadata constraints.""" model:str= field( default="base", metadata={ SCHEMA_TITLE: "Model", SCHEMA_DESC: "Model size to use", SCHEMA_ENUM: ["tiny", "base", "small", "medium", "large"] } ) temperature:float= field( default=0.0, metadata={ SCHEMA_TITLE: "Temperature", SCHEMA_DESC: "Sampling temperature", SCHEMA_MIN: 0.0, SCHEMA_MAX: 1.0 } ) batch_size:int= field( default=8, metadata={ SCHEMA_TITLE: "Batch Size", SCHEMA_DESC: "Batch size for processing", SCHEMA_MIN: 1, SCHEMA_MAX: 32 } ) enabled:bool= field( default=True, metadata={SCHEMA_TITLE: "Enabled", SCHEMA_DESC: "Whether feature is enabled"} ) tags:List[str] = field( default_factory=list, metadata={SCHEMA_TITLE: "Tags", SCHEMA_DESC: "Optional tags"} )print("ExampleConfig dataclass defined with metadata constraints")print(f"Fields: {[f.name for f in fields(ExampleConfig)]}")
ExampleConfig dataclass defined with metadata constraints
Fields: ['model', 'temperature', 'batch_size', 'enabled', 'tags']
# Test extract_defaultsdefaults = extract_defaults(ExampleConfig)print("Default values extracted from ExampleConfig:")for k, v in defaults.items():print(f" {k}: {v!r}")
# Test dict_to_config with validationprint("Creating config from dictionary:")# Valid configconfig1 = dict_to_config(ExampleConfig, {"model": "large", "temperature": 0.7}, validate=True)print(f"Valid config: {config1}")# Config with defaults (all valid)config2 = dict_to_config(ExampleConfig, {}, validate=True)print(f"Config with defaults: {config2}")# Test validation failure - invalid enumtry: config_bad = dict_to_config(ExampleConfig, {"model": "invalid"}, validate=True)exceptValueErroras e:print(f"\n✓ Caught invalid enum: {e}")# Test validation failure - value below minimumtry: config_bad = dict_to_config(ExampleConfig, {"temperature": -0.5}, validate=True)exceptValueErroras e:print(f"✓ Caught below minimum: {e}")# Test validation failure - value above maximumtry: config_bad = dict_to_config(ExampleConfig, {"batch_size": 100}, validate=True)exceptValueErroras e:print(f"✓ Caught above maximum: {e}")
Creating config from dictionary:
Valid config: ExampleConfig(model='large', temperature=0.7, batch_size=8, enabled=True, tags=[])
Config with defaults: ExampleConfig(model='base', temperature=0.0, batch_size=8, enabled=True, tags=[])
✓ Caught invalid enum: model: 'invalid' is not one of ['tiny', 'base', 'small', 'medium', 'large']
✓ Caught below minimum: temperature: -0.5 is less than minimum 0.0
✓ Caught above maximum: batch_size: 100 is greater than maximum 32
# Test validate_config directlyprint("Testing validate_config:")# Valid configvalid_config = ExampleConfig(model="small", temperature=0.5, batch_size=16)is_valid, error = validate_config(valid_config)print(f"Valid config: is_valid={is_valid}, error={error}")# Invalid config - create without validation, then validateinvalid_config = ExampleConfig(model="invalid_model", temperature=0.5, batch_size=16)is_valid, error = validate_config(invalid_config)print(f"Invalid model: is_valid={is_valid}, error={error}")# Test config_to_dictprint("\nConverting config to dictionary:")config_dict = config_to_dict(valid_config)print(f"As dictionary: {config_dict}")
Testing validate_config:
Valid config: is_valid=True, error=None
Invalid model: is_valid=False, error=model: 'invalid_model' is not one of ['tiny', 'base', 'small', 'medium', 'large']
Converting config to dictionary:
As dictionary: {'model': 'small', 'temperature': 0.5, 'batch_size': 16, 'enabled': True, 'tags': []}