Skip to content

Commit 449487f

Browse files
committed
fix: Handle field validators targetting all fields with "*"
Issue-22: #22
1 parent 2f37b7e commit 449487f

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/griffe_pydantic/_internal/common.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ def _process_function(func: Function, cls: Class, fields: Sequence[str]) -> None
6767
cls: A Griffe function representing the Pydantic validator.
6868
"""
6969
func.labels = {"pydantic-validator"}
70-
targets = [cls.all_members[field] for field in fields]
70+
if fields and fields[0] == "*":
71+
targets = [member for member in cls.all_members.values() if "pydantic-field" in member.labels]
72+
else:
73+
targets = [cls.all_members[field] for field in fields]
7174

7275
func.extra[_self_namespace].setdefault("targets", [])
7376
func.extra[_self_namespace]["targets"].extend(targets)

tests/test_extension.py

+25
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,28 @@ class Model(BaseModel):
167167
) as package:
168168
assert "pydantic-field" not in package["Model.class_var"].labels
169169
assert "class-attribute" in package["Model.class_var"].labels
170+
171+
172+
def test_wildcard_field_validator() -> None:
173+
"""Test field validator that works on all fields."""
174+
code = """
175+
from pydantic import BaseModel, field_validator
176+
177+
class Schema(BaseModel):
178+
a: int
179+
b: int
180+
181+
@field_validator('*', mode='before')
182+
@classmethod
183+
def set_if_none(cls, v: Any, info):
184+
...
185+
"""
186+
with temporary_visited_package(
187+
"package",
188+
modules={"__init__.py": code},
189+
extensions=Extensions(PydanticExtension(schema=False)),
190+
) as package:
191+
validator = package["Schema.set_if_none"]
192+
assert validator.labels == {"pydantic-validator"}
193+
assert validator in package["Schema.a"].extra["griffe_pydantic"]["validators"]
194+
assert validator in package["Schema.b"].extra["griffe_pydantic"]["validators"]

0 commit comments

Comments
 (0)