Skip to content

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 a Callable[[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