diff --git a/src/curies/_pydantic_compat.py b/src/curies/_pydantic_compat.py new file mode 100644 index 00000000..71471ea2 --- /dev/null +++ b/src/curies/_pydantic_compat.py @@ -0,0 +1,24 @@ +"""A compatibility layer for pydantic 1 and 2.""" + +from pydantic import __version__ as pydantic_version + +__all__ = [ + "PYDANTIC_V1", + "field_validator", + "get_field_validator_values", +] + +PYDANTIC_V1 = pydantic_version.startswith("1.") + +if PYDANTIC_V1: + from pydantic import validator as field_validator +else: + from pydantic import field_validator + + +def get_field_validator_values(values, key: str): # type:ignore + """Get the value for the key from a field validator object, cross-compatible with Pydantic 1 and 2.""" + if PYDANTIC_V1: + return values[key] + else: + return values.data[key] diff --git a/src/curies/api.py b/src/curies/api.py index c86b31df..730d4e6a 100644 --- a/src/curies/api.py +++ b/src/curies/api.py @@ -33,9 +33,11 @@ ) import requests -from pydantic import BaseModel, Field, validator +from pydantic import BaseModel, Field from pytrie import StringTrie +from ._pydantic_compat import field_validator, get_field_validator_values + if TYPE_CHECKING: # pragma: no cover import pandas import rdflib @@ -267,18 +269,18 @@ class Records(BaseModel): "Warning: this is an experimental feature.", ) - @validator("prefix_synonyms") # type:ignore + @field_validator("prefix_synonyms") # type:ignore def prefix_not_in_synonyms(cls, v: str, values: Mapping[str, Any]) -> str: # noqa:N805 """Check that the canonical prefix does not apper in the prefix synonym list.""" - prefix = values["prefix"] + prefix = get_field_validator_values(values, "prefix") if prefix in v: raise ValueError(f"Duplicate of canonical prefix `{prefix}` in prefix synonyms") return v - @validator("uri_prefix_synonyms") # type:ignore + @field_validator("uri_prefix_synonyms") # type:ignore def uri_prefix_not_in_synonyms(cls, v: str, values: Mapping[str, Any]) -> str: # noqa:N805 """Check that the canonical URI prefix does not apper in the URI prefix synonym list.""" - uri_prefix = values["uri_prefix"] + uri_prefix = get_field_validator_values(values, "uri_prefix") if uri_prefix in v: raise ValueError( f"Duplicate of canonical URI prefix `{uri_prefix}` in URI prefix synonyms"