Skip to content

Type-Based Derived Field Hooks

Generate derived fields automatically based on a field's effective_type.

API: extractor.register_type_hook(field_type, callback)

  • field_type: the type that triggers the hook (e.g. datetime, int)
  • callback: Callable[[TMetadata], dict[str, TMetadata]] — receives the source field's metadata and returns a mapping of derived field paths to metadata objects
from datetime import datetime
from dataclasses import dataclass
from fields_metadata import MetadataExtractor, FieldMetadata, FieldsPath

@dataclass
class Event:
    title: str
    event_datetime: datetime

extractor = MetadataExtractor()

def datetime_components(source: FieldMetadata) -> dict[str, FieldMetadata]:
    metadata_map = extractor._cache.get(Event, {})
    path_obj = FieldsPath.from_field_metadata(source.field_name, metadata_map)
    base = path_obj.get_path_string(complimentary=True) if path_obj else source.field_name

    return {
        f"{base}__year": FieldMetadata(
            field_name=f"{source.field_name}__year",
            field_type=int, effective_type=int,
            numeric=True, derived=True, parent_field=base,
            doc="Year of the date",
            extra={"suggested_validation": "year"},
        ),
        f"{base}__month": FieldMetadata(
            field_name=f"{source.field_name}__month",
            field_type=int, effective_type=int,
            numeric=True, derived=True, parent_field=base,
            doc="Month of the date",
            extra={"min_value": 1, "max_value": 12, "suggested_validation": "month"},
        ),
    }

extractor.register_type_hook(datetime, datetime_components)
metadata = extractor.extract(Event)

assert metadata["event_datetime__year"].derived is True
assert metadata["event_datetime__month"].derived is True

Derived field paths use __ as separator to distinguish them from nested paths.