Name-Based Derived Field Hooks
Generate derived fields based on field name patterns.
API: extractor.register_name_hook(predicate, callback)
predicate: a regex string matched against the field path, or aCallable[[str], bool]callback: same signature as type hooks
from fields_metadata import MetadataExtractor, FieldMetadata, FieldsPath
@dataclass
class Report:
title: str
reported_by_organization_id: str
extractor = MetadataExtractor()
def normalize_org_id(source: FieldMetadata) -> dict[str, FieldMetadata]:
metadata_map = extractor._cache.get(Report, {})
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}__normalized": FieldMetadata(
field_name=f"{source.field_name}__normalized",
field_type=str, effective_type=str,
derived=True, parent_field=source.parent_field,
doc=f"Normalized version of {source.field_name}",
),
}
# Regex pattern
extractor.register_name_hook(r".*organization.*id$", normalize_org_id)
# Predicate function
extractor.register_name_hook(lambda path: path.endswith("_id"), normalize_org_id)
metadata = extractor.extract(Report)
assert "reported_by_organization_id__normalized" in metadata