diff --git a/README.md b/README.md index d20c1f0..4829242 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,9 @@ result = validate(data, SCHEMA) print(result["name"]) # ← IDE が "name" / "level" を補完してくれる ``` +注意: +- `collect_errors=True` を指定した場合、`validate` は `ValidationResult` を返します。そのため、`Schema[T]` を使っていても戻り値の型は `T` ではなく `ValidationResult` になります。 + TypedDict を書くのが面倒な場合は、既存の辞書スキーマを渡す使い方もそのまま使えます。 型補完が不要なケースでは、変数側に型注釈を書くことで mypy / pyright に型を伝えられます。 diff --git a/src/validkit/__init__.py b/src/validkit/__init__.py index e3e7d40..61a5308 100644 --- a/src/validkit/__init__.py +++ b/src/validkit/__init__.py @@ -1,5 +1,5 @@ from .v import v from .validator import validate, ValidationError, Schema -__version__ = "1.1.1" +__version__ = "1.1.0" __all__ = ["v", "validate", "ValidationError", "Schema"] diff --git a/src/validkit/validator.py b/src/validkit/validator.py index 348ad65..26d6642 100644 --- a/src/validkit/validator.py +++ b/src/validkit/validator.py @@ -1,4 +1,15 @@ -from typing import Any, Dict, Generic, List, Optional, TypeVar, overload, TYPE_CHECKING +from typing import ( + Any, + Dict, + Generic, + List, + Optional, + TypeVar, + Union, + overload, + TYPE_CHECKING, + Literal, +) from .v import Validator, v T = TypeVar("T") @@ -18,6 +29,7 @@ class UserDict(TypedDict): SCHEMA: Schema[UserDict] = Schema({"name": v.str(), "age": v.int()}) + data: UserDict = {"name": "Alice", "age": 30} result = validate(data, SCHEMA) # inferred as UserDict by the IDE print(result["name"]) # IDE completes "name" / "age" """ @@ -165,7 +177,19 @@ def validate( partial: bool = ..., base: Any = ..., migrate: Optional[Dict[str, Any]] = ..., - collect_errors: bool = ..., + *, + collect_errors: Literal[True], + ) -> ValidationResult: ... + + @overload + def validate( + data: Any, + schema: Schema[T], + partial: bool = ..., + base: Any = ..., + migrate: Optional[Dict[str, Any]] = ..., + *, + collect_errors: Literal[False] = ..., # default ) -> T: ... @overload @@ -175,7 +199,19 @@ def validate( partial: bool = ..., base: Any = ..., migrate: Optional[Dict[str, Any]] = ..., - collect_errors: bool = ..., + *, + collect_errors: Literal[True], + ) -> ValidationResult: ... + + @overload + def validate( + data: Any, + schema: Any, + partial: bool = ..., + base: Any = ..., + migrate: Optional[Dict[str, Any]] = ..., + *, + collect_errors: Literal[False] = ..., # default ) -> Any: ... @@ -186,7 +222,7 @@ def validate( base: Any = None, migrate: Optional[Dict[str, Any]] = None, collect_errors: bool = False, -) -> Any: +) -> Union[Any, "ValidationResult"]: # Unwrap Schema[T] to its underlying dict schema if isinstance(schema, Schema):