Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Override dataclass_transform behavior for RootModel #8163

Merged
merged 11 commits into from Jan 15, 2024

Conversation

Viicos
Copy link
Contributor

@Viicos Viicos commented Nov 17, 2023

Change Summary

Fixes #7418.

Seems to work as expected on mypy (you can experiment here).

For pyright, see the comment below.

There's some mypy tests for root models, but they seem to only run on mypy 1.0.1 and with the plugin.

Related issue number

Checklist

  • The pull request title is a good summary of the changes - it will be used in the changelog
  • Unit tests for the changes exist
  • Tests pass on CI
  • Documentation reflects the changes where applicable
  • My PR is ready to review, please add a comment including the phrase "please review" to assign reviewers

Selected Reviewer: @hramezani

Copy link

codspeed-hq bot commented Nov 17, 2023

CodSpeed Performance Report

Merging #8163 will not alter performance

Comparing Viicos:root-model-positional (9d9b971) with main (2e459bb)

Summary

✅ 10 untouched benchmarks

@Viicos
Copy link
Contributor Author

Viicos commented Nov 18, 2023

I don't know if this is still required in the mypy plugin if this PR gets merged?

pydantic/pydantic/mypy.py

Lines 860 to 862 in 24272b4

if is_root_model:
# convert root argument to positional argument
args[0].kind = ARG_POS if args[0].kind == ARG_NAMED else ARG_OPT

Comment on lines 30 to 39
@dataclass_transform(kw_only_default=False, field_specifiers=(PydanticModelField,))
class RootModel(BaseModel, typing.Generic[RootModelRootType]):
"""Usage docs: https://docs.pydantic.dev/2.6/concepts/models/#rootmodel-and-custom-root-types
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although this works with mypy (e.g. creating subclass of RootModel will allow positional argument for root), pyright does not support it (see: microsoft/pyright#6489 (comment)).

One workaround would be to have a metaclass for RootModel, subclassing ModelMetaclass, and we could set dataclass_transform.kw_only_default=False on this metaclass.

A fix to support having dataclass_transform applied directly on RootModel is also available, so this is up to you (see issue on pyright for more context).

@Viicos
Copy link
Contributor Author

Viicos commented Nov 20, 2023

Please review

@dmontagu
Copy link
Contributor

dmontagu commented Nov 27, 2023

My initial reaction to this is that:

  • If it is possible to do something with a sub-metaclass of ModelMetaclass, I would make a _RootModelMetaclass in an if TYPE_CHECKING: block, and in the else:, just set it to be exactly ModelMetaclass. Something like:
diff --git a/pydantic/root_model.py b/pydantic/root_model.py
diff --git a/pydantic/root_model.py b/pydantic/root_model.py
index 97381233..a0c0bf00 100644
--- a/pydantic/root_model.py
+++ b/pydantic/root_model.py
@@ -8,15 +8,23 @@ from copy import copy, deepcopy
 from pydantic_core import PydanticUndefined
 
 from . import PydanticUserError
-from ._internal import _repr
+from ._internal import _model_construction, _repr
 from .main import BaseModel, _object_setattr
 
 if typing.TYPE_CHECKING:
-    from typing import Any
+    from typing import Any, dataclass_transform
 
     from typing_extensions import Literal
 
+    from .fields import Field as PydanticModelField
+
+    @dataclass_transform(kw_only_default=False, field_specifiers=(PydanticModelField,))
+    class _RootModelMetaclass(_model_construction.ModelMetaclass, typing.Generic[typing.Any]):
+        ...
+
     Model = typing.TypeVar('Model', bound='BaseModel')
+else:
+    _RootModelMetaclass = _model_construction.ModelMetaclass
 
 
 __all__ = ('RootModel',)
@@ -25,7 +33,7 @@ __all__ = ('RootModel',)
 RootModelRootType = typing.TypeVar('RootModelRootType')
 
 
-class RootModel(BaseModel, typing.Generic[RootModelRootType]):
+class RootModel(BaseModel, typing.Generic[RootModelRootType], metaclass=_RootModelMetaclass):
     """Usage docs: https://docs.pydantic.dev/2.6/concepts/models/#rootmodel-and-custom-root-types
 
     A Pydantic `BaseModel` for the root object of the model.

I think it's best to do it in the if TYPE_CHECKING: block to keep things as performant as possible and minimize the risk that there is any possible impact on runtime behavior of existing code.

  • If this causes issues with mypy or pyright (I haven't checked if it does, but I did check that all (non-mypy) tests pass with the diff above), I think we should maybe go back and ask for the change to pyright to make the change in pydantic unnecessary.

@dmontagu
Copy link
Contributor

Regarding the point:

I don't know if this is still required in the mypy plugin if this PR gets merged?

I would suggest we remove that logic branch as part of this PR if we can and mypy still handles root models correctly (due to the change to the dataclass_transform). I strongly suspect we have code in one of the existing mypy tests that checks that you don't get an error with RootModel if you use a positional argument to the __init__, but it would be good to confirm this prior to merging changes to the plugin code (assuming those changes don't cause any tests to fail).

@Viicos
Copy link
Contributor Author

Viicos commented Nov 28, 2023

I would make a _RootModelMetaclass in an if TYPE_CHECKING: block

Neat, tested and it works as expected both pyright and mypy.

I strongly suspect we have code in one of the existing mypy tests that checks that you don't get an error with RootModel if you use a positional argument

It seems there is a test, but running only with the mypy plugin. I'll add the test without the plugin and then see how I can drop the special case currently implemented.

Comment on lines 19 to 22
# MYPY: error: Too many positional arguments for "Pets1" [misc]
pets2 = Pets2(['dog', 'cat'])
pets3 = Pets3(['dog', 'cat'])
# MYPY: error: Too many positional arguments for "Pets3" [misc]
Copy link
Contributor Author

@Viicos Viicos Dec 2, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mypy support for dataclass_transform isn't really good in 1.0.1 iirc, hence the errors

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Viicos, can't we remove these now that you added back support for 1.0.1?

@Viicos
Copy link
Contributor Author

Viicos commented Dec 2, 2023

Please review

Copy link
Member

@sydney-runkle sydney-runkle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Viicos,

Looks great otherwise, just wondering if we can avoid reintroducing mypy errors in 1.0.1 if possible.

pydantic/mypy.py Outdated
Comment on lines 860 to 865
if is_root_model:
# convert root argument to positional argument
args[0].kind = ARG_POS if args[0].kind == ARG_NAMED else ARG_OPT
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Viicos,

If we add this back, do we get no errors for mypy 1.0.1 as well as all of the other mypy versions currently tested?

If so, I'd prefer to do that + add a note about the special case for 1.0.1.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or if necessary, wrap this check in a block that checks the mypy version

Copy link
Member

@sydney-runkle sydney-runkle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great otherwise. Please see my question on the 1.0.1 tests. Otherwise, ready to approve and merge 👍

pydantic/mypy.py Show resolved Hide resolved
Comment on lines 19 to 22
# MYPY: error: Too many positional arguments for "Pets1" [misc]
pets2 = Pets2(['dog', 'cat'])
pets3 = Pets3(['dog', 'cat'])
# MYPY: error: Too many positional arguments for "Pets3" [misc]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Viicos, can't we remove these now that you added back support for 1.0.1?

@sydney-runkle sydney-runkle mentioned this pull request Jan 15, 2024
10 tasks
Copy link
Member

@sydney-runkle sydney-runkle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great! Approved.

@sydney-runkle sydney-runkle merged commit 640ba4a into pydantic:main Jan 15, 2024
54 checks passed
@Viicos Viicos deleted the root-model-positional branch January 15, 2024 13:04
jsuchenia pushed a commit to jsuchenia/adventofcode that referenced this pull request Feb 13, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [pydantic](https://github.com/pydantic/pydantic) ([changelog](https://docs.pydantic.dev/latest/changelog/)) | dependencies | minor | `2.5.3` -> `2.6.1` |

---

### Release Notes

<details>
<summary>pydantic/pydantic (pydantic)</summary>

### [`v2.6.1`](https://github.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v261-2024-02-05)

[Compare Source](pydantic/pydantic@v2.6.0...v2.6.1)

[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.6.1)

##### What's Changed

##### Packaging

-   Upgrade to `pydantic-core` 2.16.2 by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8717](pydantic/pydantic#8717)

##### Fixes

-   Fix bug with `mypy` plugin and `no_strict_optional = True` by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8666](pydantic/pydantic#8666)
-   Fix `ByteSize` error `type` change by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8681](pydantic/pydantic#8681)
-   Fix inheriting `Field` annotations in dataclasses by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8679](pydantic/pydantic#8679)
-   Fix regression in core schema generation for indirect definition references by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8702](pydantic/pydantic#8702)
-   Fix unsupported types bug with `PlainValidator` by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8710](pydantic/pydantic#8710)
-   Reverting problematic fix from 2.6 release, fixing schema building bug by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8718](pydantic/pydantic#8718)
-   Fix warning for tuple of wrong size in `Union` by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1174](pydantic/pydantic-core#1174)
-   Fix `computed_field` JSON serializer `exclude_none` behavior by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1187](pydantic/pydantic-core#1187)

### [`v2.6.0`](https://github.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v260-2024-01-23)

[Compare Source](pydantic/pydantic@v2.5.3...v2.6.0)

[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.6.0)

The code released in v2.6.0 is practically identical to that of v2.6.0b1.

##### What's Changed

##### Packaging

-   Check for `email-validator` version >= 2.0 by [@&#8203;commonism](https://github.com/commonism) in [#&#8203;6033](pydantic/pydantic#6033)
-   Upgrade \`ruff\`\` target version to Python 3.8 by [@&#8203;Elkiwa](https://github.com/Elkiwa) in [#&#8203;8341](pydantic/pydantic#8341)
-   Update to `pydantic-extra-types==2.4.1` by [@&#8203;yezz123](https://github.com/yezz123) in [#&#8203;8478](pydantic/pydantic#8478)
-   Update to `pyright==1.1.345` by [@&#8203;Viicos](https://github.com/Viicos) in [#&#8203;8453](pydantic/pydantic#8453)
-   Update pydantic-core from 2.14.6 to 2.16.1, significant changes from these updates are described below, full changelog [here](pydantic/pydantic-core@v2.14.6...v2.16.1)

##### New Features

-   Add `NatsDsn` by [@&#8203;ekeew](https://github.com/ekeew) in [#&#8203;6874](pydantic/pydantic#6874)
-   Add `ConfigDict.ser_json_inf_nan` by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [#&#8203;8159](pydantic/pydantic#8159)
-   Add `types.OnErrorOmit` by [@&#8203;adriangb](https://github.com/adriangb) in [#&#8203;8222](pydantic/pydantic#8222)
-   Support `AliasGenerator` usage by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8282](pydantic/pydantic#8282)
-   Add Pydantic People Page to docs by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8345](pydantic/pydantic#8345)
-   Support `yyyy-MM-DD` datetime parsing by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8404](pydantic/pydantic#8404)
-   Added bits conversions to the `ByteSize` class [#&#8203;8415](pydantic/pydantic#8415) by [@&#8203;luca-matei](https://github.com/luca-matei) in [#&#8203;8507](pydantic/pydantic#8507)
-   Enable json schema creation with type `ByteSize` by [@&#8203;geospackle](https://github.com/geospackle) in [#&#8203;8537](pydantic/pydantic#8537)
-   Add `eval_type_backport` to handle union operator and builtin generic subscripting in older Pythons by [@&#8203;alexmojaki](https://github.com/alexmojaki) in [#&#8203;8209](pydantic/pydantic#8209)
-   Add support for `dataclass` fields `init` by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8552](pydantic/pydantic#8552)
-   Implement pickling for `ValidationError` by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1119](pydantic/pydantic-core#1119)
-   Add unified tuple validator that can handle "variadic" tuples via PEP-646 by [@&#8203;dmontagu](https://github.com/dmontagu) in [pydantic/pydantic-core#865](pydantic/pydantic-core#865)

##### Changes

-   Drop Python3.7 support by [@&#8203;hramezani](https://github.com/hramezani) in [#&#8203;7188](pydantic/pydantic#7188)
-   Drop Python 3.7, and PyPy 3.7 and 3.8 by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1129](pydantic/pydantic-core#1129)
-   Use positional-only `self` in `BaseModel` constructor, so no field name can ever conflict with it by [@&#8203;ariebovenberg](https://github.com/ariebovenberg) in [#&#8203;8072](pydantic/pydantic#8072)
-   Make `@validate_call` return a function instead of a custom descriptor - fixes binding issue with inheritance and adds `self/cls` argument to validation errors by [@&#8203;alexmojaki](https://github.com/alexmojaki) in [#&#8203;8268](pydantic/pydantic#8268)
-   Exclude `BaseModel` docstring from JSON schema description by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8352](pydantic/pydantic#8352)
-   Introducing `classproperty` decorator for `model_computed_fields` by [@&#8203;Jocelyn-Gas](https://github.com/Jocelyn-Gas) in [#&#8203;8437](pydantic/pydantic#8437)
-   Explicitly raise an error if field names clashes with types by [@&#8203;Viicos](https://github.com/Viicos) in [#&#8203;8243](pydantic/pydantic#8243)
-   Use stricter serializer for unions of simple types by [@&#8203;alexdrydew](https://github.com/alexdrydew) [pydantic/pydantic-core#1132](pydantic/pydantic-core#1132)

##### Performance

-   Add Codspeed profiling Actions workflow  by [@&#8203;lambertsbennett](https://github.com/lambertsbennett) in [#&#8203;8054](pydantic/pydantic#8054)
-   Improve `int` extraction by [@&#8203;samuelcolvin](https://github.com/samuelcolvin) in [pydantic/pydantic-core#1155](pydantic/pydantic-core#1155)
-   Improve performance of recursion guard by [@&#8203;samuelcolvin](https://github.com/samuelcolvin) in [pydantic/pydantic-core#1156](pydantic/pydantic-core#1156)
-   `dataclass` serialization speedups by [@&#8203;samuelcolvin](https://github.com/samuelcolvin) in [pydantic/pydantic-core#1162](pydantic/pydantic-core#1162)
-   Avoid `HashMap` creation when looking up small JSON objects in `LazyIndexMaps` by [@&#8203;samuelcolvin](https://github.com/samuelcolvin) in [pydantic/jiter#55](pydantic/jiter#55)
-   use hashbrown to speedup python string caching by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [pydantic/jiter#51](pydantic/jiter#51)
-   Replace `Peak` with more efficient `Peek` by [@&#8203;davidhewitt](https://github.com/davidhewitt) in [pydantic/jiter#48](pydantic/jiter#48)

##### Fixes

-   Move `getattr` warning in deprecated `BaseConfig` by [@&#8203;tlambert03](https://github.com/tlambert03) in [#&#8203;7183](pydantic/pydantic#7183)
-   Only hash `model_fields`, not whole `__dict__` by [@&#8203;alexmojaki](https://github.com/alexmojaki) in [#&#8203;7786](pydantic/pydantic#7786)
-   Fix mishandling of unions while freezing types in the `mypy` plugin by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;7411](pydantic/pydantic#7411)
-   Fix `mypy` error on untyped `ClassVar` by [@&#8203;vincent-hachin-wmx](https://github.com/vincent-hachin-wmx) in [#&#8203;8138](pydantic/pydantic#8138)
-   Only compare pydantic fields in `BaseModel.__eq__` instead of whole `__dict__` by [@&#8203;QuentinSoubeyranAqemia](https://github.com/QuentinSoubeyranAqemia) in [#&#8203;7825](pydantic/pydantic#7825)
-   Update `strict` docstring in `model_validate` method. by [@&#8203;LukeTonin](https://github.com/LukeTonin) in [#&#8203;8223](pydantic/pydantic#8223)
-   Fix overload position of `computed_field` by [@&#8203;Viicos](https://github.com/Viicos) in [#&#8203;8227](pydantic/pydantic#8227)
-   Fix custom type type casting used in multiple attributes by [@&#8203;ianhfc](https://github.com/ianhfc) in [#&#8203;8066](pydantic/pydantic#8066)
-   Fix issue not allowing `validate_call` decorator to be dynamically assigned to a class method by [@&#8203;jusexton](https://github.com/jusexton) in [#&#8203;8249](pydantic/pydantic#8249)
-   Fix issue `unittest.mock` deprecation warnings  by [@&#8203;ibleedicare](https://github.com/ibleedicare) in [#&#8203;8262](pydantic/pydantic#8262)
-   Added tests for the case `JsonValue` contains subclassed primitive values by [@&#8203;jusexton](https://github.com/jusexton) in [#&#8203;8286](pydantic/pydantic#8286)
-   Fix `mypy` error on free before validator (classmethod) by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8285](pydantic/pydantic#8285)
-   Fix `to_snake` conversion by [@&#8203;jevins09](https://github.com/jevins09) in [#&#8203;8316](pydantic/pydantic#8316)
-   Fix type annotation of `ModelMetaclass.__prepare__` by [@&#8203;slanzmich](https://github.com/slanzmich) in [#&#8203;8305](pydantic/pydantic#8305)
-   Disallow `config` specification when initializing a `TypeAdapter` when the annotated type has config already by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8365](pydantic/pydantic#8365)
-   Fix a naming issue with JSON schema for generics parametrized by recursive type aliases by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8389](pydantic/pydantic#8389)
-   Fix type annotation in pydantic people script by [@&#8203;shenxiangzhuang](https://github.com/shenxiangzhuang) in [#&#8203;8402](pydantic/pydantic#8402)
-   Add support for field `alias` in `dataclass` signature by [@&#8203;NeevCohen](https://github.com/NeevCohen) in [#&#8203;8387](pydantic/pydantic#8387)
-   Fix bug with schema generation with `Field(...)` in a forward ref by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8494](pydantic/pydantic#8494)
-   Fix ordering of keys in `__dict__` with `model_construct` call by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8500](pydantic/pydantic#8500)
-   Fix module `path_type` creation when globals does not contain `__name__` by [@&#8203;hramezani](https://github.com/hramezani) in [#&#8203;8470](pydantic/pydantic#8470)
-   Fix for namespace issue with dataclasses with `from __future__ import annotations` by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8513](pydantic/pydantic#8513)
-   Fix: make function validator types positional-only by [@&#8203;pmmmwh](https://github.com/pmmmwh) in [#&#8203;8479](pydantic/pydantic#8479)
-   Fix usage of `@deprecated` by [@&#8203;Viicos](https://github.com/Viicos) in [#&#8203;8294](pydantic/pydantic#8294)
-   Add more support for private attributes in `model_construct` call by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8525](pydantic/pydantic#8525)
-   Use a stack for the types namespace by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8378](pydantic/pydantic#8378)
-   Fix schema-building bug with `TypeAliasType` for types with refs by [@&#8203;dmontagu](https://github.com/dmontagu) in [#&#8203;8526](pydantic/pydantic#8526)
-   Support `pydantic.Field(repr=False)` in dataclasses by [@&#8203;tigeryy2](https://github.com/tigeryy2) in [#&#8203;8511](pydantic/pydantic#8511)
-   Override `dataclass_transform` behavior for `RootModel` by [@&#8203;Viicos](https://github.com/Viicos) in [#&#8203;8163](pydantic/pydantic#8163)
-   Refactor signature generation for simplicity by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [#&#8203;8572](pydantic/pydantic#8572)
-   Fix ordering bug of PlainValidator annotation by [@&#8203;Anvil](https://github.com/Anvil) in [#&#8203;8567](pydantic/pydantic#8567)
-   Fix `exclude_none` for json serialization of `computed_field`s by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1098](pydantic/pydantic-core#1098)
-   Support yyyy-MM-DD string for datetimes by [@&#8203;sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1124](pydantic/pydantic-core#1124)
-   Tweak ordering of definitions in generated schemas by [@&#8203;StrawHatDrag0n](https://github.com/StrawHatDrag0n) in [#&#8203;8583](pydantic/pydantic#8583)

##### New Contributors

##### `pydantic`

-   [@&#8203;ekeew](https://github.com/ekeew) made their first contribution in [#&#8203;6874](pydantic/pydantic#6874)
-   [@&#8203;lambertsbennett](https://github.com/lambertsbennett) made their first contribution in [#&#8203;8054](pydantic/pydantic#8054)
-   [@&#8203;vincent-hachin-wmx](https://github.com/vincent-hachin-wmx) made their first contribution in [#&#8203;8138](pydantic/pydantic#8138)
-   [@&#8203;QuentinSoubeyranAqemia](https://github.com/QuentinSoubeyranAqemia) made their first contribution in [#&#8203;7825](pydantic/pydantic#7825)
-   [@&#8203;ariebovenberg](https://github.com/ariebovenberg) made their first contribution in [#&#8203;8072](pydantic/pydantic#8072)
-   [@&#8203;LukeTonin](https://github.com/LukeTonin) made their first contribution in [#&#8203;8223](pydantic/pydantic#8223)
-   [@&#8203;denisart](https://github.com/denisart) made their first contribution in [#&#8203;8231](pydantic/pydantic#8231)
-   [@&#8203;ianhfc](https://github.com/ianhfc) made their first contribution in [#&#8203;8066](pydantic/pydantic#8066)
-   [@&#8203;eonu](https://github.com/eonu) made their first contribution in [#&#8203;8255](pydantic/pydantic#8255)
-   [@&#8203;amandahla](https://github.com/amandahla) made their first contribution in [#&#8203;8263](pydantic/pydantic#8263)
-   [@&#8203;ibleedicare](https://github.com/ibleedicare) made their first contribution in [#&#8203;8262](pydantic/pydantic#8262)
-   [@&#8203;jevins09](https://github.com/jevins09) made their first contribution in [#&#8203;8316](pydantic/pydantic#8316)
-   [@&#8203;cuu508](https://github.com/cuu508) made their first contribution in [#&#8203;8322](pydantic/pydantic#8322)
-   [@&#8203;slanzmich](https://github.com/slanzmich) made their first contribution in [#&#8203;8305](pydantic/pydantic#8305)
-   [@&#8203;jensenbox](https://github.com/jensenbox) made their first contribution in [#&#8203;8331](pydantic/pydantic#8331)
-   [@&#8203;szepeviktor](https://github.com/szepeviktor) made their first contribution in [#&#8203;8356](pydantic/pydantic#8356)
-   [@&#8203;Elkiwa](https://github.com/Elkiwa) made their first contribution in [#&#8203;8341](pydantic/pydantic#8341)
-   [@&#8203;parhamfh](https://github.com/parhamfh) made their first contribution in [#&#8203;8395](pydantic/pydantic#8395)
-   [@&#8203;shenxiangzhuang](https://github.com/shenxiangzhuang) made their first contribution in [#&#8203;8402](pydantic/pydantic#8402)
-   [@&#8203;NeevCohen](https://github.com/NeevCohen) made their first contribution in [#&#8203;8387](pydantic/pydantic#8387)
-   [@&#8203;zby](https://github.com/zby) made their first contribution in [#&#8203;8497](pydantic/pydantic#8497)
-   [@&#8203;patelnets](https://github.com/patelnets) made their first contribution in [#&#8203;8491](pydantic/pydantic#8491)
-   [@&#8203;edwardwli](https://github.com/edwardwli) made their first contribution in [#&#8203;8503](pydantic/pydantic#8503)
-   [@&#8203;luca-matei](https://github.com/luca-matei) made their first contribution in [#&#8203;8507](pydantic/pydantic#8507)
-   [@&#8203;Jocelyn-Gas](https://github.com/Jocelyn-Gas) made their first contribution in [#&#8203;8437](pydantic/pydantic#8437)
-   [@&#8203;bL34cHig0](https://github.com/bL34cHig0) made their first contribution in [#&#8203;8501](pydantic/pydantic#8501)
-   [@&#8203;tigeryy2](https://github.com/tigeryy2) made their first contribution in [#&#8203;8511](pydantic/pydantic#8511)
-   [@&#8203;geospackle](https://github.com/geospackle) made their first contribution in [#&#8203;8537](pydantic/pydantic#8537)
-   [@&#8203;Anvil](https://github.com/Anvil) made their first contribution in [#&#8203;8567](pydantic/pydantic#8567)
-   [@&#8203;hungtsetse](https://github.com/hungtsetse) made their first contribution in [#&#8203;8546](pydantic/pydantic#8546)
-   [@&#8203;StrawHatDrag0n](https://github.com/StrawHatDrag0n) made their first contribution in [#&#8203;8583](pydantic/pydantic#8583)

##### `pydantic-core`

-   [@&#8203;mariuswinger](https://github.com/mariuswinger) made their first contribution in [pydantic/pydantic-core#1087](pydantic/pydantic-core#1087)
-   [@&#8203;adamchainz](https://github.com/adamchainz) made their first contribution in [pydantic/pydantic-core#1090](pydantic/pydantic-core#1090)
-   [@&#8203;akx](https://github.com/akx) made their first contribution in [pydantic/pydantic-core#1123](pydantic/pydantic-core#1123)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEzMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->

Reviewed-on: https://git.apud.pl/jacek/adventofcode/pulls/57
Co-authored-by: Renovate <renovate@apud.pl>
Co-committed-by: Renovate <renovate@apud.pl>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
awaiting author revision mypy related to mypy relnotes-fix Used for bugfixes.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants