From 717ae9213f2fa9cc08932d7cea08c89699f4bcf8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:57:16 +0000 Subject: [PATCH 1/3] ci(pre-commit.ci): autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/abravalheri/validate-pyproject: v0.23 → v0.24.1](https://github.com/abravalheri/validate-pyproject/compare/v0.23...v0.24.1) - [github.com/astral-sh/ruff-pre-commit: v0.9.1 → v0.11.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.1...v0.11.12) - [github.com/pre-commit/mirrors-mypy: v1.14.1 → v1.16.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.1...v1.16.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ed1f13a..6742cab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,19 +5,19 @@ ci: repos: - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.23 + rev: v0.24.1 hooks: - id: validate-pyproject - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.1 + rev: v0.11.12 hooks: - id: ruff args: [--fix] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.14.1 + rev: v1.16.0 hooks: - id: mypy files: "^src/" From 26fa046998d3e344c84ca22bfc23a66337d6eb33 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:57:55 +0000 Subject: [PATCH 2/3] style(pre-commit.ci): auto fixes [...] --- src/fieldz/adapters/_attrs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fieldz/adapters/_attrs.py b/src/fieldz/adapters/_attrs.py index c607f19..e6c1faa 100644 --- a/src/fieldz/adapters/_attrs.py +++ b/src/fieldz/adapters/_attrs.py @@ -62,7 +62,7 @@ def fields(class_or_instance: Any | type) -> tuple[Field, ...]: ) fields: list[Field] = [] for f in attrs.fields(cls): - f = cast(attrs.Attribute, f) + f = cast("attrs.Attribute", f) default = Field.MISSING if f.default is attrs.NOTHING else f.default default_factory: ( Callable[[], Any] | Callable[[Any], Any] | Literal[_MISSING_TYPE.MISSING] From b7c5027d6f6497dcfe7528c7a1535fc2ac98df9d Mon Sep 17 00:00:00 2001 From: Talley Lambert Date: Sun, 29 Jun 2025 12:23:49 -0400 Subject: [PATCH 3/3] fix --- .pre-commit-config.yaml | 4 ++-- pyproject.toml | 6 +++--- src/fieldz/adapters/_attrs.py | 4 ++-- src/fieldz/adapters/_pydantic.py | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6742cab..51c36f8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,14 +10,14 @@ repos: - id: validate-pyproject - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.12 + rev: v0.12.1 hooks: - id: ruff args: [--fix] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.0 + rev: v1.16.1 hooks: - id: mypy files: "^src/" diff --git a/pyproject.toml b/pyproject.toml index 18d41c1..7f0b287 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ test = [ "pydantic", "annotated_types", ] -dev = ["black", "ipython", "mypy", "pdbpp", "rich", "ruff", "hatch"] +dev = ["ipython", "mypy", "pdbpp", "rich", "ruff", "hatch", "pre-commit-uv"] [project.urls] homepage = "https://github.com/pyapp-kit/fieldz" @@ -88,7 +88,7 @@ select = [ "C4", # flake8-comprehensions "A001", # flake8-builtins "RUF", # ruff-specific rules - "TCH", # typecheck + "TC", # typecheck "TID", # tidy imports ] ignore = [ @@ -97,7 +97,7 @@ ignore = [ ] [tool.ruff.lint.per-file-ignores] -"tests/*.py" = ["D", "S"] +"tests/*.py" = ["D", "S", "RUF009"] "setup.py" = ["D"] # https://mypy.readthedocs.io/en/stable/config_file.html diff --git a/src/fieldz/adapters/_attrs.py b/src/fieldz/adapters/_attrs.py index e6c1faa..8987b1f 100644 --- a/src/fieldz/adapters/_attrs.py +++ b/src/fieldz/adapters/_attrs.py @@ -76,9 +76,9 @@ def fields(class_or_instance: Any | type) -> tuple[Field, ...]: type=f.type, default=default, default_factory=default_factory, - repr=f.repr, + repr=f.repr, # type: ignore [arg-type] init=f.init, - compare=f.eq, + compare=f.eq, # type: ignore [arg-type] kw_only=f.kw_only, hash=f.hash, native_field=f, diff --git a/src/fieldz/adapters/_pydantic.py b/src/fieldz/adapters/_pydantic.py index ae0bce9..011cbf1 100644 --- a/src/fieldz/adapters/_pydantic.py +++ b/src/fieldz/adapters/_pydantic.py @@ -138,6 +138,8 @@ def _fields_v2(obj: pydantic.BaseModel | type[pydantic.BaseModel]) -> Iterator[F if hasattr(obj, "__pydantic_fields__"): # v2 dataclass _fields = obj.__pydantic_fields__.items() else: + if not isinstance(obj, type): + obj = type(obj) _fields = obj.model_fields.items() annotations = getattr(obj, "__annotations__", {}) @@ -178,7 +180,7 @@ def fields( | type[pydantic.BaseModel] | type[PydanticV1BaseModel], ) -> tuple[Field, ...]: - if hasattr(obj, "model_fields") or hasattr(obj, "__pydantic_fields__"): + if hasattr(type(obj), "model_fields") or hasattr(obj, "__pydantic_fields__"): obj = cast("pydantic.BaseModel | type[pydantic.BaseModel]", obj) return tuple(_fields_v2(obj)) if hasattr(obj, "__pydantic_model__"):