From 36947b0b909837e3e37b0171ecce1e1bc28eb5fe Mon Sep 17 00:00:00 2001 From: Eric Spitler <1396382+eric-spitler@users.noreply.github.com> Date: Wed, 21 Jan 2026 09:04:24 -0700 Subject: [PATCH 1/3] ImportError and isinstance check for pydantic Resolves #287 --- sanic_ext/extras/validation/clean.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sanic_ext/extras/validation/clean.py b/sanic_ext/extras/validation/clean.py index 0dfcd22..e347188 100644 --- a/sanic_ext/extras/validation/clean.py +++ b/sanic_ext/extras/validation/clean.py @@ -1,13 +1,17 @@ from typing import Any, Optional, Type, get_origin, get_type_hints -import pydantic +try: + # Optional dependency + from pydantic import BaseModel +except ImportError: + BaseModel = None def clean_data( model: type[object], data: dict[str, Any], ) -> dict[str, Any]: - if isinstance(model, pydantic.BaseModel): + if isinstance(BaseModel, type) and isinstance(model, pydantic.BaseModel): hints: dict[str, type] = {} for key, field in model.__annotations__.items(): hints[key] = field.annotation From c22a21dc38c3a6ac91f0fc3080f9d894ba534304 Mon Sep 17 00:00:00 2001 From: Eric Spitler <1396382+eric-spitler@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:37:23 -0700 Subject: [PATCH 2/3] Fix isinstance check for BaseModel --- sanic_ext/extras/validation/clean.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sanic_ext/extras/validation/clean.py b/sanic_ext/extras/validation/clean.py index e347188..e031e02 100644 --- a/sanic_ext/extras/validation/clean.py +++ b/sanic_ext/extras/validation/clean.py @@ -11,7 +11,7 @@ def clean_data( model: type[object], data: dict[str, Any], ) -> dict[str, Any]: - if isinstance(BaseModel, type) and isinstance(model, pydantic.BaseModel): + if isinstance(BaseModel, type) and isinstance(model, BaseModel): hints: dict[str, type] = {} for key, field in model.__annotations__.items(): hints[key] = field.annotation From 059ebed6649657a2d17041615860fedf5cbfcb29 Mon Sep 17 00:00:00 2001 From: Eric Spitler <1396382+eric-spitler@users.noreply.github.com> Date: Fri, 20 Mar 2026 12:13:00 -0600 Subject: [PATCH 3/3] Update clean.py use common "is_pydantic" import instead of isinstance check --- sanic_ext/extras/validation/clean.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sanic_ext/extras/validation/clean.py b/sanic_ext/extras/validation/clean.py index e031e02..caff96a 100644 --- a/sanic_ext/extras/validation/clean.py +++ b/sanic_ext/extras/validation/clean.py @@ -1,5 +1,7 @@ from typing import Any, Optional, Type, get_origin, get_type_hints +from sanic_ext.utils.typing import is_pydantic + try: # Optional dependency from pydantic import BaseModel @@ -11,7 +13,7 @@ def clean_data( model: type[object], data: dict[str, Any], ) -> dict[str, Any]: - if isinstance(BaseModel, type) and isinstance(model, BaseModel): + if is_pydantic and isinstance(model, BaseModel): hints: dict[str, type] = {} for key, field in model.__annotations__.items(): hints[key] = field.annotation