mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
c314f5a909
* feat: add support for `NamedTuple` and `TypedDict` types
* support `total=False`
* tests: fix ci with python < 3.8 without typing-extensions
* chore: improve mypy
* chore: @samuelcolvin remarks
* refactor: move tests in dedicated file
* docs: add annotated types section with examples
* feat: support properly required and optional fields
* chore(deps-dev): bump typing_extensions
* docs: add a note for `typing_extensions`
* chore: update message to be more accurate
* feat: pass down config to created models
* feat: add util methods to create model from TypedDict or NamedTuple
* refactor: rename into typeddict and namedtuple
* test: add utils tests
* chore: fix lint
* chore: improve test
* refactor: rename utils to match the rest
* chore: update change
* docs: add section for create_model_from_{namedtuple,typeddict}
* refactor: rename typed_dict/named_tuple
* feat: support schema with TypedDict
* feat: support schema for NamedTuple
* feat: add json support for NamedTuple
* chore: rewording
* refactor: use parse_obj
* fix: add check for max items in tuple
* docs: separate typing.NamedTuple and collections.namedtuple
57 lines
1.4 KiB
Python
57 lines
1.4 KiB
Python
from collections import namedtuple
|
|
from typing import NamedTuple
|
|
|
|
import pytest
|
|
|
|
from pydantic.typing import is_namedtuple, is_typeddict
|
|
|
|
try:
|
|
from typing import TypedDict as typing_TypedDict
|
|
except ImportError:
|
|
typing_TypedDict = None
|
|
|
|
try:
|
|
from typing_extensions import TypedDict as typing_extensions_TypedDict
|
|
except ImportError:
|
|
typing_extensions_TypedDict = None
|
|
|
|
|
|
try:
|
|
from mypy_extensions import TypedDict as mypy_extensions_TypedDict
|
|
except ImportError:
|
|
mypy_extensions_TypedDict = None
|
|
|
|
ALL_TYPEDDICT_KINDS = (typing_TypedDict, typing_extensions_TypedDict, mypy_extensions_TypedDict)
|
|
|
|
|
|
def test_is_namedtuple():
|
|
class Employee(NamedTuple):
|
|
name: str
|
|
id: int = 3
|
|
|
|
assert is_namedtuple(namedtuple('Point', 'x y')) is True
|
|
assert is_namedtuple(Employee) is True
|
|
assert is_namedtuple(NamedTuple('Employee', [('name', str), ('id', int)])) is True
|
|
|
|
class Other(tuple):
|
|
name: str
|
|
id: int
|
|
|
|
assert is_namedtuple(Other) is False
|
|
|
|
|
|
@pytest.mark.parametrize('TypedDict', (t for t in ALL_TYPEDDICT_KINDS if t is not None))
|
|
def test_is_typeddict_typing(TypedDict):
|
|
class Employee(TypedDict):
|
|
name: str
|
|
id: int
|
|
|
|
assert is_typeddict(Employee) is True
|
|
assert is_typeddict(TypedDict('Employee', {'name': str, 'id': int})) is True
|
|
|
|
class Other(dict):
|
|
name: str
|
|
id: int
|
|
|
|
assert is_typeddict(Other) is False
|