Skip to content

Commit

Permalink
Improve Pydantic v1/2 cross-compatibility (#101)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Charles Tapley Hoyt <[email protected]>
  • Loading branch information
hrshdhgd and cthoyt authored Feb 4, 2024
1 parent 5cde3dd commit d2f51d5
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 5 deletions.
24 changes: 24 additions & 0 deletions src/curies/_pydantic_compat.py
Original file line number Diff line number Diff line change
@@ -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]
12 changes: 7 additions & 5 deletions src/curies/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit d2f51d5

Please sign in to comment.