Data parsing and validation using Python type hints

Overview

pydantic

CI Coverage pypi CondaForge downloads versions license

Data validation and settings management using Python type hinting.

Fast and extensible, pydantic plays nicely with your linters/IDE/brain. Define how data should be in pure, canonical Python 3.6+; validate it with pydantic.

Help

See documentation for more details.

Installation

Install using pip install -U pydantic or conda install pydantic -c conda-forge. For more installation options to make pydantic even faster, see the Install section in the documentation.

A Simple Example

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: Optional[datetime] = None
    friends: List[int] = []

external_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']}
user = User(**external_data)
print(user)
#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
print(user.id)
#> 123

Contributing

For guidance on setting up a development environment and how to make a contribution to pydantic, see Contributing to Pydantic.

Reporting a Security Vulnerability

See our security policy.

Comments
  • [Feature Request] Provide a discriminated union type (OpenAPI 3)

    [Feature Request] Provide a discriminated union type (OpenAPI 3)

    Feature Request

    Pydantic currently has a decent support for union types through the typing.Union type from PEP484, but it does not currently cover all the cases covered by the JSONSchema and OpenAPI specifications, most likely because the two specifications diverge on those points.

    OpenAPI supports something similar to tagged unions where a certain field is designated to serve as a "discriminator", which is then matched against literal values to determine which of multiple schemas to use for payload validation. In order to allow Pydantic to support those, I suppose there would have to be a specific type similar to typing.Union in order to specify what discriminator field to use and how to match it. Such a type would then be rendered into a schema object (oneOf) with an OpenAPI discriminator object built into it, as well as correctly validate incoming JSON into the correct type based on the value or the discriminator field. This change would only impact OpenAPI, as JSON schema (draft 7 onwards) uses conditional types instead, which would probably need to be the topic of a different feature request, as both methods appear mutually incompatible.

    Implementation ideas

    I'd imagine the final result to be something like this.

    MyUnion = Union[Foo, Bar]
    MyTaggedUnion = TaggedUnion(Union[Foo, Bar], discriminator='type', mapping={'foo': Foo, 'bar': Bar}))
    

    Python doesn't have a feature like TypeScript to let you statically ensure that discriminator exists as a field for all variants of that union, though that shouldn't be a problem since this is going to be raised during validation regardless.

    discriminator and mapping could also simply be added to Schema, though I'm not sure about whether it's a good idea to add OpenAPI-specific extensions there.

    PEP 593 would also have been a nice alternative, since it would hypothetically allow tagged unions to be implemented as a regular union with annotations specific to Pydantic for that purpose, however it is only still a draft and most likely won't make it until Python 3.9 (if at all).

    feature request help wanted Schema 
    opened by sm-Fifteen 59
  • Class attributes starting with underscore do not support assignment

    Class attributes starting with underscore do not support assignment

    Bug

    For bugs/questions:

    • OS: macOS
    • Python version import sys; print(sys.version): 3.6.6
    • Pydantic version import pydantic; print(pydantic.VERSION): 0.14

    In #184 it was suggested to use variables starting with the underscore, however this does not work. The last comment in #184 referred to the same problem, but it is technically a separate issue.

    from pydantic import BaseModel
    m = BaseModel()
    m._foo = "bar"
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/dmfigol/projects/my/public/simple-smartsheet/.venv/lib/python3.6/site-packages/pydantic/main.py", line 176, in __setattr__
        raise ValueError(f'"{self.__class__.__name__}" object has no field "{name}"')
    ValueError: "BaseModel" object has no field "_foo"
    
    feature request help wanted 
    opened by dmfigol 48
  • PEP 563, PEP 649 and pydantic

    PEP 563, PEP 649 and pydantic

    Update 2: see https://github.com/samuelcolvin/pydantic/issues/2678#issuecomment-1008139014, for a summary of how PEP 563 could effect pydantic.


    Update: see below this has been resolved by a changes in python 3.10 from the python steering council.

    Thanks everyone for your thoughts, patience and hard work.


    PEP 563 "Postponed Evaluation of Annotations" was introduced in python 3.7 behind the from __future__ import annotations switch, it basically meant all annotations are strings, not python objects.

    Pydantic has tried to supported Postponed Annotations since v0.18.0, see #348.

    The problem however is that trying to evaluate those strings to get the real annotation objects is really hard, perhaps impossible to always do correctly, see #248 #234 #397 #415 #486 #531 #545 #635 #655 #704 #1298 #1332 #1345 #1370 #1668 #1736 #1873 #1895 #2112 #2314 #2323 #2411

    The reasons are complicated but basically typing.get_type_hints() doesn't work all the time and neither do the numerous hacks we've introduced to try and get fix it. Even if typing.get_type_hints() was faultless, it would still be massively slower than the current semantics or PEP 649 (see below).

    In short - pydantic doesn't work very well with postponed annotations, perhaps it never will.

    The Problem

    The problem is that postponed annotations are set to be come default in 3.10, features of which will be frozen in about three week.

    Even worse, there's no way to switch back to the current behaviour.

    The Solution

    The solution to this is PEP 649 developed by Larry Hastings. This basically means annotations evaluation is lazy - the work of building __annotations__ isn't done until you access __annotations__.

    As far as I can tell this is the best of both worlds.

    The Second Problem

    The sad reality however is that it seems very possible that PEP 649 will get rejected and when python 3.10 is released it will break much of pydantic, and thereby FastAPI and all the other libraries that rely on pydantic (as well as other libraries that use annotations at runtime like enforce and typer presumably).

    See this very long discussion of the issue on python-dev about whether PEP 649 is a good idea.


    The Point

    So why am I saying all this apart from whinging about something I don't agree with?

    1. This is fair warning

    That pydantic might break in a big way if python's core developers continue value principle over pragmatism.

    2. You can help

    Thousands of developers and organisations big and small rely on pydantic. Type hints might have been conceived to help readers and static type checkers, but they're now used to great effect at runtime by lots and lots of people - they make python better.

    In the end I don't think python's core developers and steering council want to make your experience of python worse. They just haven't realised how important this is. (Even Larry hadn't heard of pydantic or FastAPI until yesterday when he emailed me, I guess they don't read the python developer survey 😉)

    ~If you value pydantic or FastAPI or other libraries that use annotations at runtime, please (constructively and respectfully) let the python steering council know that you would like PEP 649 to be accepted.~ Please don't contact members of the python community, they're aware of this issue (see below) and are taking it seriously.

    I understand the decision on PEP 649 will be made over the next few days, ~so if you're going to do anything do it today~.

    Meta 
    opened by samuelcolvin 45
  • Change default cython flags to have smaller compiled files

    Change default cython flags to have smaller compiled files

    Pip install results in a much larger lib artefact compared to conda install (both in a conda environment):

    • pip install pydantic: 80M
    • conda install pydantic -c conda-forge: 6.6M

    I don't know if this is expected or not. I encountered this while trying to minimize the size of a Docker container I'm building, and was surprised that pydantic took up 80M when installed with pip.

    I wasn't sure to file this as bug or not, but given the extreme difference in size I thought there might be something going wrong with the pip install.

    I've added a full list of the files in site-packages:

    Pip install file sizes

    > du -sh /opt/conda/lib/python3.8/site-packages/pydantic/* | sort -h
    0	/opt/conda/lib/python3.8/site-packages/pydantic/py.typed
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/__init__.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/json.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/parse.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/tools.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/version.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/datetime_parse.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/env_settings.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/error_wrappers.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/generics.py
    12K	/opt/conda/lib/python3.8/site-packages/pydantic/dataclasses.py
    12K	/opt/conda/lib/python3.8/site-packages/pydantic/decorator.py
    12K	/opt/conda/lib/python3.8/site-packages/pydantic/typing.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/class_validators.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/errors.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/networks.py
    20K	/opt/conda/lib/python3.8/site-packages/pydantic/color.py
    20K	/opt/conda/lib/python3.8/site-packages/pydantic/validators.py
    24K	/opt/conda/lib/python3.8/site-packages/pydantic/utils.py
    28K	/opt/conda/lib/python3.8/site-packages/pydantic/mypy.py
    28K	/opt/conda/lib/python3.8/site-packages/pydantic/types.py
    32K	/opt/conda/lib/python3.8/site-packages/pydantic/fields.py
    40K	/opt/conda/lib/python3.8/site-packages/pydantic/main.py
    40K	/opt/conda/lib/python3.8/site-packages/pydantic/schema.py
    196K	/opt/conda/lib/python3.8/site-packages/pydantic/__init__.cpython-38-x86_64-linux-gnu.so
    332K	/opt/conda/lib/python3.8/site-packages/pydantic/__pycache__
    516K	/opt/conda/lib/python3.8/site-packages/pydantic/parse.cpython-38-x86_64-linux-gnu.so
    552K	/opt/conda/lib/python3.8/site-packages/pydantic/version.cpython-38-x86_64-linux-gnu.so
    684K	/opt/conda/lib/python3.8/site-packages/pydantic/tools.cpython-38-x86_64-linux-gnu.so
    948K	/opt/conda/lib/python3.8/site-packages/pydantic/json.cpython-38-x86_64-linux-gnu.so
    1.4M	/opt/conda/lib/python3.8/site-packages/pydantic/datetime_parse.cpython-38-x86_64-linux-gnu.so
    1.5M	/opt/conda/lib/python3.8/site-packages/pydantic/error_wrappers.cpython-38-x86_64-linux-gnu.so
    1.6M	/opt/conda/lib/python3.8/site-packages/pydantic/env_settings.cpython-38-x86_64-linux-gnu.so
    1.7M	/opt/conda/lib/python3.8/site-packages/pydantic/dataclasses.cpython-38-x86_64-linux-gnu.so
    2.0M	/opt/conda/lib/python3.8/site-packages/pydantic/typing.cpython-38-x86_64-linux-gnu.so
    2.1M	/opt/conda/lib/python3.8/site-packages/pydantic/decorator.cpython-38-x86_64-linux-gnu.so
    2.7M	/opt/conda/lib/python3.8/site-packages/pydantic/class_validators.cpython-38-x86_64-linux-gnu.so
    3.4M	/opt/conda/lib/python3.8/site-packages/pydantic/color.cpython-38-x86_64-linux-gnu.so
    4.0M	/opt/conda/lib/python3.8/site-packages/pydantic/networks.cpython-38-x86_64-linux-gnu.so
    5.1M	/opt/conda/lib/python3.8/site-packages/pydantic/validators.cpython-38-x86_64-linux-gnu.so
    5.2M	/opt/conda/lib/python3.8/site-packages/pydantic/utils.cpython-38-x86_64-linux-gnu.so
    6.2M	/opt/conda/lib/python3.8/site-packages/pydantic/mypy.cpython-38-x86_64-linux-gnu.so
    6.4M	/opt/conda/lib/python3.8/site-packages/pydantic/errors.cpython-38-x86_64-linux-gnu.so
    6.4M	/opt/conda/lib/python3.8/site-packages/pydantic/fields.cpython-38-x86_64-linux-gnu.so
    8.0M	/opt/conda/lib/python3.8/site-packages/pydantic/schema.cpython-38-x86_64-linux-gnu.so
    8.5M	/opt/conda/lib/python3.8/site-packages/pydantic/main.cpython-38-x86_64-linux-gnu.so
    11M	/opt/conda/lib/python3.8/site-packages/pydantic/types.cpython-38-x86_64-linux-gnu.so
    

    Conda install file sizes:

    > du -sh /opt/conda/lib/python3.8/site-packages/pydantic/* | sort -h
    0	/opt/conda/lib/python3.8/site-packages/pydantic/py.typed
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/__init__.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/json.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/parse.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/tools.py
    4.0K	/opt/conda/lib/python3.8/site-packages/pydantic/version.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/dataclasses.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/datetime_parse.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/decorator.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/env_settings.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/error_wrappers.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/generics.py
    8.0K	/opt/conda/lib/python3.8/site-packages/pydantic/typing.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/class_validators.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/errors.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/networks.py
    16K	/opt/conda/lib/python3.8/site-packages/pydantic/validators.py
    20K	/opt/conda/lib/python3.8/site-packages/pydantic/color.py
    20K	/opt/conda/lib/python3.8/site-packages/pydantic/utils.py
    28K	/opt/conda/lib/python3.8/site-packages/pydantic/mypy.py
    28K	/opt/conda/lib/python3.8/site-packages/pydantic/types.py
    32K	/opt/conda/lib/python3.8/site-packages/pydantic/fields.py
    36K	/opt/conda/lib/python3.8/site-packages/pydantic/main.py
    36K	/opt/conda/lib/python3.8/site-packages/pydantic/schema.py
    48K	/opt/conda/lib/python3.8/site-packages/pydantic/__init__.cpython-38-x86_64-linux-gnu.so
    80K	/opt/conda/lib/python3.8/site-packages/pydantic/tools.cpython-38-x86_64-linux-gnu.so
    84K	/opt/conda/lib/python3.8/site-packages/pydantic/parse.cpython-38-x86_64-linux-gnu.so
    88K	/opt/conda/lib/python3.8/site-packages/pydantic/version.cpython-38-x86_64-linux-gnu.so
    116K	/opt/conda/lib/python3.8/site-packages/pydantic/json.cpython-38-x86_64-linux-gnu.so
    144K	/opt/conda/lib/python3.8/site-packages/pydantic/datetime_parse.cpython-38-x86_64-linux-gnu.so
    156K	/opt/conda/lib/python3.8/site-packages/pydantic/env_settings.cpython-38-x86_64-linux-gnu.so
    164K	/opt/conda/lib/python3.8/site-packages/pydantic/dataclasses.cpython-38-x86_64-linux-gnu.so
    188K	/opt/conda/lib/python3.8/site-packages/pydantic/error_wrappers.cpython-38-x86_64-linux-gnu.so
    188K	/opt/conda/lib/python3.8/site-packages/pydantic/typing.cpython-38-x86_64-linux-gnu.so
    192K	/opt/conda/lib/python3.8/site-packages/pydantic/decorator.cpython-38-x86_64-linux-gnu.so
    280K	/opt/conda/lib/python3.8/site-packages/pydantic/errors.cpython-38-x86_64-linux-gnu.so
    296K	/opt/conda/lib/python3.8/site-packages/pydantic/class_validators.cpython-38-x86_64-linux-gnu.so
    308K	/opt/conda/lib/python3.8/site-packages/pydantic/networks.cpython-38-x86_64-linux-gnu.so
    324K	/opt/conda/lib/python3.8/site-packages/pydantic/__pycache__
    356K	/opt/conda/lib/python3.8/site-packages/pydantic/color.cpython-38-x86_64-linux-gnu.so
    360K	/opt/conda/lib/python3.8/site-packages/pydantic/utils.cpython-38-x86_64-linux-gnu.so
    452K	/opt/conda/lib/python3.8/site-packages/pydantic/fields.cpython-38-x86_64-linux-gnu.so
    456K	/opt/conda/lib/python3.8/site-packages/pydantic/validators.cpython-38-x86_64-linux-gnu.so
    472K	/opt/conda/lib/python3.8/site-packages/pydantic/mypy.cpython-38-x86_64-linux-gnu.so
    480K	/opt/conda/lib/python3.8/site-packages/pydantic/types.cpython-38-x86_64-linux-gnu.so
    572K	/opt/conda/lib/python3.8/site-packages/pydantic/main.cpython-38-x86_64-linux-gnu.so
    572K	/opt/conda/lib/python3.8/site-packages/pydantic/schema.cpython-38-x86_64-linux-gnu.so
    

    Bug

    Output of python -c "import pydantic.utils; print(pydantic.utils.version_info())" from conda install:

    root@c6b3b43340a6:/# python -c "import pydantic.utils; print(pydantic.utils.version_info())"
                 pydantic version: 1.6.1
                pydantic compiled: True
                     install path: /opt/conda/lib/python3.8/site-packages/pydantic
                   python version: 3.8.5 (default, Sep  4 2020, 07:30:14)  [GCC 7.3.0]
                         platform: Linux-5.8.0-38-generic-x86_64-with-glibc2.10
         optional deps. installed: []
    

    Output of python -c "import pydantic.utils; print(pydantic.utils.version_info())" from pip install:

    root@c6b3b43340a6:/# python -c "import pydantic.utils; print(pydantic.utils.version_info())"
                 pydantic version: 1.7.3
                pydantic compiled: True
                     install path: /opt/conda/lib/python3.8/site-packages/pydantic
                   python version: 3.8.5 (default, Sep  4 2020, 07:30:14)  [GCC 7.3.0]
                         platform: Linux-5.8.0-38-generic-x86_64-with-glibc2.10
         optional deps. installed: []
    

    conda info:

         active environment : base
        active env location : /opt/conda
                shell level : 1
           user config file : /root/.condarc
     populated config files : /root/.condarc
              conda version : 4.9.2
        conda-build version : not installed
             python version : 3.8.5.final.0
           virtual packages : __glibc=2.28=0
                              __unix=0=0
                              __archspec=1=x86_64
           base environment : /opt/conda  (writable)
               channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                              https://repo.anaconda.com/pkgs/main/noarch
                              https://repo.anaconda.com/pkgs/r/linux-64
                              https://repo.anaconda.com/pkgs/r/noarch
              package cache : /opt/conda/pkgs
                              /root/.conda/pkgs
           envs directories : /opt/conda/envs
                              /root/.conda/envs
                   platform : linux-64
                 user-agent : conda/4.9.2 requests/2.25.1 CPython/3.8.5 Linux/5.8.0-38-generic debian/10 glibc/2.28
                    UID:GID : 0:0
                 netrc file : None
               offline mode : False
    
    Change Feedback Wanted 
    opened by peterroelants 45
  • Support discriminated union

    Support discriminated union

    Change Summary

    Add discriminated union support and support open api spec about it

    Related issue number

    closes #619 closes #3113

    Checklist

    • [x] Unit tests for the changes exist
    • [x] Tests pass on CI and coverage remains at 100%
    • [x] Documentation reflects the changes where applicable
    • [x] changes/<pull request or issue id>-<github username>.md file added describing change (see changes/README.md for details)
    ready for review 
    opened by PrettyWood 44
  • Auto-completion when instantiating BaseModel objects

    Auto-completion when instantiating BaseModel objects

    Feature Request

    Hi! Currently auto-completion does not work well when calling the initializer of classes that inherit from pydantic.BaseModel, at least in IntelliJ / PyCharm.

    Are there any plans to improve that? Auto-completion works nicely with dataclasses from the python 3.7 standard library. Same applies to highlighting type mismatches or missing arguments in the call. Here is a comparison of the behavior in IntelliJ:

    image

    image

    Code example to reproduce the screenshots:

    from pydantic import BaseModel
    from dataclasses import dataclass
    
    
    class User(BaseModel):
        id: int
        name: str
        age: float
    
    
    @dataclass
    class UserDataclass:
        id: int
        name: str
        age: float
    
    
    # no auto-completion
    user = User()
    
    # auto-completion
    user_dataclass = UserDataclass()
    

    Thanks for creating pydantic! Best regards, Marlon

    feature request Feedback Wanted 
    opened by marlonjan 42
  • mypy: invalid type comment or annotation

    mypy: invalid type comment or annotation

    Hi,

    I think this issue related more to mypy, but maybe you know about any workaround or how to solve this.

    Here is my code:

    class Test(BaseModel):
        k: constr(min_length=2)
    

    And when I run mypy I got:

    error: invalid type comment or annotation
    note: Suggestion: use constr[...] instead of constr(...)
    

    Any ideas?

    opened by Gr1N 38
  • Question: add private attribute

    Question: add private attribute

    I have a use case that I'd to add an attribute when initialising the instance which is not part of the model, thus should not be validated. Is that possible?

    Here's a practical example:

    from pydantic import BaseModel
    from datetime import datetime
    
    class Test(BaseModel):
        a: int
    
    class TestExtra(BaseModel):
        a: int
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self._processed_at = datetime.utcnow()
    
    test = {"a": 1}
    Test(**test)
    TestExtra(**test)  # ValueError: "TestExtra" object has no field "_processed_at"
    
    opened by rrbarbosa 37
  • StrictBool

    StrictBool

    Thank you for bringing types into python -- it makes daily life so much easier :)

    However, I think there's a pretty serious bug with the bool validator.

    Minimal working example:

    from pydantic import BaseModel
    
    class Model(BaseModel):
        a: bool
    
    Model(a=1) # should cause exception
    Model(a="snap") # should cause exception
    

    a should be a bool and only a bool. If a user provides any other value to the endpoint (using fastapi), the database throws because it's the wrong type.

    I cannot think of a single type that can be passed to bool(X) that won't return a boolean, and yet bool_validator returns that coercion. e.g. bool({"moo": 1}) == True. This makes the validator completely useless :(

    Is there a reason behind this? And if it needs to stay as is, do you think adding a strict mode to the validator is an option?

    Also, as an aside, there are no unit tests for the function.

    I'm very happy to make a PR (adding some unit tests as well!) because it shouldn't take long, but I need to understand if there's a reason for this first.

    Thanks!

    feature request help wanted Feedback Wanted 
    opened by cazgp 36
  • Refactored extra types to use a single enum

    Refactored extra types to use a single enum

    Change Summary

    Use a single value to describe allowing extra attributes or ignoring them, by using an enum:

    class ExtraAttributes(Enum):
        DISALLOW_MUTATION = auto()
        ALWAYS_DISALLOW = auto()
        MUTATION_ONLY = auto()
        ALWAYS_ALLOW = auto()
    
        def allow_mutation(self):
            return self in (self.MUTATION_ONLY, self.ALWAYS_ALLOW)
    
        def should_ignore(self):
            return self in (self.DISALLOW_MUTATION, self.MUTATION_ONLY)
    

    Related issue number

    #351

    Checklist

    • [x] Unit tests for the changes exist
    • [ ] Tests pass on CI and coverage remains at 100%
    • [ ] Documentation reflects the changes where applicable
    • [ ] HISTORY.rst has been updated
      • if this is the first change since a release, please add a new section
      • include the issue number or this pull request number #<number>
      • include your github username @<whomever>
    opened by liiight 35
  • allow for shallow copies

    allow for shallow copies

    Change Summary

    Related issue number

    Fix #4092.

    Checklist

    • [x] Unit tests for the changes exist
    • [x] Tests pass on CI and coverage remains at 100%
    • [x] Documentation reflects the changes where applicable
    • [x] changes/<pull request or issue id>-<github username>.md file added describing change (see changes/README.md for details)
    • [x] My PR is ready to review, please add a comment including the phrase "please review" to assign reviewers
    ready for review 
    opened by timkpaine 33
  • Make base config a dict

    Make base config a dict

    fix #4673

    There are still some open TODOs related to the ConfigDict. Perhaps you can give me a hint what you want to do with it @samuelcolvin And i haven't adjusted the docs because i think you have mentioned somewhere the docs for v2 will be rewritten anyway. But let me know if i should update it anyway.

    opened by florianfischer91 1
  • Composable JSON schemas

    Composable JSON schemas

    Initial Checks

    • [X] I have searched Google & GitHub for similar requests and couldn't find anything
    • [X] I have read and followed the docs and still think this feature is missing

    Description

    I'm not really sure if this is a feature request or a bug to be honest, but I'm reasonably certain it doesn't belong in the discussion forum.

    I have a traditional Pydantic model that looks something like this:

    from __future__ import annotations
    from enum import Enum
    from pydantic import BaseModel, Extra, Field
    from typing import Any
    
    class Status(Enum):
        UNKNOWN = "Unknown"
        TRUE = "True"
        FALSE = "False"
    
        @classmethod
        def __modify_schema__(cls, schema: dict[str, Any]) -> None:
            # Pydantic isn't able to determine this type by itself during schema generation.
            schema["type"] = "string"
    
    class Condition(BaseModel, frozen=True, extra=Extra.forbid, allow_population_by_field_name=True):
        type_: str = Field(alias="type")
        status: ConditionStatus
    

    Critically, it contains an enum as a subtype.

    I have another class that is a custom data type. It's essentially a set dedicated to Condition objects:

    from collections.abc import Iterable, Iterator, Set
    from pydantic.typing import CallableGenerator
    
    class Conditions(Set[Condition]):
        def __init__(self, conditions: Iterable[Condition]):
            self._conditions = frozenset(conditions)
    
        @classmethod
        def __get_validators__(cls) -> CallableGenerator:
            yield cls.validate
    
        @classmethod
        def validate(cls, value: Any) -> Conditions:
            if isinstance(value, Conditions):
                return value
    
            if not isinstance(value, Iterable):
                raise TypeError("Must provide an iterable of Condition objects.")
    
            def iter_check(value: Iterable[Any]) -> Iterator[Condition]:
                for i, condition in enumerate(value, start=1):
                    if isinstance(condition, Condition):
                        yield condition
                    else:
                        raise TypeError(f"Entry {i} is not a Condition object: {condition!r}")
    
            return cls(iter_check(value))
    
        def __iter__(self) -> Iterator[Condition]:
            return iter(self._conditions)
    
        def __contains__(self, value: Any) -> bool:
            return value in self._conditions
    
        def __len__(self) -> int:
            return len(self._conditions)
    

    All of this works fine, except when it comes time to generate a JSON schema. For context, this Conditions class is used as the type of a field in a much bigger Pydantic model, and I'm generating the schema from that model.

    The first problem is that Pydantic doesn't understand the inheritance from collections.abc.Set at all. There is no schema generated for the class by default, and in fact attempting to do so produces an error:

    ValueError: Value not declarable with JSON Schema, field: name='conditions' type=Conditions required=True
    

    Ideally Pydantic would understand that I've extended collections.abc.Set, and that the generic type (Condition) is a Pydantic model, and then it could in fact generate a full schema from that automatically. However it doesn't right now, and as support will probably never arrive in Pydantic 1.10, I need to keep searching for a solution.

    The next thing to try is writing a __modify_schema__ method for the Conditions class:

    @classmethod
    def __modify_schema__(cls, schema: dict[str, Any]) -> None:
        schema["type"] = "array"
        schema["uniqueItems"] = True
        schema["items"] = {}
    

    Writing just that code works, but it's sub-optimal. There's no type safety for the Condition type that we know we're wrapping. Unfortunately, I can't find a good way of handling this, only things that amount to hackz.

    I attempted to replace the empty dictionary with this:

    schema["items"] = Condition.schema()
    

    It "works" in that the code runs, but the full generated schema for the overall model is invalid. The problem is that Condition.schema() lacks context of the overall schema generation operation. It generates a definitions object (and $refs pointing at the definitions object), but all of that is nested inside an object. The generated $refs point at things that don't exist.

    This is where the title of this issue comes in: the schema generation isn't composable. If there was a way to tell the schema generation code "don't use a global definitions store to generate this schema", I could trivially nest one schema inside another.

    Alas, this isn't possible, and attempting to make that possible would likely require a significant refactoring of the existing schema generation code, so I keep on searching. My next idea is to keep doing schema["items"] = Condition.schema(), and just fix the generated schema in the Condition class' __modify_schema__ method. This way the hackz is kept local and limited in scope, and avoids needing to reinvent the wheel wherever it may be used.

    Unfortunately for whatever reason, the __modify_schema__ method of the class you call .schema() on doesn't get called. Instead, you're expected to use schema_extra in the model's config. The schema_extra config option can either be a static dictionary, or a callable. I don't really understand why the distinction is necessary. When using kwargs for model config (as opposed to the nested Config class), passing a callable just feels weird. I suspect this approach will work, though I haven't tried it yet. Getting to this point is what prompted me to create the issue.


    To summarise, there are three problems here:

    1. Pydantic doesn't understand the meaning of a custom data type that inherits from collections.abc.Set, and isn't able to use its generic type in schema generation.
    2. There is no way to generate a composable schema that doesn't use $ref.
    3. The __modify_schema__ method is not called when generating that model's schema specifically, for no discernible reason.

    Please let me know if you require any further context for the code samples I've provided, or if you need any other information I might have missed :pray:

    Affected Components

    feature request 
    opened by mwgamble 2
  • Initiate inherited fields with the base class env_prefix

    Initiate inherited fields with the base class env_prefix

    Initial Checks

    • [X] I have searched Google & GitHub for similar requests and couldn't find anything
    • [X] I have read and followed the docs and still think this feature is missing

    Description

    It would be good if possible to initiate the inherited fields from env variable using the base class env_prefix if the subclass used env_prefix not found example below :

    from pydantic import BaseSettings
    import os
    
    class App(BaseSettings):
        class Config:
            env_prefix="APP_"
        log_level:str = "INFO"
    
    class WebApp(App):
        class Config:
            env_prefix="WEB_"
        host:str
        port:int
        
    os.environ["APP_LOG_LEVEL"] = "WARN"
    os.environ["WEB_HOST"] = "localhost"
    os.environ["WEB_PORT"] = "8989"
    print(WebApp()) # w.log_level = "INFO" -> w.log_level  = "WARN"
    

    Affected Components

    feature request 
    opened by devamin 0
  • `__fields_set__` includes excluded extras on copy

    `__fields_set__` includes excluded extras on copy

    Initial Checks

    • [X] I have searched GitHub for a duplicate issue and I'm sure this is something new
    • [X] I have searched Google & StackOverflow for a solution and couldn't find anything
    • [X] I have read and followed the docs and still think this is a bug
    • [X] I am confident that the issue is with pydantic (not my code, or another library in the ecosystem like FastAPI or mypy)

    Description

    When a model that allows extra fields is copied, excluding an extra field, that field is incorrect included in the new object's __fields_set__ dictionary which causes problems when attributes are being dynamically retrieved (e.g. https://github.com/PrefectHQ/prefect/issues/8082)

    Example Code

    from pydantic import BaseModel, Extra
    
    
    class Something(BaseModel, extra=Extra.allow):
        a: int
    
    
    o1 = Something(a=1, b=2)
    assert "b" in o1.__fields_set__, f"'b' should be included in {o1.__fields_set__}"
    o2 = o1.copy(exclude={"b"})
    assert "b" not in o2.__fields_set__, f"'b' should be excluded from {o2.__fields_set__}"
    

    Python, Pydantic & OS Version

    pydantic version: 1.10.2
                pydantic compiled: True
                     install path: /opt/homebrew/Caskroom/miniconda/base/envs/orion-dev-39/lib/python3.9/site-packages/pydantic
                   python version: 3.9.12 (main, Jun  1 2022, 06:36:29)  [Clang 12.0.0 ]
                         platform: macOS-10.16-x86_64-i386-64bit
         optional deps. installed: ['typing-extensions']
    

    Affected Components

    bug unconfirmed 
    opened by madkinsz 0
  • Protected namespaces

    Protected namespaces

    See #4617.

    We need to:

    • add the concept of protected namespaces on models, by default just model_
    • stop fields being added which conflict with them
    • With config.extra = 'allow' ignore extra items which conflict with these namespaces

    I think it's okay for users to add methods which conflict with namespaces, though we should warn in the docs that that could break in future.

    feature request 
    opened by samuelcolvin 8
Releases(v1.10.4)
  • v1.10.4(Dec 30, 2022)

    • Change dependency to typing-extensions>=4.2.0, #4885 by @samuelcolvin

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.3...v1.10.4

    Source code(tar.gz)
    Source code(zip)
  • v1.10.3(Dec 29, 2022)

    • fix parsing of custom root models, #4883 by @gou177
    • fix: use dataclass proxy for frozen or empty dataclasses, #4878 by @PrettyWood
    • Fix schema and schema_json on models where a model instance is a one of default values, #4781 by @Bobronium
    • Add Jina AI to sponsors on docs index page, #4767 by @samuelcolvin
    • fix: support assignment on DataclassProxy, #4695 by @PrettyWood
    • Add postgresql+psycopg as allowed scheme for PostgreDsn to make it usable with SQLAlchemy 2, #4689 by @morian
    • Allow dict schemas to have both patternProperties and additionalProperties, #4641 by @jparise
    • Fixes error passing None for optional lists with unique_items, #4568 by @mfulgo
    • Fix GenericModel with Callable param raising a TypeError, #4551 by @mfulgo
    • Fix field regex with StrictStr type annotation, #4538 by @sisp
    • Correct dataclass_transform keyword argument name from field_descriptors to field_specifiers, #4500 by @samuelcolvin
    • fix: avoid multiple calls of __post_init__ when dataclasses are inherited, #4487 by @PrettyWood
    • Reduce the size of binary wheels, #2276 by @samuelcolvin

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.2...v1.10.3

    Source code(tar.gz)
    Source code(zip)
  • v1.10.2(Sep 5, 2022)

    • Revert Change: Revert percent encoding of URL parts which was originally added in #4224, #4470 by @samuelcolvin
    • Prevent long (length > 4_300) strings/bytes as input to int fields, see python/cpython#95778 and CVE-2020-10735, #1477 by @samuelcolvin
    • fix: dataclass wrapper was not always called, #4477 by @PrettyWood
    • Use tomllib on Python 3.11 when parsing mypy configuration, #4476 by @hauntsaninja
    • Basic fix of GenericModel cache to detect order of arguments in Union models, #4474 by @sveinugu
    • Fix mypy plugin when using bare types like list and dict as default_factory, #4457 by @samuelcolvin

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.1...v1.10.2

    Source code(tar.gz)
    Source code(zip)
  • v1.10.1(Aug 31, 2022)

    • Add __hash__ method to pydancic.color.Color class, #4454 by @czaki

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.0...v1.10.1

    Source code(tar.gz)
    Source code(zip)
  • v1.10.0(Aug 30, 2022)

    See #4419 for feedback and discussion, docs are live at pydantic-docs.helpmanual.io.

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @PrettyWood

      BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @tlambert03
    • Allow for custom parsing of environment variables via parse_env_var in Config, #4406 by @acmiyaguchi
    • Rename master to main, #4405 by @hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @JeanArhancet
    • Add support for bare type, #4375 by @hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @samuelcolvin
    • Add support for re.Pattern, #4366 by @hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @DetachHead
    • moved repo to pydantic/pydantic, #4348 by @yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @synek
    • Update BaseModel.construct to work with aliased Fields, #4192 by @kylebamos
    • Catch certain raised errors in smart_deepcopy and revert to deepcopy if so, #4184 by @coneybeare
    • Add Config.anystr_upper and to_upper kwarg to constr and conbytes, #4165 by @satheler
    • Fix JSON schema for set and frozenset when they include default values, #4155 by @aminalaee
    • Teach the mypy plugin that methods decorated by @validator are classmethods, #4102 by @DMRobertson
    • Improve mypy plugin's ability to detect required fields, #4086 by @richardxia
    • Support fields of type Type[] in schema, #4051 by @aminalaee
    • Add default value in JSON Schema when const=True, #4031 by @aminalaee
    • Adds reserved word check to signature generation logic, #4011 by @strue36
    • Fix Json strategy failure for the complex nested field, #4005 by @sergiosim
    • Add JSON-compatible float constraint allow_inf_nan, #3994 by @tiangolo
    • Remove undefined behaviour when env_prefix had characters in common with env_nested_delimiter, #3975 by @arsenron
    • Support generics model with create_model, #3945 by @hot123s
    • allow submodels to overwrite extra field info, #3934 by @PrettyWood
    • Document and test structural pattern matching (PEP 636) on BaseModel, #3920 by @irgolic
    • Fix incorrect deserialization of python timedelta object to ISO 8601 for negative time deltas. Minus was serialized in incorrect place ("P-1DT23H59M59.888735S" instead of correct "-P1DT23H59M59.888735S"), #3899 by @07pepa
    • Fix validation of discriminated union fields with an alias when passing a model instance, #3846 by @chornsby
    • Add a CockroachDsn type to validate CockroachDB connection strings. The type supports the following schemes: cockroachdb, cockroachdb+psycopg2 and cockroachdb+asyncpg, #3839 by @blubber
    • Fix MyPy plugin to not override pre-existing __init__ method in models, #3824 by @patrick91
    • Fix mypy version checking, #3783 by @KotlinIsland
    • support overwriting dunder attributes of BaseModel instances, #3777 by @PrettyWood
    • Added ConstrainedDate and condate, #3740 by @hottwaj
    • Support kw_only in dataclasses, #3670 by @detachhead
    • Add comparison method for Color class, #3646 by @aminalaee
    • Drop support for python3.6, associated cleanup, #3605 by @samuelcolvin
    • created new function to_lower_camel() for "non pascal case" camel case, #3463 by @schlerp
    • Add checks to default and default_factory arguments in Mypy plugin, #3430 by @klaa97
    • fix mangling of inspect.signature for BaseModel, #3413 by @fix-inspect-signature
    • Adds the SecretField abstract class so that all the current and future secret fields like SecretStr and SecretBytes will derive from it, #3409 by @expobrain
    • Support multi hosts validation in PostgresDsn, #3337 by @rglsk
    • Fix parsing of very small numeric timedelta values, #3315 by @samuelcolvin
    • Update SecretsSettingsSource to respect config.case_sensitive, #3273 by @JeanArhancet
    • Add MongoDB network data source name (DSN) schema, #3229 by @snosratiershad
    • Add support for multiple dotenv files, #3222 by @rekyungmin
    • Raise an explicit ConfigError when multiple fields are incorrectly set for a single validator, #3215 by @SunsetOrange
    • Allow ellipsis on Fields inside Annotated for TypedDicts required, #3133 by @ezegomez
    • Catch overflow errors in int_validator, #3112 by @ojii
    • Adds a __rich_repr__ method to Representation class which enables pretty printing with Rich, #3099 by @willmcgugan
    • Add percent encoding in AnyUrl and descendent types, #3061 by @FaresAhmedb
    • validate_arguments decorator now supports alias, #3019 by @MAD-py
    • Avoid __dict__ and __weakref__ attributes in AnyUrl and IP address fields, #2890 by @nuno-andre
    • Add ability to use Final in a field type annotation, #2766 by @uriyyo
    • Update requirement to typing_extensions>=4.1.0 to guarantee dataclass_transform is available, #4424 by @commonism
    • Add Explosion and AWS to main sponsors, #4413 by @samuelcolvin
    • Update documentation for copy_on_model_validation to reflect recent changes, #4369 by @samuelcolvin
    • Runtime warning if __slots__ is passed to create_model, __slots__ is then ignored, #4432 by @samuelcolvin
    • Add type hints to BaseSettings.Config to avoid mypy errors, also correct mypy version compatibility notice in docs, #4450 by @samuelcolvin

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.9.0...v1.10.0

    Source code(tar.gz)
    Source code(zip)
  • v1.10.0b1(Aug 24, 2022)

    • Runtime warning if __slots__ is passed to create_model, __slots__ is then ignored, #4432 by @samuelcolvin

    Full Changelog https://github.com/pydantic/pydantic/compare/v1.10.0a2...v1.10.0b1

    Source code(tar.gz)
    Source code(zip)
  • v1.10.0a2(Aug 24, 2022)

    Docs for this pre-release are available here

    • Update requirement to typing_extensions>=4.1.0 to guarantee dataclass_transform is available, #4424 by @commonism
    • Add Explosion and AWS to main sponsors, #4413 by @samuelcolvin
    • Update documentation for copy_on_model_validation to reflect recent changes, #4369 by @samuelcolvin

    Full Changelog https://github.com/pydantic/pydantic/compare/v1.10.0a1...v1.10.0a2

    Source code(tar.gz)
    Source code(zip)
  • v1.10.0a1(Aug 22, 2022)

    Docs for this pre-release are available here!

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @PrettyWood BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @tlambert03
    • Rename master to main, #4405 by @hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @JeanArhancet
    • Add support for bare type, #4375 by @hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @samuelcolvin
    • Add support for re.Pattern, #4366 by @hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @DetachHead
    • moved repo to pydantic/pydantic, #4348 by @yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @synek
    • Update BaseModel.construct to work with aliased Fields, #4192 by @kylebamos
    • Catch certain raised errors in smart_deepcopy and revert to deepcopy if so, #4184 by @coneybeare
    • Add Config.anystr_upper and to_upper kwarg to constr and conbytes, #4165 by @satheler
    • Fix JSON schema for set and frozenset when they include default values, #4155 by @aminalaee
    • Teach the mypy plugin that methods decorated by @validator are classmethods, #4102 by @DMRobertson
    • Improve mypy plugin's ability to detect required fields, #4086 by @richardxia
    • Support fields of type Type[] in schema, #4051 by @aminalaee
    • Add default value in JSON Schema when const=True, #4031 by @aminalaee
    • Adds reserved word check to signature generation logic, #4011 by @strue36
    • Fix Json strategy failure for the complex nested field, #4005 by @sergiosim
    • Add JSON-compatible float constraint allow_inf_nan, #3994 by @tiangolo
    • Remove undefined behaviour when env_prefix had characters in common with env_nested_delimiter, #3975 by @arsenron
    • Support generics model with create_model, #3945 by @hot123s
    • allow submodels to overwrite extra field info, #3934 by @PrettyWood
    • Document and test structural pattern matching (PEP 636) on BaseModel, #3920 by @irgolic
    • Fix incorrect deserialization of python timedelta object to ISO 8601 for negative time deltas. Minus was serialized in incorrect place ("P-1DT23H59M59.888735S" instead of correct "-P1DT23H59M59.888735S"), #3899 by @07pepa
    • Fix validation of discriminated union fields with an alias when passing a model instance, #3846 by @chornsby
    • Add a CockroachDsn type to validate CockroachDB connection strings. The type supports the following schemes: cockroachdb, cockroachdb+psycopg2 and cockroachdb+asyncpg, #3839 by @blubber
    • Fix MyPy plugin to not override pre-existing __init__ method in models, #3824 by @patrick91
    • Fix mypy version checking, #3783 by @KotlinIsland
    • support overwriting dunder attributes of BaseModel instances, #3777 by @PrettyWood
    • Added ConstrainedDate and condate, #3740 by @hottwaj
    • Support kw_only in dataclasses, #3670 by @detachhead
    • Add comparison method for Color class, #3646 by @aminalaee
    • Drop support for python3.6, associated cleanup, #3605 by @samuelcolvin
    • created new function to_lower_camel() for "non pascal case" camel case, #3463 by @schlerp
    • Add checks to default and default_factory arguments in Mypy plugin, #3430 by @klaa97
    • fix mangling of inspect.signature for BaseModel, #3413 by @fix-inspect-signature
    • Adds the SecretField abstract class so that all the current and future secret fields like SecretStr and SecretBytes will derive from it, #3409 by @expobrain
    • Support multi hosts validation in PostgresDsn, #3337 by @rglsk
    • Fix parsing of very small numeric timedelta values, #3315 by @samuelcolvin
    • Update SecretsSettingsSource to respect config.case_sensitive, #3273 by @JeanArhancet
    • Add MongoDB network data source name (DSN) schema, #3229 by @snosratiershad
    • Add support for multiple dotenv files, #3222 by @rekyungmin
    • Raise an explicit ConfigError when multiple fields are incorrectly set for a single validator, #3215 by @SunsetOrange
    • Allow ellipsis on Fields inside Annotated for TypedDicts required, #3133 by @ezegomez
    • Catch overflow errors in int_validator, #3112 by @ojii
    • Adds a __rich_repr__ method to Representation class which enables pretty printing with Rich, #3099 by @willmcgugan
    • Add percent encoding in AnyUrl and descendent types, #3061 by @FaresAhmedb
    • validate_arguments decorator now supports alias, #3019 by @MAD-py
    • Avoid __dict__ and __weakref__ attributes in AnyUrl and IP address fields, #2890 by @nuno-andre
    • Add ability to use Final in a field type annotation, #2766 by @uriyyo

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.9.0...v1.10a1

    Source code(tar.gz)
    Source code(zip)
  • v1.9.2(Aug 11, 2022)

    Revert Breaking Change: v1.9.1 introduced a breaking change where model fields were deep copied by default, this release reverts the default behaviour to match v1.9.0 and before, while also allow deep-copy behaviour via copy_on_model_validation = 'deep'. See #4092 for more information.

    • Allow for shallow copies of model fields, Config.copy_on_model_validation is now a str which must be 'none', 'deep', or 'shallow' corresponding to not copying, deep copy & shallow copy; default 'shallow', #4093 by @timkpaine
    Source code(tar.gz)
    Source code(zip)
  • v1.9.1(May 19, 2022)

    Thank you to pydantic's sponsors: @tiangolo, @stellargraph, @JonasKs, @grillazz, @Mazyod, @kevinalh, @chdsbd, @povilasb, @povilasb, @jina-ai, @mainframeindustries, @robusta-dev, @SendCloud, @rszamszur, @jodal, @hardbyte, @corleyma, @daddycocoaman, @Rehket, @jokull, @reillysiemens, @westonsteimel, @primer-io, @koxudaxi, @browniebroke, @stradivari96, @adriangb, @kamalgill, @jqueguiner, @dev-zero, @datarootsio, @RedCarpetUp for their kind support.

    • Limit the size of generics._generic_types_cache and generics._assigned_parameters to avoid unlimited increase in memory usage, #4083 by @samuelcolvin
    • Add Jupyverse and FPS as Jupyter projects using pydantic, #4082 by @davidbrochart
    • Speedup __isinstancecheck__ on pydantic models when the type is not a model, may also avoid memory "leaks", #4081 by @samuelcolvin
    • Fix in-place modification of FieldInfo that caused problems with PEP 593 type aliases, #4067 by @adriangb
    • Add support for autocomplete in VS Code via __dataclass_transform__ when using pydantic.dataclasses.dataclass, #4006 by @giuliano-oliveira
    • Remove benchmarks from codebase and docs, #3973 by @samuelcolvin
    • Typing checking with pyright in CI, improve docs on vscode/pylance/pyright, #3972 by @samuelcolvin
    • Fix nested Python dataclass schema regression, #3819 by @himbeles
    • Update documentation about lazy evaluation of sources for Settings, #3806 by @garyd203
    • Prevent subclasses of bytes being converted to bytes, #3706 by @samuelcolvin
    • Fixed "error checking inheritance of" when using PEP585 and PEP604 type hints, #3681 by @aleksul
    • Allow self referencing ClassVars in models, #3679 by @samuelcolvin
    • Fix issue with self-referencing dataclass, #3675 by @uriyyo
    • Include non-standard port numbers in rendered URLs, #3652 by @dolfinus
    • Config.copy_on_model_validation does a deep copy and not a shallow one, #3641 by @PrettyWood
    • fix: clarify that discriminated unions do not support singletons, #3636 by @tommilligan
    • Add read_text(encoding='utf-8') for setup.py, #3625 by @hswong3i
    • Fix JSON Schema generation for Discriminated Unions within lists, #3608 by @samuelcolvin
    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Dec 31, 2021)

    Thank you to pydantic's sponsors: @sthagen, @timdrijvers, @toinbis, @koxudaxi, @ginomempin, @primer-io, @and-semakin, @westonsteimel, @reillysiemens, @es3n1n, @jokull, @JonasKs, @Rehket, @corleyma, @daddycocoaman, @hardbyte, @datarootsio, @jodal, @aminalaee, @rafsaf, @jqueguiner, @chdsbd, @kevinalh, @Mazyod, @grillazz, @JonasKs, @simw, @leynier, @xfenix for their kind support.

    Highlights

    • add python 3.10 support, #2885 by @PrettyWood
    • Discriminated unions, #619 by @PrettyWood
    • Config.smart_union for better union logic, #2092 by @PrettyWood
    • Binaries for Macos M1 CPUs, #3498 by @samuelcolvin
    • Complex types can be set via nested environment variables, e.g. foo___bar, #3159 by @Air-Mark
    • add a dark mode to pydantic documentation, #2913 by @gbdlin
    • Add support for autocomplete in VS Code via __dataclass_transform__, #2721 by @tiangolo
    • Add "exclude" as a field parameter so that it can be configured using model config, #660 by @daviskirk

    v1.9.0 (2021-12-31) Changes

    • Apply update_forward_refs to Config.json_encodes prevent name clashes in types defined via strings, #3583 by @samuelcolvin
    • Extend pydantic's mypy plugin to support mypy versions 0.910, 0.920, 0.921 & 0.930, #3573 & #3594 by @PrettyWood, @christianbundy, @samuelcolvin

    v1.9.0a2 (2021-12-24) Changes

    • support generic models with discriminated union, #3551 by @PrettyWood
    • keep old behaviour of json() by default, #3542 by @PrettyWood
    • Removed typing-only __root__ attribute from BaseModel, #3540 by @layday
    • Build Python 3.10 wheels, #3539 by @mbachry
    • Fix display of extra fields with model __repr__, #3234 by @cocolman
    • models copied via Config.copy_on_model_validation always have all fields, #3201 by @PrettyWood
    • nested ORM from nested dictionaries, #3182 by @PrettyWood
    • fix link to discriminated union section by @PrettyWood

    v1.9.0a1 (2021-12-18) Changes

    • Add support for Decimal-specific validation configurations in Field(), additionally to using condecimal(), to allow better support from editors and tooling, #3507 by @tiangolo
    • Add arm64 binaries suitable for MacOS with an M1 CPU to PyPI, #3498 by @samuelcolvin
    • Fix issue where None was considered invalid when using a Union type containing Any or object, #3444 by @tharradine
    • When generating field schema, pass optional field argument (of type pydantic.fields.ModelField) to __modify_schema__() if present, #3434 by @jasujm
    • Fix issue when pydantic fail to parse typing.ClassVar string type annotation, #3401 by @uriyyo
    • Mention Python >= 3.9.2 as an alternative to typing_extensions.TypedDict, #3374 by @BvB93
    • Changed the validator method name in the Custom Errors example to more accurately describe what the validator is doing; changed from name_must_contain_space to value_must_equal_bar, #3327 by @michaelrios28
    • Add AmqpDsn class, #3254 by @kludex
    • Always use Enum value as default in generated JSON schema, #3190 by @joaommartins
    • Add support for Mypy 0.920, #3175 by @christianbundy
    • validate_arguments now supports extra customization (used to always be Extra.forbid), #3161 by @PrettyWood
    • Complex types can be set by nested environment variables, #3159 by @Air-Mark
    • Fix mypy plugin to collect fields based on pydantic.utils.is_valid_field so that it ignores untyped private variables, #3146 by @hi-ogawa
    • fix validate_arguments issue with Config.validate_all, #3135 by @PrettyWood
    • avoid dict coercion when using dict subclasses as field type, #3122 by @PrettyWood
    • add support for object type, #3062 by @PrettyWood
    • Updates pydantic dataclasses to keep _special properties on parent classes, #3043 by @zulrang
    • Add a TypedDict class for error objects, #3038 by @matthewhughes934
    • Fix support for using a subclass of an annotation as a default, #3018 by @JacobHayes
    • make create_model_from_typeddict mypy compliant, #3008 by @PrettyWood
    • Make multiple inheritance work when using PrivateAttr, #2989 by @hmvp
    • Parse environment variables as JSON, if they have a Union type with a complex subfield, #2936 by @cbartz
    • Prevent StrictStr permitting Enum values where the enum inherits from str, #2929 by @samuelcolvin
    • Make SecretsSettingsSource parse values being assigned to fields of complex types when sourced from a secrets file, just as when sourced from environment variables, #2917 by @davidmreed
    • add a dark mode to pydantic documentation, #2913 by @gbdlin
    • Make pydantic-mypy plugin compatible with pyproject.toml configuration, consistent with mypy changes. See the doc for more information, #2908 by @jrwalk
    • add python 3.10 support, #2885 by @PrettyWood
    • Correctly parse generic models with Json[T], #2860 by @geekingfrog
    • Update contrib docs re: python version to use for building docs, #2856 by @paxcodes
    • Clarify documentation about pydantic's support for custom validation and strict type checking, despite pydantic being primarily a parsing library, #2855 by @paxcodes
    • Fix schema generation for Deque fields, #2810 by @sergejkozin
    • fix an edge case when mixing constraints and Literal, #2794 by @PrettyWood
    • Fix postponed annotation resolution for NamedTuple and TypedDict when they're used directly as the type of fields within Pydantic models, #2760 by @jameysharp
    • Fix bug when mypy plugin fails on construct method call for BaseSettings derived classes, #2753 by @uriyyo
    • Add function overloading for a pydantic.create_model function, #2748 by @uriyyo
    • Fix mypy plugin issue with self field declaration, #2743 by @uriyyo
    • The colon at the end of the line "The fields which were supplied when user was initialised:" suggests that the code following it is related. Changed it to a period, #2733 by @krisaoe
    • Renamed variable schema to schema_ to avoid shadowing of global variable name, #2724 by @shahriyarr
    • Add support for autocomplete in VS Code via __dataclass_transform__, #2721 by @tiangolo
    • add missing type annotations in BaseConfig and handle max_length = 0, #2719 by @PrettyWood
    • Change orm_mode checking to allow recursive ORM mode parsing with dicts, #2718 by @nuno-andre
    • Add episode 313 of the Talk Python To Me podcast, where Michael Kennedy and Samuel Colvin discuss pydantic, to the docs, #2712 by @RatulMaharaj
    • fix JSON schema generation when a field is of type NamedTuple and has a default value, #2707 by @PrettyWood
    • Enum fields now properly support extra kwargs in schema generation, #2697 by @sammchardy
    • Make serialization of referenced pydantic models possible, #2650 by @PrettyWood
    • Add uniqueItems option to ConstrainedList, #2618 by @nuno-andre
    • Try to evaluate forward refs automatically at model creation, #2588 by @uriyyo
    • Switch docs preview and coverage display to use smokeshow, #2580 by @samuelcolvin
    • Add __version__ attribute to pydantic module, #2572 by @paxcodes
    • Add postgresql+asyncpg, postgresql+pg8000, postgresql+psycopg2, postgresql+psycopg2cffi, postgresql+py-postgresql and postgresql+pygresql schemes for PostgresDsn, #2567 by @postgres-asyncpg
    • Enable the Hypothesis plugin to generate a constrained decimal when the decimal_places argument is specified, #2524 by @cwe5590
    • Allow collections.abc.Callable to be used as type in python 3.9, #2519 by @daviskirk
    • Documentation update how to custom compile pydantic when using pip install, small change in setup.py to allow for custom CFLAGS when compiling, #2517 by @peterroelants
    • remove side effect of default_factory to run it only once even if Config.validate_all is set, #2515 by @PrettyWood
    • Add lookahead to ip regexes for AnyUrl hosts. This allows urls with DNS labels looking like IPs to validate as they are perfectly valid host names, #2512 by @sbv-csis
    • Set minItems and maxItems in generated JSON schema for fixed-length tuples, #2497 by @PrettyWood
    • Add strict argument to conbytes, #2489 by @koxudaxi
    • Support user defined generic field types in generic models, #2465 by @daviskirk
    • Add an example and a short explanation of subclassing GetterDict to docs, #2463 by @nuno-andre
    • add KafkaDsn type, HttpUrl now has default port 80 for http and 443 for https, #2447 by @MihanixA
    • Add PastDate and FutureDate types, #2425 by @Kludex
    • Support generating schema for Generic fields with subtypes, #2375 by @maximberg
    • fix(encoder): serialize NameEmail to str, #2341 by @alecgerona
    • add Config.smart_union to prevent coercion in Union if possible, see the doc for more information, #2092 by @PrettyWood
    • Add ability to use typing.Counter as a model field type, #2060 by @uriyyo
    • Add parameterised subclasses to __bases__ when constructing new parameterised classes, so that A <: B => A[int] <: B[int], #2007 by @diabolo-dan
    • Create FileUrl type that allows URLs that conform to RFC 8089. Add host_required parameter, which is True by default (AnyUrl and subclasses), False in RedisDsn, FileUrl, #1983 by @vgerak
    • add confrozenset(), analogous to conset() and conlist(), #1897 by @PrettyWood
    • stop calling parent class root_validator if overridden, #1895 by @PrettyWood
    • Add repr (defaults to True) parameter to Field, to hide it from the default representation of the BaseModel, #1831 by @fnep
    • Accept empty query/fragment URL parts, #1807 by @xavier
    Source code(tar.gz)
    Source code(zip)
  • v1.9.0a2(Dec 24, 2021)

    • support generic models with discriminated union, #3551 by @PrettyWood
    • keep old behaviour of json() by default, #3542 by @PrettyWood
    • Removed typing-only __root__ attribute from BaseModel, #3540 by @layday
    • Build Python 3.10 wheels, #3539 by @mbachry
    • Fix display of extra fields with model __repr__, #3234 by @cocolman
    • models copied via Config.copy_on_model_validation always have all fields, #3201 by @PrettyWood
    • nested ORM from nested dictionaries, #3182 by @PrettyWood
    • fix link to discriminated union section by @PrettyWood

    Full Changelog: https://github.com/samuelcolvin/pydantic/compare/v1.9.0a1...v1.9.0a2

    Discussion and feedback: #3538

    Source code(tar.gz)
    Source code(zip)
  • v1.9.0a1(Dec 18, 2021)

    See Changelog.

    Thank you to pydantic's sponsors: @timdrijvers, @toinbis, @koxudaxi, @ginomempin, @primer-io, @and-semakin, @westonsteimel, @reillysiemens, @es3n1n, @jokull, @JonasKs, @Rehket, @corleyma, @daddycocoaman, @hardbyte, @datarootsio, @jodal, @aminalaee, @rafsaf, @jqueguiner, @chdsbd, @kevinalh, @Mazyod, @grillazz, @JonasKs for their kind support.

    Highlights

    • add python 3.10 support, #2885 by @PrettyWood
    • Discriminated unions, #619 by @PrettyWood
    • Config.smart_union for better union logic, #2092 by @PrettyWood
    • Binaries for Macos M1 CPUs, #3498 by @samuelcolvin
    • Complex types can be set via nested environment variables, e.g. foo___bar, #3159 by @Air-Mark
    • add a dark mode to pydantic documentation, #2913 by @gbdlin
    • Add support for autocomplete in VS Code via __dataclass_transform__, #2721 by @tiangolo

    Changes

    • Add support for Decimal-specific validation configurations in Field(), additionally to using condecimal(), to allow better support from editors and tooling, #3507 by @tiangolo
    • Add arm64 binaries suitable for MacOS with an M1 CPU to PyPI, #3498 by @samuelcolvin
    • Fix issue where None was considered invalid when using a Union type containing Any or object, #3444 by @tharradine
    • When generating field schema, pass optional field argument (of type pydantic.fields.ModelField) to __modify_schema__() if present, #3434 by @jasujm
    • Fix issue when pydantic fail to parse typing.ClassVar string type annotation, #3401 by @uriyyo
    • Mention Python >= 3.9.2 as an alternative to typing_extensions.TypedDict, #3374 by @BvB93
    • Changed the validator method name in the Custom Errors example to more accurately describe what the validator is doing; changed from name_must_contain_space to value_must_equal_bar, #3327 by @michaelrios28
    • Add AmqpDsn class, #3254 by @kludex
    • Always use Enum value as default in generated JSON schema, #3190 by @joaommartins
    • Add support for Mypy 0.920, #3175 by @christianbundy
    • validate_arguments now supports extra customization (used to always be Extra.forbid), #3161 by @PrettyWood
    • Complex types can be set by nested environment variables, #3159 by @Air-Mark
    • Fix mypy plugin to collect fields based on pydantic.utils.is_valid_field so that it ignores untyped private variables, #3146 by @hi-ogawa
    • fix validate_arguments issue with Config.validate_all, #3135 by @PrettyWood
    • avoid dict coercion when using dict subclasses as field type, #3122 by @PrettyWood
    • add support for object type, #3062 by @PrettyWood
    • Updates pydantic dataclasses to keep _special properties on parent classes, #3043 by @zulrang
    • Add a TypedDict class for error objects, #3038 by @matthewhughes934
    • Fix support for using a subclass of an annotation as a default, #3018 by @JacobHayes
    • make create_model_from_typeddict mypy compliant, #3008 by @PrettyWood
    • Make multiple inheritance work when using PrivateAttr, #2989 by @hmvp
    • Parse environment variables as JSON, if they have a Union type with a complex subfield, #2936 by @cbartz
    • Prevent StrictStr permitting Enum values where the enum inherits from str, #2929 by @samuelcolvin
    • Make SecretsSettingsSource parse values being assigned to fields of complex types when sourced from a secrets file, just as when sourced from environment variables, #2917 by @davidmreed
    • add a dark mode to pydantic documentation, #2913 by @gbdlin
    • Make pydantic-mypy plugin compatible with pyproject.toml configuration, consistent with mypy changes. See the doc for more information, #2908 by @jrwalk
    • add python 3.10 support, #2885 by @PrettyWood
    • Correctly parse generic models with Json[T], #2860 by @geekingfrog
    • Update contrib docs re: python version to use for building docs, #2856 by @paxcodes
    • Clarify documentation about pydantic's support for custom validation and strict type checking, despite pydantic being primarily a parsing library, #2855 by @paxcodes
    • Fix schema generation for Deque fields, #2810 by @sergejkozin
    • fix an edge case when mixing constraints and Literal, #2794 by @PrettyWood
    • Fix postponed annotation resolution for NamedTuple and TypedDict when they're used directly as the type of fields within Pydantic models, #2760 by @jameysharp
    • Fix bug when mypy plugin fails on construct method call for BaseSettings derived classes, #2753 by @uriyyo
    • Add function overloading for a pydantic.create_model function, #2748 by @uriyyo
    • Fix mypy plugin issue with self field declaration, #2743 by @uriyyo
    • The colon at the end of the line "The fields which were supplied when user was initialised:" suggests that the code following it is related. Changed it to a period, #2733 by @krisaoe
    • Renamed variable schema to schema_ to avoid shadowing of global variable name, #2724 by @shahriyarr
    • Add support for autocomplete in VS Code via __dataclass_transform__, #2721 by @tiangolo
    • add missing type annotations in BaseConfig and handle max_length = 0, #2719 by @PrettyWood
    • Change orm_mode checking to allow recursive ORM mode parsing with dicts, #2718 by @nuno-andre
    • Add episode 313 of the Talk Python To Me podcast, where Michael Kennedy and Samuel Colvin discuss pydantic, to the docs, #2712 by @RatulMaharaj
    • fix JSON schema generation when a field is of type NamedTuple and has a default value, #2707 by @PrettyWood
    • Enum fields now properly support extra kwargs in schema generation, #2697 by @sammchardy
    • Make serialization of referenced pydantic models possible, #2650 by @PrettyWood
    • Add uniqueItems option to ConstrainedList, #2618 by @nuno-andre
    • Try to evaluate forward refs automatically at model creation, #2588 by @uriyyo
    • Switch docs preview and coverage display to use smokeshow, #2580 by @samuelcolvin
    • Add __version__ attribute to pydantic module, #2572 by @paxcodes
    • Add postgresql+asyncpg, postgresql+pg8000, postgresql+psycopg2, postgresql+psycopg2cffi, postgresql+py-postgresql and postgresql+pygresql schemes for PostgresDsn, #2567 by @postgres-asyncpg
    • Enable the Hypothesis plugin to generate a constrained decimal when the decimal_places argument is specified, #2524 by @cwe5590
    • Allow collections.abc.Callable to be used as type in python 3.9, #2519 by @daviskirk
    • Documentation update how to custom compile pydantic when using pip install, small change in setup.py to allow for custom CFLAGS when compiling, #2517 by @peterroelants
    • remove side effect of default_factory to run it only once even if Config.validate_all is set, #2515 by @PrettyWood
    • Add lookahead to ip regexes for AnyUrl hosts. This allows urls with DNS labels looking like IPs to validate as they are perfectly valid host names, #2512 by @sbv-csis
    • Set minItems and maxItems in generated JSON schema for fixed-length tuples, #2497 by @PrettyWood
    • Add strict argument to conbytes, #2489 by @koxudaxi
    • Support user defined generic field types in generic models, #2465 by @daviskirk
    • Add an example and a short explanation of subclassing GetterDict to docs, #2463 by @nuno-andre
    • add KafkaDsn type, HttpUrl now has default port 80 for http and 443 for https, #2447 by @MihanixA
    • Add PastDate and FutureDate types, #2425 by @Kludex
    • Support generating schema for Generic fields with subtypes, #2375 by @maximberg
    • fix(encoder): serialize NameEmail to str, #2341 by @alecgerona
    • add Config.smart_union to prevent coercion in Union if possible, see the doc for more information, #2092 by @PrettyWood
    • Add ability to use typing.Counter as a model field type, #2060 by @uriyyo
    • Add parameterised subclasses to __bases__ when constructing new parameterised classes, so that A <: B => A[int] <: B[int], #2007 by @diabolo-dan
    • Create FileUrl type that allows URLs that conform to RFC 8089. Add host_required parameter, which is True by default (AnyUrl and subclasses), False in RedisDsn, FileUrl, #1983 by @vgerak
    • add confrozenset(), analogous to conset() and conlist(), #1897 by @PrettyWood
    • stop calling parent class root_validator if overridden, #1895 by @PrettyWood
    • Add repr (defaults to True) parameter to Field, to hide it from the default representation of the BaseModel, #1831 by @fnep
    • Accept empty query/fragment URL parts, #1807 by @xavier
    • Add "exclude" as a field parameter so that it can be configured using model config instead of purely at .dict / .json export time, #660 by @daviskirk

    Full List of changes: https://github.com/samuelcolvin/pydantic/compare/v1.8.2...v1.9.0a1

    Source code(tar.gz)
    Source code(zip)
  • v1.8.2(May 11, 2021)

    See Changelog.

    Warning

    A security vulnerability, level "moderate" is fixed in v1.8.2. Please upgrade ASAP. See security advisory CVE-2021-29510.

    Changes

    • Security fix: Fix date and datetime parsing so passing either 'infinity' or float('inf') (or their negative values) does not cause an infinite loop, see security advisory CVE-2021-29510
    • fix schema generation with Enum by generating a valid name, #2575 by @PrettyWood
    • fix JSON schema generation with a Literal of an enum member, #2536 by @PrettyWood
    • Fix bug with configurations declarations that are passed as keyword arguments during class creation, #2532 by @uriyyo
    • Allow passing json_encoders in class kwargs, #2521 by @layday
    • support arbitrary types with custom __eq__, #2483 by @PrettyWood
    • support Annotated in validate_arguments and in generic models with python 3.9, #2483 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.7.4(May 11, 2021)

  • v1.6.2(May 11, 2021)

  • v1.8.1(Mar 3, 2021)

    See Changelog.

    Bug fixes for regressions and new features in v1.8

    • allow elements of Config.field to update elements of a Field, #2461 by @samuelcolvin
    • fix validation with a BaseModel field and a custom root type, #2449 by @PrettyWood
    • expose Pattern encoder to fastapi, #2444 by @PrettyWood
    • enable the Hypothesis plugin to generate a constrained float when the multiple_of argument is specified, #2442 by @tobi-lipede-oodle
    • Avoid RecursionError when using some types like Enum or Literal with generic models, #2436 by @PrettyWood
    • do not overwrite declared __hash__ in subclasses of a model, #2422 by @PrettyWood
    • fix mypy complaints on Path and UUID related custom types, #2418 by @PrettyWood
    • Support properly variable length tuples of compound types, #2416 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.8(Feb 26, 2021)

    See Changelog.

    Thank you to pydantic's sponsors: @jorgecarleitao, @BCarley, @chdsbd, @tiangolo, @matin, @linusg, @kevinalh, @koxudaxi, @timdrijvers, @mkeen, @meadsteve, @ginomempin, @primer-io, @and-semakin, @tomthorogood, @AjitZK, @westonsteimel, @Mazyod, @christippett, @CarlosDomingues, @Kludex, @r-m-n for their kind support.

    Highlights

    Changes

    • Breaking Change, remove old deprecation aliases from v1, #2415 by @samuelcolvin:
      • remove notes on migrating to v1 in docs
      • remove Schema which was replaced by Field
      • remove Config.case_insensitive which was replaced by Config.case_sensitive (default False)
      • remove Config.allow_population_by_alias which was replaced by Config.allow_population_by_field_name
      • remove model.fields which was replaced by model.__fields__
      • remove model.to_string() which was replaced by str(model)
      • remove model.__values__ which was replaced by model.__dict__
    • Breaking Change: always validate only first sublevel items with each_item. There were indeed some edge cases with some compound types where the validated items were the last sublevel ones, #1933 by @PrettyWood
    • Update docs extensions to fix local syntax highlighting, #2400 by @daviskirk
    • fix: allow utils.lenient_issubclass to handle typing.GenericAlias objects like list[str] in python >= 3.9, #2399 by @daviskirk
    • Improve field declaration for pydantic dataclass by allowing the usage of pydantic Field or 'metadata' kwarg of dataclasses.field, #2384 by @PrettyWood
    • Making typing-extensions a required dependency, #2368 by @samuelcolvin
    • Make resolve_annotations more lenient, allowing for missing modules, #2363 by @samuelcolvin
    • Allow configuring models through class kwargs, #2356 by @MrMrRobat
    • Prevent Mapping subclasses from always being coerced to dict, #2325 by @ofek
    • fix: allow None for type Optional[conset / conlist], #2320 by @PrettyWood
    • Support empty tuple type, #2318 by @PrettyWood
    • fix: python_requires metadata to require >=3.6.1, #2306 by @hukkinj1
    • Properly encode Decimal with, or without any decimal places, #2293 by @hultner
    • fix: update __fields_set__ in BaseModel.copy(update=…), #2290 by @PrettyWood
    • fix: keep order of fields with BaseModel.construct(), #2281 by @PrettyWood
    • Support generating schema for Generic fields, #2262 by @maximberg
    • Fix validate_decorator so **kwargs doesn't exclude values when the keyword has the same name as the *args or **kwargs names, #2251 by @cybojenix
    • Prevent overriding positional arguments with keyword arguments in validate_arguments, as per behaviour with native functions, #2249 by @cybojenix
    • add documentation for con* type functions, #2242 by @tayoogunbiyi
    • Support custom root type (aka __root__) when using parse_obj() with nested models, #2238 by @PrettyWood
    • Support custom root type (aka __root__) with from_orm(), #2237 by @PrettyWood
    • ensure cythonized functions are left untouched when creating models, based on #1944 by @kollmats, #2228 by @samuelcolvin
    • Resolve forward refs for stdlib dataclasses converted into pydantic ones, #2220 by @PrettyWood
    • Add support for NamedTuple and TypedDict types. Those two types are now handled and validated when used inside BaseModel or pydantic dataclass. Two utils are also added create_model_from_namedtuple and create_model_from_typeddict, #2216 by @PrettyWood
    • Do not ignore annotated fields when type is Union[Type[...], ...], #2213 by @PrettyWood
    • Raise a user-friendly TypeError when a root_validator does not return a dict (e.g. None), #2209 by @masalim2
    • Add a FrozenSet[str] type annotation to the allowed_schemes argument on the strict_url field type, #2198 by @Midnighter
    • add allow_mutation constraint to Field, #2195 by @sblack-usu
    • Allow Field with a default_factory to be used as an argument to a function decorated with validate_arguments, #2176 by @thomascobb
    • Allow non-existent secrets directory by only issuing a warning, #2175 by @davidolrik
    • fix URL regex to parse fragment without query string, #2168 by @andrewmwhite
    • fix: ensure to always return one of the values in Literal field type, #2166 by @PrettyWood
    • Support typing.Annotated hints on model fields. A Field may now be set in the type hint with Annotated[..., Field(...); all other annotations are ignored but still visible with get_type_hints(..., include_extras=True), #2147 by @JacobHayes
    • Added StrictBytes type as well as strict=False option to ConstrainedBytes, #2136 by @rlizzo
    • added Config.anystr_lower and to_lower kwarg to constr and conbytes, #2134 by @tayoogunbiyi
    • Support plain typing.Tuple type, #2132 by @PrettyWood
    • Add a bound method validate to functions decorated with validate_arguments to validate parameters without actually calling the function, #2127 by @PrettyWood
    • Add the ability to customize settings sources (add / disable / change priority order), #2107 by @kozlek
    • Fix mypy complaints about most custom pydantic types, #2098 by @PrettyWood
    • Add a Hypothesis plugin for easier property-based testing with Pydantic's custom types - usage details here, #2097 by @Zac-HD
    • add validator for None, NoneType or Literal[None], #2095 by @PrettyWood
    • Handle properly fields of type Callable with a default value, #2094 by @PrettyWood
    • Updated create_model return type annotation to return type which inherits from __base__ argument, #2071 by @uriyyo
    • Add merged json_encoders inheritance, #2064 by @art049
    • allow overwriting ClassVars in sub-models without having to re-annotate them, #2061 by @layday
    • add default encoder for Pattern type, #2045 by @PrettyWood
    • Add NonNegativeInt, NonPositiveInt, NonNegativeFloat, NonPositiveFloat, #1975 by @mdavis-xyz
    • Use % for percentage in string format of colors, #1960 by @EdwardBetts
    • Fixed issue causing KeyError to be raised when building schema from multiple BaseModel with the same names declared in separate classes, #1912 by @JSextonn
    • Add rediss (Redis over SSL) protocol to RedisDsn Allow URLs without user part (e.g., rediss://:pass@localhost), #1911 by @TrDex
    • Add a new frozen boolean parameter to Config (default: False). Setting frozen=True does everything that allow_mutation=False does, and also generates a __hash__() method for the model. This makes instances of the model potentially hashable if all the attributes are hashable, #1880 by @rhuille
    • fix schema generation with multiple Enums having the same name, #1857 by @PrettyWood
    • Added support for 13/19 digits VISA credit cards in PaymentCardNumber type, #1416 by @AlexanderSov
    • fix: prevent RecursionError while using recursive GenericModels, #1370 by @xppt
    • use enum for typing.Literal in JSON schema, #1350 by @PrettyWood
    • Fix: some recursive models did not require update_forward_refs and silently behaved incorrectly, #1201 by @PrettyWood
    • Fix bug where generic models with fields where the typevar is nested in another type a: List[T] are considered to be concrete. This allows these models to be subclassed and composed as expected, #947 by @daviskirk
    • Add Config.copy_on_model_validation flag. When set to False, pydantic will keep models used as fields untouched on validation instead of reconstructing (copying) them, #265 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Nov 30, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @timdrijvers, @BCarley, @chdsbd, @tiangolo, @matin, @linusg, @kevinalh, @jorgecarleitao, @koxudaxi, @primer-api, @mkeen, @meadsteve for their kind support.

    • fix: set right default value for required (optional) fields, #2142 by @PrettyWood
    • fix: support underscore_attrs_are_private with generic models, #2138 by @PrettyWood
    • fix: update all modified field values in root_validator when validate_assignment is on, #2116 by @PrettyWood
    • Allow pickling of pydantic.dataclasses.dataclass dynamically created from a built-in dataclasses.dataclass, #2111 by @aimestereo
    • Fix a regression where Enum fields would not propagate keyword arguments to the schema, #2109 by @bm424
    • Ignore __doc__ as private attribute when Config.underscore_attrs_are_private is set, #2090 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Nov 1, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @timdrijvers, @BCarley, @chdsbd, @tiangolo, @matin, @linusg, @kevinalh, @jorgecarleitao, @koxudaxi, @primer-api, @mkeen for their kind support.

    • fix slow GenericModel concrete model creation, allow GenericModel concrete name reusing in module, #2078 by @MrMrRobat
    • keep the order of the fields when validate_assignment is set, #2073 by @PrettyWood
    • forward all the params of the stdlib dataclass when converted into pydantic dataclass, #2065 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.7.1(Oct 28, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @timdrijvers, @BCarley, @chdsbd, @tiangolo, @matin, @linusg, @kevinalh, @jorgecarleitao, @koxudaxi, @primer-api, @mkeen for their kind support.

    • fix annotation of validate_arguments when passing configuration as argument, #2055 by @layday
    • Fix mypy assignment error when using PrivateAttr, #2048 by @aphedges
    • fix underscore_attrs_are_private causing TypeError when overriding __init__, #2047 by @samuelcolvin
    • Fixed regression introduced in v1.7 involving exception handling in field validators when validate_assignment=True, #2044 by @johnsabath
    • fix: pydantic dataclass can inherit from stdlib dataclass and Config.arbitrary_types_allowed is supported, #2042 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.7(Oct 26, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @timdrijvers, @BCarley, @chdsbd, @tiangolo, @matin, @linusg, @kevinalh, @jorgecarleitao, @koxudaxi, @primer-api for their kind support.

    Highlights

    Changes

    • Breaking Change: remove __field_defaults__, add default_factory support with BaseModel.construct. Use .get_default() method on fields in __fields__ attribute instead, #1732 by @PrettyWood
    • Rearrange CI to run linting as a separate job, split install recipes for different tasks, #2020 by @samuelcolvin
    • Allows subclasses of generic models to make some, or all, of the superclass's type parameters concrete, while also defining new type parameters in the subclass, #2005 by @choogeboom
    • Call validator with the correct values parameter type in BaseModel.__setattr__, when validate_assignment = True in model config, #1999 by @me-ransh
    • Force fields.Undefined to be a singleton object, fixing inherited generic model schemas, #1981 by @daviskirk
    • Include tests in source distributions, #1976 by @sbraz
    • Add ability to use min_length/max_length constraints with secret types, #1974 by @uriyyo
    • Also check root_validators when validate_assignment is on, #1971 by @PrettyWood
    • Fix const validators not running when custom validators are present, #1957 by @hmvp
    • add deque to field types, #1935 by @wozniakty
    • add basic support for python 3.9, #1832 by @PrettyWood
    • Fix typo in the anchor of exporting_models.md#modelcopy and incorrect description, #1821 by @KimMachineGun
    • Added ability for BaseSettings to read "secret files", #1820 by @mdgilene
    • add parse_raw_as utility function, #1812 by @PrettyWood
    • Support home directory relative paths for dotenv files (e.g. ~/.env), #1803 by @PrettyWood
    • Clarify documentation for parse_file to show that the argument should be a file path not a file-like object, #1794 by @mdavis-xyz
    • Fix false positive from mypy plugin when a class nested within a BaseModel is named Model, #1770 by @selimb
    • add basic support of Pattern type in schema generation, #1767 by @PrettyWood
    • Support custom title, description and default in schema of enums, #1748 by @PrettyWood
    • Properly represent Literal Enums when use_enum_values is True, #1747 by @noelevans
    • Allows timezone information to be added to strings to be formatted as time objects. Permitted formats are Z for UTC or an offset for absolute positive or negative time shifts. Or the timezone data can be omitted, #1744 by @noelevans
    • Add stub __init__ with python 3.6 signature for ForwardRef, #1738 by @sirtelemak
    • Fix behaviour with forward refs and optional fields in nested models, #1736 by @PrettyWood
    • add Enum and IntEnum as valid types for fields, #1735 by @PrettyWood
    • Change default value of __module__ argument of create_model from None to 'pydantic.main'. Set reference of created concrete model to it's module to allow pickling (not applied to models created in functions), #1686 by @MrMrRobat
    • Add private attributes support, #1679 by @MrMrRobat
    • add config to @validate_arguments, #1663 by @samuelcolvin
    • Allow descendant Settings models to override env variable names for the fields defined in parent Settings models with env in their Config. Previously only env_prefix configuration option was applicable, #1561 by @ojomio
    • Support ref_template when creating schema $refs, #1479 by @kilo59
    • Add a __call__ stub to PyObject so that mypy will know that it is callable, #1352 by @brianmaissy
    • pydantic.dataclasses.dataclass decorator now supports built-in dataclasses.dataclass. It is hence possible to convert an existing dataclass easily to add pydantic validation. Moreover nested dataclasses are also supported, #744 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.6.1(Jul 15, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @matin, @tiangolo, @chdsbd, @jorgecarleitao, and 1 anonymous sponsor for their kind support.

    changes:

    • fix validation and parsing of nested models with default_factory, #1710 by @PrettyWood
    Source code(tar.gz)
    Source code(zip)
  • v1.6(Jul 11, 2020)

    See Changelog.

    Thank you to pydantic's sponsors: @matin, @tiangolo, @chdsbd, @jorgecarleitao, and 1 anonymous sponsor for their kind support.

    changes:

    • Modify validators for conlist and conset to not have always=True, #1682 by @samuelcolvin
    • add port check to AnyUrl (can't exceed 65536) ports are 16 insigned bits: 0 <= port <= 2**16-1 src: rfc793 header format, #1654 by @flapili
    • Document default regex anchoring semantics, #1648 by @yurikhan
    • Use chain.from_iterable in class_validators.py. This is a faster and more idiomatic way of using itertools.chain. Instead of computing all the items in the iterable and storing them in memory, they are computed one-by-one and never stored as a huge list. This can save on both runtime and memory space, #1642 by @cool-RR
    • Add conset(), analogous to conlist(), #1623 by @patrickkwang
    • make pydantic errors (un)pickable, #1616 by @PrettyWood
    • Allow custom encoding for dotenv files, #1615 by @PrettyWood
    • Ensure SchemaExtraCallable is always defined to get type hints on BaseConfig, #1614 by @PrettyWood
    • Update datetime parser to support negative timestamps, #1600 by @mlbiche
    • Update mypy, remove AnyType alias for Type[Any], #1598 by @samuelcolvin
    • Adjust handling of root validators so that errors are aggregated from all failing root validators, instead of reporting on only the first root validator to fail, #1586 by @beezee
    • Make __modify_schema__ on Enums apply to the enum schema rather than fields that use the enum, #1581 by @therefromhere
    • Fix behavior of __all__ key when used in conjunction with index keys in advanced include/exclude of fields that are sequences, #1579 by @xspirus
    • Subclass validators do not run when referencing a List field defined in a parent class when each_item=True. Added an example to the docs illustrating this, #1566 by @samueldeklund
    • change schema.field_class_to_schema to support frozenset in schema, #1557 by @wangpeibao
    • Call __modify_schema__ only for the field schema, #1552 by @PrettyWood
    • Move the assignment of field.validate_always in fields.py so the always parameter of validators work on inheritance, #1545 by @dcHHH
    • Added support for UUID instantiation through 16 byte strings such as b'\x12\x34\x56\x78' * 4. This was done to support BINARY(16) columns in sqlalchemy, #1541 by @shawnwall
    • Add a test assertion that default_factory can return a singleton, #1523 by @therefromhere
    • Add NameEmail.__eq__ so duplicate NameEmail instances are evaluated as equal, #1514 by @stephen-bunn
    • Add datamodel-code-generator link in pydantic document site, #1500 by @koxudaxi
    • Added a "Discussion of Pydantic" section to the documentation, with a link to "Pydantic Introduction" video by Alexander Hultnér, #1499 by @hultner
    • Avoid some side effects of default_factory by calling it only once if possible and by not setting a default value in the schema, #1491 by @PrettyWood
    • Added docs about dumping dataclasses to JSON, #1487 by @mikegrima
    • Make BaseModel.__signature__ class-only, so getting __signature__ from model instance will raise AttributeError, #1466 by @MrMrRobat
    • include 'format': 'password' in the schema for secret types, #1424 by @atheuz
    • Modify schema constraints on ConstrainedFloat so that exclusiveMinimum and minimum are not included in the schema if they are equal to -math.inf and exclusiveMaximum and maximum are not included if they are equal to math.inf, #1417 by @vdwees
    • Squash internal __root__ dicts in .dict() (and, by extension, in .json()), #1414 by @patrickkwang
    • Move const validator to post-validators so it validates the parsed value, #1410 by @selimb
    • Fix model validation to handle nested literals, e.g. Literal['foo', Literal['bar']], #1364 by @DBCerigo
    • Remove user_required = True from RedisDsn, neither user nor password are required, #1275 by @samuelcolvin
    • Remove extra allOf from schema for fields with Union and custom Field, #1209 by @mostaphaRoudsari
    • Updates OpenAPI schema generation to output all enums as separate models. Instead of inlining the enum values in the model schema, models now use a $ref property to point to the enum definition, #1173 by @calvinwyoung
    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Apr 23, 2020)

  • v1.5(Apr 18, 2020)

    See Changelog.

    • Make includes/excludes arguments for .dict(), ._iter(), ..., immutable, #1404 by @AlexECX
    • Always use a field's real name with includes/excludes in model._iter(), regardless of by_alias, #1397 by @AlexECX
    • Update constr regex example to include start and end lines, #1396 by @lmcnearney
    • Confirm that shallow model.copy() does make a shallow copy of attributes, #1383 by @samuelcolvin
    • Renaming model_name argument of main.create_model() to __model_name to allow using model_name as a field name, #1367 by @kittipatv
    • Replace raising of exception to silent passing for non-Var attributes in mypy plugin, #1345 by @b0g3r
    • Remove typing_extensions dependency for python 3.8, #1342 by @prettywood
    • Make SecretStr and SecretBytes initialization idempotent, #1330 by @atheuz
    • document making secret types dumpable using the json method, #1328 by @atheuz
    • Move all testing and build to github actions, add windows and macos binaries, thank you @StephenBrown2 for much help, #1326 by @samuelcolvin
    • fix card number length check in PaymentCardNumber, PaymentCardBrand now inherits from str, #1317 by @samuelcolvin
    • Have BaseModel inherit from Representation to make mypy happy when overriding __str__, #1310 by @FuegoFro
    • Allow None as input to all optional list fields, #1307 by @prettywood
    • Add datetime field to default_factory example, #1301 by @StephenBrown2
    • Allow subclasses of known types to be encoded with superclass encoder, #1291 by @StephenBrown2
    • Exclude exported fields from all elements of a list/tuple of submodels/dicts with '__all__', #1286 by @masalim2
    • Add pydantic.color.Color objects as available input for Color fields, #1258 by @leosussan
    • In examples, type nullable fields as Optional, so that these are valid mypy annotations, #1248 by @kokes
    • Make pattern_validator() accept pre-compiled Pattern objects. Fix str_validator() return type to str, #1237 by @adamgreg
    • Document how to manage Generics and inheritance, #1229 by @esadruhn
    • update_forward_refs() method of BaseModel now copies __dict__ of class module instead of modyfying it, #1228 by @paul-ilyin
    • Support instance methods and class methods with @validate_arguments, #1222 by @samuelcolvin
    • Add default_factory argument to Field to create a dynamic default value by passing a zero-argument callable, #1210 by @prettywood
    • add support for NewType of List, Optional, etc, #1207 by @Kazy
    • fix mypy signature for root_validator, #1192 by @samuelcolvin
    • Fixed parsing of nested 'custom root type' models, #1190 by @Shados
    • Add validate_arguments function decorator which checks the arguments to a function matches type annotations, #1179 by @samuelcolvin
    • Add __signature__ to models, #1034 by @MrMrRobat
    • Refactor ._iter() method, 10x speed boost for dict(model), #1017 by @MrMrRobat
    Source code(tar.gz)
    Source code(zip)
  • v1.4(Jan 24, 2020)

    See Changelog.

    • Breaking Change: alias precedence logic changed so aliases on a field always take priority over an alias from alias_generator to avoid buggy/unexpected behaviour, see here for details, #1178 by @samuelcolvin
    • Add support for unicode and punycode in TLDs, #1182 by @jamescurtin
    • Fix cls argument in validators during assignment, #1172 by @samuelcolvin
    • completing Luhn algorithm for PaymentCardNumber, #1166 by @cuencandres
    • add support for generics that implement __get_validators__ like a custom data type, #1159 by @tiangolo
    • add support for infinite generators with Iterable, #1152 by @tiangolo
    • fix url_regex to accept schemas with +, - and . after the first character, #1142 by @samuelcolvin
    • move version_info() to version.py, suggest its use in issues, #1138 by @samuelcolvin
    • Improve pydantic import time by roughly 50% by deferring some module loading and regex compilation, #1127 by @samuelcolvin
    • Fix EmailStr and NameEmail to accept instances of themselves in cython, #1126 by @koxudaxi
    • Pass model class to the Config.schema_extra callable, #1125 by @therefromhere
    • Fix regex for username and password in URLs, #1115 by @samuelcolvin
    • Add support for nested generic models, #1104 by @dmontagu
    • add __all__ to __init__.py to prevent "implicit reexport" errors from mypy, #1072 by @samuelcolvin
    • Add support for using "dotenv" files with BaseSettings, #1011 by @acnebs
    Source code(tar.gz)
    Source code(zip)
  • v1.3(Dec 21, 2019)

    See Changelog.

    • Change schema and schema_model to handle dataclasses by using their __pydantic_model__ feature, #792 by @aviramha
    • Added option for root_validator to be skipped if values validation fails using keyword skip_on_failure=True, #1049 by @aviramha
    • Allow Config.schema_extra to be a callable so that the generated schema can be post-processed, #1054 by @selimb
    • Update mypy to version 0.750, #1057 by @dmontagu
    • Trick Cython into allowing str subclassing, #1061 by @skewty
    • Prevent type attributes being added to schema unless the attribute __schema_attributes__ is True, #1064 by @samuelcolvin
    • Change BaseModel.parse_file to use Config.json_loads, #1067 by @kierandarcy
    • Fix for optional Json fields, #1073 by @volker48
    • Change the default number of threads used when compiling with cython to one, allow override via the CYTHON_NTHREADS environment variable, #1074 by @samuelcolvin
    • Run FastAPI tests during Pydantic's CI tests, #1075 by @tiangolo
    • My mypy strictness constraints, and associated tweaks to type annotations, #1077 by @samuelcolvin
    • Add __eq__ to SecretStr and SecretBytes to allow "value equals", #1079 by @sbv-trueenergy
    • Fix schema generation for nested None case, #1088 by @lutostag
    • Consistent checks for sequence like objects, #1090 by @samuelcolvin
    • Fix Config inheritance on BaseSettings when used with env_prefix, #1091 by @samuelcolvin
    • Fix for __modify_schema__ when it conflicted with field_class_to_schema*, #1102 by @samuelcolvin
    • docs: Fix explanation of case sensitive environment variable names when populating BaseSettings subclass attributes, #1105 by @tribals
    • Rename django-rest-framework benchmark in documentation, #1119 by @frankie567
    Source code(tar.gz)
    Source code(zip)
  • v1.2(Nov 28, 2019)

    See Changelog.

    • Add benchmarks for cattrs, #513 by @sebastianmika
    • Add exclude_none option to dict() and friends, #587 by @niknetniko
    • Add benchmarks for valideer, #670 by @gsakkis
    • Add parse_obj_as and parse_file_as functions for ad-hoc parsing of data into arbitrary pydantic-compatible types, #934 by @dmontagu
    • Add allow_reuse argument to validators, thus allowing validator reuse, #940 by @dmontagu
    • Add support for mapping types for custom root models, #958 by @dmontagu
    • Mypy plugin support for dataclasses, #966 by @koxudaxi
    • Add support for dataclasses default factory, #968 by @ahirner
    • Add a ByteSize type for converting byte string (1GB) to plain bytes, #977 by @dgasmith
    • Fix mypy complaint about @root_validator(pre=True), #984 by @samuelcolvin
    • Add manylinux binaries for python 3.8 to pypi, also support manylinux2010, #994 by @samuelcolvin
    • Adds ByteSize conversion to another unit, #995 by @dgasmith
    • Fix __str__ and __repr__ inheritance for models, #1022 by @samuelcolvin
    • add testimonials section to docs, #1025 by @sullivancolin
    • Add support for typing.Literal for Python 3.8, #1026 by @dmontagu
    • Add support for required Optional with name: Optional[AnyType] = Field(...) and refactor ModelField creation to preserve required parameter value, #1031 by @tiangolo
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Nov 20, 2019)

Owner
Samuel Colvin
Software developer and CTO @nell-health. Python, javascript, rust.
Samuel Colvin
Inspects Python source files and provides information about type and location of classes, methods etc

prospector About Prospector is a tool to analyse Python code and output information about errors, potential problems, convention violations and comple

Python Code Quality Authority 1.7k Dec 31, 2022
Performant type-checking for python.

Pyre is a performant type checker for Python compliant with PEP 484. Pyre can analyze codebases with millions of lines of code incrementally – providi

Facebook 6.2k Jan 7, 2023
A system for Python that generates static type annotations by collecting runtime types

MonkeyType MonkeyType collects runtime types of function arguments and return values, and can automatically generate stub files or even add draft type

Instagram 4.1k Jan 2, 2023
A static type analyzer for Python code

pytype - ? ✔ Pytype checks and infers types for your Python code - without requiring type annotations. Pytype can: Lint plain Python code, flagging c

Google 4k Dec 31, 2022
Static type checker for Python

Static type checker for Python Speed Pyright is a fast type checker meant for large Python source bases. It can run in a “watch” mode and performs fas

Microsoft 9.4k Jan 7, 2023
Unbearably fast O(1) runtime type-checking in pure Python.

Look for the bare necessities, the simple bare necessities. Forget about your worries and your strife. — The Jungle Book.

null 1.4k Dec 29, 2022
Run-time type checker for Python

This library provides run-time type checking for functions defined with PEP 484 argument (and return) type annotations. Four principal ways to do type

Alex Grönholm 1.1k Dec 19, 2022
pycallgraph is a Python module that creates call graphs for Python programs.

Project Abandoned Many apologies. I've stopped maintaining this project due to personal time constraints. Blog post with more information. I'm happy t

gak 1.7k Jan 1, 2023
Turn your Python and Javascript code into DOT flowcharts

Notes from 2017 This is an older project which I am no longer working on. It was built before ES6 existed and before Python 3 had much usage. While it

Scott Rogowski 3k Jan 9, 2023
The strictest and most opinionated python linter ever!

wemake-python-styleguide Welcome to the strictest and most opinionated python linter ever. wemake-python-styleguide is actually a flake8 plugin with s

wemake.services 2.1k Jan 5, 2023
Optional static typing for Python 3 and 2 (PEP 484)

Mypy: Optional Static Typing for Python Got a question? Join us on Gitter! We don't have a mailing list; but we are always happy to answer questions o

Python 14.4k Jan 5, 2023
Python package to parse and generate C/C++ code as context aware preprocessor.

Devana Devana is a python tool that make it easy to parsing, format, transform and generate C++ (or C) code. This tool uses libclang to parse the code

null 5 Dec 28, 2022
fixup: Automatically add and remove python import statements

fixup: Automatically add and remove python import statements The goal is that running fixup my_file.py will automatically add or remove import stateme

null 2 May 8, 2022
Collects all accepted (partial and full scored) codes submitted within the given timeframe and saves them locally for plagiarism check.

Collects all accepted (partial and full scored) codes submitted within the given timeframe of any contest.

ARITRA BELEL 2 Dec 28, 2021
TidyPy is a tool that encapsulates a number of other static analysis tools and makes it easy to configure, execute, and review their results.

TidyPy Contents Overview Features Usage Docker Configuration Ignoring Issues Included Tools Included Reporters Included Integrations Extending TidyPy

Jason Simeone 33 Nov 27, 2022
Find dead Python code

Vulture - Find dead code Vulture finds unused code in Python programs. This is useful for cleaning up and finding errors in large code bases. If you r

Jendrik Seipp 2.4k Jan 3, 2023
Code audit tool for python.

Pylama Code audit tool for Python and JavaScript. Pylama wraps these tools: pycodestyle (formerly pep8) © 2012-2013, Florent Xicluna; pydocstyle (form

Kirill Klenov 966 Dec 29, 2022
The uncompromising Python code formatter

The Uncompromising Code Formatter “Any color you like.” Black is the uncompromising Python code formatter. By using it, you agree to cede control over

Python Software Foundation 30.7k Dec 28, 2022
A Python utility / library to sort imports.

Read Latest Documentation - Browse GitHub Code Repository isort your imports, so you don't have to. isort is a Python utility / library to sort import

Python Code Quality Authority 5.5k Jan 6, 2023