Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-pydantic for openSUSE:Factory 
checked in at 2023-05-26 20:14:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pydantic (Old)
 and      /work/SRC/openSUSE:Factory/.python-pydantic.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pydantic"

Fri May 26 20:14:59 2023 rev:18 rq:1088976 version:1.10.8

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pydantic/python-pydantic.changes  
2023-03-29 23:26:42.859319426 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-pydantic.new.1533/python-pydantic.changes    
    2023-05-26 20:15:03.504114218 +0200
@@ -1,0 +2,15 @@
+Thu May 25 07:32:32 UTC 2023 - Daniel Garcia <daniel.gar...@suse.com>
+
+- Update to v1.10.8
+  * Fix a bug in `Literal` usage with `typing-extension==4.6.0`, #5826
+    by @hramezani
+  * This solves the (closed) issue #3849 where aliased fields that use
+    discriminated union fail to validate when the data contains the
+    non-aliased field name, #5736 by @benwah
+  * Update email-validator dependency to >=2.0.0post2, #5627 by
+    @adriangb
+  * update `AnyClassMethod` for changes in
+    [python/typeshed#9771](https://github.com/python/typeshed/issues/9771),
+    #5505 by @ITProKyle
+
+-------------------------------------------------------------------

Old:
----
  pydantic-1.10.7.tar.gz

New:
----
  pydantic-1.10.8.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pydantic.spec ++++++
--- /var/tmp/diff_new_pack.NSQ8vz/_old  2023-05-26 20:15:03.996117151 +0200
+++ /var/tmp/diff_new_pack.NSQ8vz/_new  2023-05-26 20:15:04.000117174 +0200
@@ -17,9 +17,10 @@
 #
 
 
+%{?sle15_python_module_pythons}
 %define skip_python2 1
 Name:           python-pydantic
-Version:        1.10.7
+Version:        1.10.8
 Release:        0
 Summary:        Data validation and settings management using python type 
hinting
 License:        MIT

++++++ pydantic-1.10.7.tar.gz -> pydantic-1.10.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/.github/workflows/ci.yml 
new/pydantic-1.10.8/.github/workflows/ci.yml
--- old/pydantic-1.10.7/.github/workflows/ci.yml        2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/.github/workflows/ci.yml        2023-05-23 
19:13:55.000000000 +0200
@@ -452,57 +452,71 @@
          ls dist/*cp310-manylinux*x86_64.whl | head -n 1
          python -m zipfile --list `ls dist/*cp310-manylinux*x86_64.whl | head 
-n 1`
 
-  deploy:
-    name: Deploy
-    needs:
-      - check
-      - build
-    if: "success() && startsWith(github.ref, 'refs/tags/')"
+  publish_docs:
+    needs: [check]
+    if: "success() && (github.ref == 'refs/heads/1.10.X-fixes' || 
startsWith(github.ref, 'refs/tags/'))"
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@v3
+      - name: checkout docs-site
+        uses: actions/checkout@v3
+        with:
+          ref: docs-site
+
+      - name: checkout current branch
+        uses: actions/checkout@v3
 
       - name: set up python
         uses: actions/setup-python@v4
         with:
           python-version: '3.10'
 
+      - name: install
+        run: make install-docs
+
+      - name: Set git credentials
+        run: |
+          git config --global user.name "${{ github.actor }}"
+          git config --global user.email "${{ github.actor 
}}@users.noreply.github.com"
+
+      - run: make docs
+
+      - run: mike deploy -b docs-site dev-v1 --push
+        if: github.ref == 'refs/heads/1.10.X-fixes'
+
+      - name: check version
+        if: "startsWith(github.ref, 'refs/tags/')"
+        id: check-version
+        uses: samuelcolvin/check-python-version@v3.2
+        with:
+          version_file_path: 'pydantic/version.py'
+
+      # need to remove "latest" once V2 is released!
+      - run: mike deploy -b docs-site ${{ 
steps.check-version.outputs.VERSION_MAJOR_MINOR }} latest --update-aliases 
--push
+        if: "startsWith(github.ref, 'refs/tags/') && 
!fromJSON(steps.check-version.outputs.IS_PRERELEASE)"
+
+  release:
+    needs: [check]
+    if: "success() && startsWith(github.ref, 'refs/tags/')"
+    runs-on: ubuntu-latest
+    environment: release
+
+    permissions:
+      id-token: write
+
+    steps:
+      - uses: actions/checkout@v3
+
       - name: get dist artifacts
         uses: actions/download-artifact@v3
         with:
           name: pypi_files
           path: dist
 
-      - name: get docs
-        uses: actions/download-artifact@v3
+      - name: check version
+        uses: samuelcolvin/check-python-version@v3.2
         with:
-          name: docs
-          path: site
-
-      - name: install
-        run: pip install -U twine packaging
+          version_file_path: pydantic/version.py
 
-      - name: twine check
-        run: |
-          twine check dist/*
-          ls -lh dist
-
-      - name: check tag
-        id: check-tag
-        run: ./tests/check_tag.py
-
-      - name: upload to pypi
-        run: twine upload dist/*
-        env:
-          TWINE_USERNAME: __token__
-          TWINE_PASSWORD: ${{ secrets.pypi_token }}
-
-      - name: publish docs
-        if: '!fromJSON(steps.check-tag.outputs.IS_PRERELEASE)'
-        uses: cloudflare/wrangler-action@2.0.0
-        with:
-          apiToken: ${{ secrets.cloudflare_api_token }}
-          command: pages publish --project-name=pydantic-docs --branch=main 
site
-        env:
-          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.cloudflare_account_id }}
+      - name: Upload package to PyPI
+        uses: pypa/gh-action-pypi-publish@release/v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/HISTORY.md 
new/pydantic-1.10.8/HISTORY.md
--- old/pydantic-1.10.7/HISTORY.md      2023-03-22 20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/HISTORY.md      2023-05-23 19:13:55.000000000 +0200
@@ -1,3 +1,16 @@
+## v1.10.8 (2023-05-23)
+
+* Fix a bug in `Literal` usage with `typing-extension==4.6.0`, #5826 by 
@hramezani
+* This solves the (closed) issue #3849 where aliased fields that use 
discriminated union fail to validate when the data contains the non-aliased 
field name, #5736 by @benwah
+* Update email-validator dependency to >=2.0.0post2, #5627 by @adriangb
+* update `AnyClassMethod` for changes in 
[python/typeshed#9771](https://github.com/python/typeshed/issues/9771), #5505 
by @ITProKyle
+
+## v2.0a1 (2023-04-03)
+
+First pre-release of Pydantic V2!
+
+See [this post](https://docs.pydantic.dev/blog/pydantic-v2-alpha/) for more 
details.
+
 ## v1.10.7 (2023-03-22)
 
 * Fix creating schema from model using `ConstrainedStr` with `regex` as dict 
key, #5223 by @matejetz
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/build-docs.sh 
new/pydantic-1.10.8/build-docs.sh
--- old/pydantic-1.10.7/build-docs.sh   1970-01-01 01:00:00.000000000 +0100
+++ new/pydantic-1.10.8/build-docs.sh   2023-05-23 19:13:55.000000000 +0200
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+# This script is used to build the documentation on CloudFlare Pages, this is 
just used for build previews
+# A different script with the same name exists on the `docs-site` branch 
(where pre-built docs live).
+
+set -e
+set -x
+
+python3 -V
+
+make install-docs
+
+make docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/blog/pydantic-v2-alpha.md 
new/pydantic-1.10.8/docs/blog/pydantic-v2-alpha.md
--- old/pydantic-1.10.7/docs/blog/pydantic-v2-alpha.md  1970-01-01 
01:00:00.000000000 +0100
+++ new/pydantic-1.10.8/docs/blog/pydantic-v2-alpha.md  2023-05-23 
19:13:55.000000000 +0200
@@ -0,0 +1,199 @@
+# Pydantic V2 Pre Release
+
+<aside class="blog" markdown>
+![Terrence Dorsey](/img/terrencedorsey.jpg)
+<div markdown>
+  **Terrence Dorsey & Samuel Colvin** &bull;&nbsp;
+  [:material-github:](https://github.com/pydantic) &bull;&nbsp;
+  [:material-twitter:](https://twitter.com/pydantic) &bull;&nbsp;
+  :octicons-calendar-24: April 3, 2023 &bull;&nbsp;
+  :octicons-clock-24: 8 min read
+</div>
+</aside>
+
+---
+
+We're excited to announce the first alpha release of Pydantic V2!
+
+This first Pydantic V2 alpha is no April Fool's joke &mdash; for a start we 
missed our April 1st target date :cry:.
+After a year's work, we invite you to explore the improvements we've made and 
give us your feedback. 
+We look forward to hearing your thoughts and working together to improve the 
library.
+
+For many of you, Pydantic is already a key part of your Python toolkit and 
needs no introduction &mdash; 
+we hope you'll find the improvements and additions in Pydantic V2 useful.
+
+If you're new to Pydantic: Pydantic is an open-source Python library that 
provides powerful data parsing and validation &mdash; 
+including type coercion and useful error messages when typing issues arise 
&mdash; and settings management capabilities.
+See [the docs](/) for examples of Pydantic at work.
+
+## Getting started with the Pydantic V2 alpha
+
+Your feedback will be a critical part of ensuring that we have made the right 
tradeoffs with the API changes in V2.
+
+To get started with the Pydantic V2 alpha, install it from PyPI. 
+We recommend using a virtual environment to isolate your testing environment:
+
+```bash
+pip install --pre -U "pydantic>=2.0a1"
+```
+
+Note that there are still some rough edges and incomplete features, and while 
trying out the Pydantic V2 alpha releases you may experience errors. 
+We encourage you to try out the alpha releases in a test environment and not 
in production. 
+Some features are still in development, and we will continue to make changes 
to the API.
+
+If you do encounter any issues, please [create an issue in 
GitHub](https://github.com/pydantic/pydantic/issues) using the `bug V2` label. 
+This will help us to actively monitor and track errors, and to continue to 
improve the library’s performance.
+
+This will be the first of several upcoming alpha releases. As you evaluate our 
changes and enhancements, 
+we encourage you to share your feedback with us.
+
+Please let us know:
+
+* If you don't like the changes, so we can make sure Pydantic remains a 
library you enjoy using.
+* If this breaks your usage of Pydantic so we can fix it, or at least describe 
a migration path.
+
+Thank you for your support, and we look forward to your feedback.
+
+---
+
+## Headlines
+
+Here are some of the most interesting new features in the current Pydantic V2 
alpha release. 
+For background on plans behind these features, see the earlier [Pydantic V2 
Plan](/blog/pydantic-v2/) blog post.
+
+The biggest change to Pydantic V2 is 
[`pydantic-core`](https://github.com/pydantic/pydantic-core) &mdash;
+all validation logic has been rewritten in Rust and moved to a separate 
package, `pydantic-core`.
+This has a number of big advantages:
+
+* **Performance** - Pydantic V2 is 5-50x faster than Pydantic V1.
+* **Safety & maintainability** - We've made changes to the architecture that 
we think will help us maintain Pydantic V2 with far fewer bugs in the long term.
+
+With the use of `pydantic-core`, the majority of the logic in the Pydantic 
library is dedicated to generating
+"pydantic core schema" &mdash; the schema used define the behaviour of the 
new, high-performance `pydantic-core` validators and serializers.  
+
+### Ready for experimentation
+
+* **BaseModel** - the core of validation in Pydantic V1 remains, albeit with 
new method names.
+* **Dataclasses** - Pydantic dataclasses are improved and ready to test.
+* **Serialization** - dumping/serialization/marshalling is significantly more 
flexible, and ready to test.
+* **Strict mode** - one of the biggest additions in Pydantic V2 is strict 
mode, which is ready to test.
+* **JSON Schema** - generation of JSON Schema is much improved and ready to 
test.
+* **Generic Models** - are much improved and ready to test.
+* **Recursive Models** - and validation of recursive data structures is much 
improved and ready to test.
+* **Custom Types** - custom types have a new interface and are ready to test.
+* **Custom Field Modifiers** - used via `Annotated[]` are working and in use 
in Pydantic itself.
+* **Validation without a BaseModel** - the new `AnalyzedType` class allows 
validation without the need for a `BaseModel` class, and it's ready to test.
+* **TypedDict** - we now have full support for `TypedDict` via `AnalyzedType`, 
it's ready to test.
+
+### Still under construction
+
+* **Documentation** - we're working hard on full documentation for V2, but 
it's not ready yet.
+* **Conversion Table** - a big addition to the documentation will be a 
conversion table showing how types are coerced, this is a WIP.
+* **BaseSettings** - `BaseSettings` will move to a separate 
`pydantic-settings` package, it's not yet ready to test. 
+  **Notice:** since `pydantic-settings` is not yet ready to release, there's 
no support for `BaseSettings` in the first alpha release.
+* **validate_arguments** - the `validate_arguments` decorator remains and is 
working, but hasn't been updated yet.
+* **Hypothesis Plugin** - the Hypothesis plugin is yet to be updated.
+* **computed fields** - we know a lot of people are waiting for this, we will 
include it in Pydantic V2.
+* **Error messages** - could use some love, and links to docs in error 
messages are still to be added.
+* **Migration Guide** - we have some pointers below, but this needs completing.
+
+## Migration Guide
+
+**Please note:** this is just the beginning of a migration guide. We'll work 
hard up to the final release to prepare
+a full migration guide, but for now the following pointers should be some help 
while experimenting with V2.
+
+### Changes to BaseModel
+
+* Various method names have been changed; `BaseModel` methods all start with 
`model_` now. 
+  Where possible, we have retained the old method names to help ease 
migration, but calling them will result in `DeprecationWarning`s.
+  * Some of the built-in data loading functionality has been slated for 
removal. 
+    In particular, `parse_raw` and `parse_file` are now deprecated. You should 
load the data and then pass it to `model_validate`.
+* The `from_orm` method has been removed; you can now just use 
`model_validate` (equivalent to `parse_obj` from Pydantic V1) to achieve 
something similar, 
+  as long as you've set `from_attributes=True` in the model config.
+* The `__eq__` method has changed for models; models are no longer considered 
equal to the dicts.
+* Custom `__init__` overrides won't be called. This should be replaced with a 
`@root_validator`.
+* Due to inconsistency with the rest of the library, we have removed the 
special behavior of models
+  using the `__root__` field, and have disallowed the use of an attribute with 
this name to prevent confusion.
+  However, you can achieve equivalent behavior with a "standard" field name 
through the use of `@root_validator`,
+  `@model_serializer`, and `__pydantic_modify_json_schema__`. You can see an 
example of this
+  
[here](https://github.com/pydantic/pydantic/blob/2b9459f20d094a46fa3093b43c34444240f03646/tests/test_parse.py#L95-L113).
+
+### Changes to Pydantic Dataclasses
+
+* The `__post_init__` in Pydantic dataclasses will now be called after 
validation, rather than before.
+* We no longer support `extra='allow'` for Pydantic dataclasses, where extra 
attributes passed to the initializer would be 
+  stored as extra fields on the dataclass. `extra='ignore'` is still supported 
for the purposes of allowing extra fields while parsing data; they just aren't 
stored.
+* `__post_init_post_parse__` has been removed.
+* Nested dataclasses no longer accept tuples as input, only dict.
+
+### Changes to Config
+
+* To specify config on a model, it is now deprecated to create a class called 
`Config` in the namespace of the parent `BaseModel` subclass. 
+  Instead, you just need to set a class attribute called `model_config` to be 
a dict with the key/value pairs you want to be used as the config.
+  
+The following config settings have been removed:
+
+* `allow_mutation`.
+* `error_msg_templates`.
+* `fields` — this was the source of various bugs, so has been removed. You 
should be able to use `Annotated` on fields to modify them as desired.
+* `getter_dict` — `orm_mode` has been removed, and this implementation 
detail is no longer necessary.
+* `schema_extra` — you should now use the `json_schema_extra` keyword 
argument to `pydantic.Field`.
+* `smart_union`.
+* `underscore_attrs_are_private` — the Pydantic V2 behavior is now the same 
as if this was always set to `True` in Pydantic V1.
+
+The following config settings have been renamed:
+
+* `allow_population_by_field_name` → `populate_by_name`
+* `anystr_lower` → `str_to_lower`
+* `anystr_strip_whitespace` → `str_strip_whitespace`
+* `anystr_upper` → `str_to_upper`
+* `keep_untouched` → `ignored_types`
+* `max_anystr_length` → `str_max_length`
+* `min_anystr_length` → `str_min_length`
+* `orm_mode` → `from_attributes`
+* `validate_all` → `validate_default`
+
+### Changes to Validators
+
+* Raising a `TypeError` inside a validator no longer produces a 
`ValidationError`, but just raises the `TypeError` directly. 
+  This was necessary to prevent certain common bugs (such as calling functions 
with invalid signatures) from 
+  being unintentionally converted into `ValidationError` and displayed to 
users. 
+  If you really want `TypeError` to be converted to a `ValidationError` you 
should use a `try: except:` block that will catch it and do the conversion.
+* `each_item` validators are deprecated and should be replaced with a type 
annotation using `Annotated` to apply a validator 
+  or with a validator that operates on all items at the top level.
+* Changes to `@validator`-decorated function signatures.
+* The `stricturl` type has been removed.
+* Root validators can no longer be run with `skip_on_failure=False`.
+
+### Changes to Validation of specific types
+
+* Integers outside the valid range of 64 bit integers will cause 
`ValidationError`s during parsing. 
+  To work around this, use an `IsInstance` validator (more details to come).
+* Subclasses of built-ins won't validate into their subclass types; you'll 
need to use an `IsInstance` validator to validate these types.
+
+### Changes to Generic models
+
+* While it does not raise an error at runtime yet, subclass checks for 
parametrized generics should no longer be used. 
+  These will result in `TypeError`s and we can't promise they will work 
forever. However, it will be okay to do subclass checks against 
_non-parametrized_ generic models
+
+### Other changes
+
+* `GetterDict` has been removed, as it was just an implementation detail for 
`orm_mode`, which has been removed.
+
+### AnalyzedType
+
+Pydantic V1 didn't have good support for validation or serializing 
non-`BaseModel`.
+To work with them you had to create a "root" model or use the utility 
functions in `pydantic.tools` (`parse_obj_as` and `schema_of`).
+In Pydantic V2 this is _a lot_ easier: the `AnalyzedType` class lets you build 
an object that behaves almost like a `BaseModel` class which you can use for a 
lot of the use cases of root models and as a complete replacement for 
`parse_obj_as` and `schema_of`.
+
+```python
+from typing import List
+from pydantic import AnalyzedType
+
+validator = AnalyzedType(List[int])
+assert validator.validate_python(['1', '2', '3']) == [1, 2, 3]
+print(validator.json_schema())
+# {'type': 'array', 'items': {'type': 'integer'}}
+```
+
+Note that this API is provisional and may change before the final release of 
Pydantic V2.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/blog/pydantic-v2.md 
new/pydantic-1.10.8/docs/blog/pydantic-v2.md
--- old/pydantic-1.10.7/docs/blog/pydantic-v2.md        2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/docs/blog/pydantic-v2.md        2023-05-23 
19:13:55.000000000 +0200
@@ -16,7 +16,7 @@
 Updated late 10 Jul 2022, see 
[pydantic#4226](https://github.com/pydantic/pydantic/pull/4226).
 
 Update 30 Dec 2022: **The new release deadline for Pydantic V2 is the end of 
Q1 2023**, 
-see [pydantic#4887](https://github.com/pydantic/pydantic/issues/4887) for more 
details, futher updates
+see [pydantic#4887](https://github.com/pydantic/pydantic/issues/4887) for more 
details, further updates
 will be posted on that issue.
 
 ---
Binary files old/pydantic-1.10.7/docs/img/terrencedorsey.jpg and 
new/pydantic-1.10.8/docs/img/terrencedorsey.jpg differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/index.md 
new/pydantic-1.10.8/docs/index.md
--- old/pydantic-1.10.7/docs/index.md   2023-03-22 20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/docs/index.md   2023-05-23 19:13:55.000000000 +0200
@@ -13,77 +13,6 @@
 
 Define how data should be in pure, canonical Python; validate it with 
*pydantic*.
 
-## Sponsors
-
-Development of *pydantic* is made possible by the following sponsors:
-
-<div class="sponsors">
-  <div>
-    <a rel="sponsored" target="_blank" href="https://www.salesforce.com";>
-      <img src="./sponsor_logos/salesforce.png" alt="Salesforce" />
-      <span>Salesforce</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://fastapi.tiangolo.com";>
-      <img src="./sponsor_logos/fastapi.png" alt="FastAPI" />
-      <span>FastAPI</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://aws.amazon.com";>
-      <img src="./sponsor_logos/aws.png" alt="AWS" />
-      <span>AWS</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://explosion.ai";>
-      <img src="./sponsor_logos/explosion_ai.png" alt="Explosion" />
-      <span>Explosion</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" 
href="https://tutorcruncher.com/?utm_source=pydantic&utm_campaign=open_source";>
-      <img src="./sponsor_logos/tutorcruncher.png" alt="TutorCruncher" />
-      <span>TutorCruncher</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" 
href="https://www.exoflare.com/open-source/?utm_source=pydantic&utm_campaign=open_source";>
-      <img src="./sponsor_logos/exoflare.png" alt="ExoFlare" />
-      <span>ExoFlare</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://home.robusta.dev";>
-      <img src="./sponsor_logos/robusta.png" alt="Robusta" />
-      <span>Robusta</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://www.sendcloud.com";>
-      <img src="./sponsor_logos/sendcloud.png" alt="SendCloud" />
-      <span>SendCloud</span>
-    </a>
-  </div>
-  <div>
-    <a rel="sponsored" target="_blank" href="https://jina.ai";>
-      <img src="./sponsor_logos/jina-ai.png" alt="Jina AI" />
-      <span>Jina AI</span>
-    </a>
-  </div>
-</div>
-
-And many more who kindly sponsor Samuel Colvin on [GitHub 
Sponsors](https://github.com/sponsors/samuelcolvin#sponsors).
-
-<script>
-  // randomize the order of sponsors
-  const ul = document.querySelector('.sponsors')
-  for (let i = ul.children.length; i >= 0; i--) {
-    ul.appendChild(ul.children[Math.random() * i | 0])
-  }
-</script>
-
 ## Example
 
 {!.tmp_examples/index_main.md!}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/requirements.txt 
new/pydantic-1.10.8/docs/requirements.txt
--- old/pydantic-1.10.7/docs/requirements.txt   2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/docs/requirements.txt   2023-05-23 19:13:55.000000000 
+0200
@@ -12,3 +12,5 @@
 sqlalchemy
 orjson
 ujson
+# waiting for https://github.com/jimporter/mike/issues/154
+git+https://github.com/jimporter/mike.git
Binary files old/pydantic-1.10.7/docs/sponsor_logos/aws.png and 
new/pydantic-1.10.8/docs/sponsor_logos/aws.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/exoflare.png and 
new/pydantic-1.10.8/docs/sponsor_logos/exoflare.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/explosion_ai.png and 
new/pydantic-1.10.8/docs/sponsor_logos/explosion_ai.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/fastapi.png and 
new/pydantic-1.10.8/docs/sponsor_logos/fastapi.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/jina-ai.png and 
new/pydantic-1.10.8/docs/sponsor_logos/jina-ai.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/robusta.png and 
new/pydantic-1.10.8/docs/sponsor_logos/robusta.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/salesforce.png and 
new/pydantic-1.10.8/docs/sponsor_logos/salesforce.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/sendcloud.png and 
new/pydantic-1.10.8/docs/sponsor_logos/sendcloud.png differ
Binary files old/pydantic-1.10.7/docs/sponsor_logos/tutorcruncher.png and 
new/pydantic-1.10.8/docs/sponsor_logos/tutorcruncher.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/theme/announce.html 
new/pydantic-1.10.8/docs/theme/announce.html
--- old/pydantic-1.10.7/docs/theme/announce.html        1970-01-01 
01:00:00.000000000 +0100
+++ new/pydantic-1.10.8/docs/theme/announce.html        2023-05-23 
19:13:55.000000000 +0200
@@ -0,0 +1,4 @@
+<!-- the following line is displayed in the announce bar -->
+<!-- keep length under 164 characters (less HTML tags) to fit on 1280px 
desktop window -->
+<strong>Pydantic V2 alpha 1 is here:</strong>
+We're releasing the first alpha of Pydantic V2 for evaluation. Read the <a 
href="/blog/pydantic-v2-alpha/">alpha release blog post</a> for details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/theme/main.html 
new/pydantic-1.10.8/docs/theme/main.html
--- old/pydantic-1.10.7/docs/theme/main.html    2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/docs/theme/main.html    2023-05-23 19:13:55.000000000 
+0200
@@ -1,13 +1,12 @@
 {% extends "base.html" %}
 
-{% block content %}
-  <div class="admonition success announcement">
-    <p class="admonition-title">Pydantic Company</p>
-    <p>We've started a company based on the principles that I believe have led 
to Pydantic's success.</p>
-    <p>Learning more from the <a 
href="https://pydantic.dev/announcement/";>Company Announcement</a>.</p>
-  </div>
+<!-- start announce block -->
+{% block announce %}
+  {% include 'announce.html' ignore missing %}
+{% endblock %}
+<!-- end announce block -->
 
+{% block content %}
   {{ super() }}
-
   <script src="/flarelytics/client.js"></script>
 {% endblock %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/docs/visual_studio_code.md 
new/pydantic-1.10.8/docs/visual_studio_code.md
--- old/pydantic-1.10.7/docs/visual_studio_code.md      2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/docs/visual_studio_code.md      2023-05-23 
19:13:55.000000000 +0200
@@ -192,7 +192,7 @@
 
 The same idea from the previous example can be put on the same line with the 
help of `cast()`.
 
-This way, the type declaration of the value is overriden inline, without 
requiring another variable.
+This way, the type declaration of the value is overridden inline, without 
requiring another variable.
 
 ```Python hl_lines="1 11"
 from typing import Any, cast
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/mkdocs.yml 
new/pydantic-1.10.8/mkdocs.yml
--- old/pydantic-1.10.7/mkdocs.yml      2023-03-22 20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/mkdocs.yml      2023-05-23 19:13:55.000000000 +0200
@@ -23,6 +23,7 @@
       name: "Switch to light mode"
   features:
     - content.tabs.link
+    - announce.dismiss
   logo: 'logo-white.svg'
   favicon: 'favicon.png'
 
@@ -54,6 +55,7 @@
   - 'Usage with devtools': usage/devtools.md
   - 'Usage with rich': usage/rich.md
 - Blog:
+  - blog/pydantic-v2-alpha.md
   - blog/pydantic-v2.md
 - Contributing to pydantic: contributing.md
 - 'Mypy plugin': mypy_plugin.md
@@ -79,7 +81,14 @@
 - pymdownx.tabbed:
     alternate_style: true 
 
+extra:
+  version:
+    provider: mike
+
 plugins:
+- mike:
+    alias_type: symlink
+    canonical_version: latest
 - search
 - exclude:
     glob:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/env_settings.py 
new/pydantic-1.10.8/pydantic/env_settings.py
--- old/pydantic-1.10.7/pydantic/env_settings.py        2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/pydantic/env_settings.py        2023-05-23 
19:13:55.000000000 +0200
@@ -296,7 +296,7 @@
             for env_name in field.field_info.extra['env_names']:
                 path = find_case_path(secrets_path, env_name, 
settings.__config__.case_sensitive)
                 if not path:
-                    # path does not exist, we curently don't return a warning 
for this
+                    # path does not exist, we currently don't return a warning 
for this
                     continue
 
                 if path.is_file():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/fields.py 
new/pydantic-1.10.8/pydantic/fields.py
--- old/pydantic-1.10.7/pydantic/fields.py      2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/fields.py      2023-05-23 19:13:55.000000000 
+0200
@@ -1107,7 +1107,13 @@
         assert self.discriminator_alias is not None
 
         try:
-            discriminator_value = v[self.discriminator_alias]
+            try:
+                discriminator_value = v[self.discriminator_alias]
+            except KeyError:
+                if self.model_config.allow_population_by_field_name:
+                    discriminator_value = v[self.discriminator_key]
+                else:
+                    raise
         except KeyError:
             return v, 
ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), 
loc)
         except TypeError:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/mypy.py 
new/pydantic-1.10.8/pydantic/mypy.py
--- old/pydantic-1.10.7/pydantic/mypy.py        2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/mypy.py        2023-05-23 19:13:55.000000000 
+0200
@@ -307,15 +307,11 @@
         * stores the fields, config, and if the class is settings in the mypy 
metadata for access by subclasses
         """
         ctx = self._ctx
-        info = self._ctx.cls.info
+        info = ctx.cls.info
 
         self.adjust_validator_signatures()
         config = self.collect_config()
         fields = self.collect_fields(config)
-        for field in fields:
-            if info[field.name].type is None:
-                if not ctx.api.final_iteration:
-                    ctx.api.defer()
         is_settings = any(get_fullname(base) == BASESETTINGS_FULLNAME for base 
in info.mro[:-1])
         self.add_initializer(fields, config, is_settings)
         self.add_construct_method(fields)
@@ -593,7 +589,7 @@
             # only required if default is Ellipsis (i.e., `field_name: 
Annotation = Field(...)`) or if default_factory
             # is specified.
             for arg, name in zip(expr.args, expr.arg_names):
-                # If name is None, then this arg is the default because it is 
the only positonal argument.
+                # If name is None, then this arg is the default because it is 
the only positional argument.
                 if name is None or name == 'default':
                     return arg.__class__ is EllipsisExpr
                 if name == 'default_factory':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/networks.py 
new/pydantic-1.10.8/pydantic/networks.py
--- old/pydantic-1.10.7/pydantic/networks.py    2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/networks.py    2023-05-23 19:13:55.000000000 
+0200
@@ -706,32 +706,34 @@
 
 def validate_email(value: Union[str]) -> Tuple[str, str]:
     """
-    Brutally simple email address validation. Note unlike most email address 
validation
+    Email address validation using https://pypi.org/project/email-validator/
+    Notes:
     * raw ip address (literal) domain parts are not allowed.
     * "John Doe <local_p...@domain.com>" style "pretty" email addresses are 
processed
-    * the local part check is extremely basic. This raises the possibility of 
unicode spoofing, but no better
-        solution is really possible.
     * spaces are striped from the beginning and end of addresses but no error 
is raised
-
-    See RFC 5322 but treat it with suspicion, there seems to exist no 
universally acknowledged test for a valid email!
     """
     if email_validator is None:
         import_email_validator()
-
     m = pretty_email_regex.fullmatch(value)
-    name: Optional[str] = None
+    name: Union[str, None] = None
     if m:
         name, value = m.groups()
-
     email = value.strip()
-
     try:
-        email_validator.validate_email(email, check_deliverability=False)
+        parts = email_validator.validate_email(email, 
check_deliverability=False)
     except email_validator.EmailNotValidError as e:
-        raise errors.EmailError() from e
+        raise errors.EmailError from e
 
-    at_index = email.index('@')
-    local_part = email[:at_index]  # RFC 5321, local part must be 
case-sensitive.
-    global_part = email[at_index:].lower()
+    if hasattr(parts, 'normalized'):
+        # email-validator >= 2
+        email = parts.normalized
+        assert email is not None
+        name = name or parts.local_part
+        return name, email
+    else:
+        # email-validator >1, <2
+        at_index = email.index('@')
+        local_part = email[:at_index]  # RFC 5321, local part must be 
case-sensitive.
+        global_part = email[at_index:].lower()
 
-    return name or local_part, local_part + global_part
+        return name or local_part, local_part + global_part
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/schema.py 
new/pydantic-1.10.8/pydantic/schema.py
--- old/pydantic-1.10.7/pydantic/schema.py      2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/schema.py      2023-05-23 19:13:55.000000000 
+0200
@@ -369,7 +369,7 @@
 
 def get_flat_models_from_field(field: ModelField, known_models: TypeModelSet) 
-> TypeModelSet:
     """
-    Take a single Pydantic ``ModelField`` (from a model) that could have been 
declared as a sublcass of BaseModel
+    Take a single Pydantic ``ModelField`` (from a model) that could have been 
declared as a subclass of BaseModel
     (so, it could be a submodel), and generate a set with its model and all 
the sub-models in the tree.
     I.e. if you pass a field that was declared to be of type ``Foo`` (subclass 
of BaseModel) as ``field``, and that
     model ``Foo`` has a field of type ``Bar`` (also subclass of ``BaseModel``) 
and that model ``Bar`` has a field of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/types.py 
new/pydantic-1.10.8/pydantic/types.py
--- old/pydantic-1.10.7/pydantic/types.py       2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/types.py       2023-05-23 19:13:55.000000000 
+0200
@@ -226,7 +226,13 @@
 
 
 def conint(
-    *, strict: bool = False, gt: int = None, ge: int = None, lt: int = None, 
le: int = None, multiple_of: int = None
+    *,
+    strict: bool = False,
+    gt: Optional[int] = None,
+    ge: Optional[int] = None,
+    lt: Optional[int] = None,
+    le: Optional[int] = None,
+    multiple_of: Optional[int] = None,
 ) -> Type[int]:
     # use kwargs then define conf in a dict to aid with IDE type hinting
     namespace = dict(strict=strict, gt=gt, ge=ge, lt=lt, le=le, 
multiple_of=multiple_of)
@@ -369,8 +375,8 @@
     strip_whitespace: bool = False,
     to_upper: bool = False,
     to_lower: bool = False,
-    min_length: int = None,
-    max_length: int = None,
+    min_length: Optional[int] = None,
+    max_length: Optional[int] = None,
     strict: bool = False,
 ) -> Type[bytes]:
     # use kwargs then define conf in a dict to aid with IDE type hinting
@@ -446,10 +452,10 @@
     to_upper: bool = False,
     to_lower: bool = False,
     strict: bool = False,
-    min_length: int = None,
-    max_length: int = None,
-    curtail_length: int = None,
-    regex: str = None,
+    min_length: Optional[int] = None,
+    max_length: Optional[int] = None,
+    curtail_length: Optional[int] = None,
+    regex: Optional[str] = None,
 ) -> Type[str]:
     # use kwargs then define conf in a dict to aid with IDE type hinting
     namespace = dict(
@@ -510,7 +516,7 @@
         return v
 
 
-def conset(item_type: Type[T], *, min_items: int = None, max_items: int = 
None) -> Type[Set[T]]:
+def conset(item_type: Type[T], *, min_items: Optional[int] = None, max_items: 
Optional[int] = None) -> Type[Set[T]]:
     # __args__ is needed to conform to typing generics api
     namespace = {'min_items': min_items, 'max_items': max_items, 'item_type': 
item_type, '__args__': [item_type]}
     # We use new_class to be able to deal with Generic types
@@ -552,7 +558,9 @@
         return v
 
 
-def confrozenset(item_type: Type[T], *, min_items: int = None, max_items: int 
= None) -> Type[FrozenSet[T]]:
+def confrozenset(
+    item_type: Type[T], *, min_items: Optional[int] = None, max_items: 
Optional[int] = None
+) -> Type[FrozenSet[T]]:
     # __args__ is needed to conform to typing generics api
     namespace = {'min_items': min_items, 'max_items': max_items, 'item_type': 
item_type, '__args__': [item_type]}
     # We use new_class to be able to deal with Generic types
@@ -611,7 +619,7 @@
 
 
 def conlist(
-    item_type: Type[T], *, min_items: int = None, max_items: int = None, 
unique_items: bool = None
+    item_type: Type[T], *, min_items: Optional[int] = None, max_items: 
Optional[int] = None, unique_items: bool = None
 ) -> Type[List[T]]:
     # __args__ is needed to conform to typing generics api
     namespace = dict(
@@ -724,8 +732,8 @@
     ge: Decimal = None,
     lt: Decimal = None,
     le: Decimal = None,
-    max_digits: int = None,
-    decimal_places: int = None,
+    max_digits: Optional[int] = None,
+    decimal_places: Optional[int] = None,
     multiple_of: Decimal = None,
 ) -> Type[Decimal]:
     # use kwargs then define conf in a dict to aid with IDE type hinting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/typing.py 
new/pydantic-1.10.8/pydantic/typing.py
--- old/pydantic-1.10.7/pydantic/typing.py      2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/typing.py      2023-05-23 19:13:55.000000000 
+0200
@@ -1,4 +1,5 @@
 import sys
+import typing
 from collections.abc import Callable
 from os import PathLike
 from typing import (  # type: ignore
@@ -91,6 +92,11 @@
 AnnotatedTypeNames = {'AnnotatedMeta', '_AnnotatedAlias'}
 
 
+LITERAL_TYPES: Set[Any] = {Literal}
+if hasattr(typing, 'Literal'):
+    LITERAL_TYPES.add(typing.Literal)
+
+
 if sys.version_info < (3, 8):
 
     def get_origin(t: Type[Any]) -> Optional[Type[Any]]:
@@ -271,7 +277,13 @@
     MappingIntStrAny = Mapping[IntStr, Any]
     CallableGenerator = Generator[AnyCallable, None, None]
     ReprArgs = Sequence[Tuple[Optional[str], Any]]
-    AnyClassMethod = classmethod[Any]
+
+    MYPY = False
+    if MYPY:
+        AnyClassMethod = classmethod[Any]
+    else:
+        # classmethod[TargetType, CallableParamSpecType, CallableReturnType]
+        AnyClassMethod = classmethod[Any, Any, Any]
 
 __all__ = (
     'AnyCallable',
@@ -348,10 +360,7 @@
 else:
 
     def is_none_type(type_: Any) -> bool:
-        for none_type in NONE_TYPES:
-            if type_ is none_type:
-                return True
-        return False
+        return type_ in NONE_TYPES
 
 
 def display_as_type(v: Type[Any]) -> str:
@@ -409,7 +418,7 @@
 
 
 def is_literal_type(type_: Type[Any]) -> bool:
-    return Literal is not None and get_origin(type_) is Literal
+    return Literal is not None and get_origin(type_) in LITERAL_TYPES
 
 
 def literal_values(type_: Type[Any]) -> Tuple[Any, ...]:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/pydantic/version.py 
new/pydantic-1.10.8/pydantic/version.py
--- old/pydantic-1.10.7/pydantic/version.py     2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/pydantic/version.py     2023-05-23 19:13:55.000000000 
+0200
@@ -1,6 +1,6 @@
 __all__ = 'compiled', 'VERSION', 'version_info'
 
-VERSION = '1.10.7'
+VERSION = '1.10.8'
 
 try:
     import cython  # type: ignore
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/requirements.txt 
new/pydantic-1.10.8/requirements.txt
--- old/pydantic-1.10.7/requirements.txt        2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/requirements.txt        2023-05-23 19:13:55.000000000 
+0200
@@ -2,7 +2,7 @@
 
 Cython==0.29.32;sys_platform!='win32'
 devtools==0.9.0
-email-validator==1.2.1
+email-validator==2.0.0.post2
 dataclasses==0.6; python_version < '3.7'
 typing-extensions==4.3.0
 python-dotenv==0.20.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/mypy/modules/plugin_success.py 
new/pydantic-1.10.8/tests/mypy/modules/plugin_success.py
--- old/pydantic-1.10.7/tests/mypy/modules/plugin_success.py    2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/tests/mypy/modules/plugin_success.py    2023-05-23 
19:13:55.000000000 +0200
@@ -262,3 +262,19 @@
 
 
 Sample(foo='hello world')
+
+
+def get_my_custom_validator(field_name: str) -> Any:
+    @validator(field_name, allow_reuse=True)
+    def my_custom_validator(cls: Any, v: int) -> int:
+        return v
+
+    return my_custom_validator
+
+
+def foo() -> None:
+    class MyModel(BaseModel):
+        number: int
+        custom_validator = get_my_custom_validator('number')
+
+    MyModel(number=2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/pydantic-1.10.7/tests/mypy/outputs/plugin-success-strict.txt 
new/pydantic-1.10.8/tests/mypy/outputs/plugin-success-strict.txt
--- old/pydantic-1.10.7/tests/mypy/outputs/plugin-success-strict.txt    
2023-03-22 20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/tests/mypy/outputs/plugin-success-strict.txt    
2023-05-23 19:13:55.000000000 +0200
@@ -1,3 +1,4 @@
 30: error: Unexpected keyword argument "z" for "Model"  [call-arg]
 65: error: Untyped fields disallowed  [pydantic-field]
 80: error: Argument "x" to "OverrideModel" has incompatible type "float"; 
expected "int"  [arg-type]
+278: error: Untyped fields disallowed  [pydantic-field]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/mypy/test_mypy.py 
new/pydantic-1.10.8/tests/mypy/test_mypy.py
--- old/pydantic-1.10.7/tests/mypy/test_mypy.py 2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/tests/mypy/test_mypy.py 2023-05-23 19:13:55.000000000 
+0200
@@ -64,7 +64,15 @@
     # Specifying a different cache dir for each configuration dramatically 
speeds up subsequent execution
     # It also prevents cache-invalidation-related bugs in the tests
     cache_dir = f'.mypy_cache/test-{os.path.splitext(config_filename)[0]}'
-    command = [full_filename, '--config-file', full_config_filename, 
'--cache-dir', cache_dir, '--show-error-codes']
+    command = [
+        full_filename,
+        '--config-file',
+        full_config_filename,
+        '--cache-dir',
+        cache_dir,
+        '--show-error-codes',
+        '--show-traceback',
+    ]
     print(f"\nExecuting: mypy {' '.join(command)}")  # makes it easier to 
debug as necessary
     actual_result = mypy_api.run(command)
     actual_out, actual_err, actual_returncode = actual_result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/requirements-testing.txt 
new/pydantic-1.10.8/tests/requirements-testing.txt
--- old/pydantic-1.10.7/tests/requirements-testing.txt  2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/tests/requirements-testing.txt  2023-05-23 
19:13:55.000000000 +0200
@@ -1,11 +1,14 @@
 coverage==6.4.4
 hypothesis==6.54.4
 # pin importlib-metadata as upper versions need typing-extensions to work if 
on Python < 3.8
-importlib-metadata==3.1.0;python_version<"3.8"
+importlib-metadata==3.6.0;python_version<"3.8"
 mypy==0.971
 pytest==7.2.1
 pytest-cov==4.0.0
 pytest-mock==3.10.0
 pytest-sugar==0.9.6
 # pin typing-extensions to minimum requirement - see #4885
-typing-extensions==4.2.0
+typing-extensions==4.6.0
+# used in FastAPI tests, pin to avoid warnings in newer version
+# that FastAPI needs to fix
+Flask==2.2.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/test_discrimated_union.py 
new/pydantic-1.10.8/tests/test_discrimated_union.py
--- old/pydantic-1.10.7/tests/test_discrimated_union.py 2023-03-22 
20:29:23.000000000 +0100
+++ new/pydantic-1.10.8/tests/test_discrimated_union.py 2023-05-23 
19:13:55.000000000 +0200
@@ -285,6 +285,80 @@
     assert Top(sub=B(literal='b')).sub.literal == 'b'
 
 
+def test_discriminated_union_model_with_alias():
+    class A(BaseModel):
+        literal: Literal['a'] = Field(alias='lit')
+
+    class B(BaseModel):
+        literal: Literal['b'] = Field(alias='lit')
+
+        class Config:
+            allow_population_by_field_name = True
+
+    class TopDisallow(BaseModel):
+        sub: Union[A, B] = Field(..., discriminator='literal', alias='s')
+
+    class TopAllow(BaseModel):
+        sub: Union[A, B] = Field(..., discriminator='literal', alias='s')
+
+        class Config:
+            allow_population_by_field_name = True
+
+    assert TopDisallow.parse_obj({'s': {'lit': 'a'}}).sub.literal == 'a'
+
+    with pytest.raises(ValidationError) as exc_info:
+        TopDisallow.parse_obj({'s': {'literal': 'b'}})
+
+    assert exc_info.value.errors() == [
+        {
+            'ctx': {'discriminator_key': 'literal'},
+            'loc': ('s',),
+            'msg': "Discriminator 'literal' is missing in value",
+            'type': 'value_error.discriminated_union.missing_discriminator',
+        },
+    ]
+
+    with pytest.raises(ValidationError) as exc_info:
+        TopDisallow.parse_obj({'s': {'literal': 'a'}})
+
+    assert exc_info.value.errors() == [
+        {
+            'ctx': {'discriminator_key': 'literal'},
+            'loc': ('s',),
+            'msg': "Discriminator 'literal' is missing in value",
+            'type': 'value_error.discriminated_union.missing_discriminator',
+        }
+    ]
+
+    with pytest.raises(ValidationError) as exc_info:
+        TopDisallow.parse_obj({'sub': {'lit': 'a'}})
+
+    assert exc_info.value.errors() == [
+        {'loc': ('s',), 'msg': 'field required', 'type': 
'value_error.missing'},
+    ]
+
+    assert TopAllow.parse_obj({'s': {'lit': 'a'}}).sub.literal == 'a'
+    assert TopAllow.parse_obj({'s': {'lit': 'b'}}).sub.literal == 'b'
+    assert TopAllow.parse_obj({'s': {'literal': 'b'}}).sub.literal == 'b'
+    assert TopAllow.parse_obj({'sub': {'lit': 'a'}}).sub.literal == 'a'
+    assert TopAllow.parse_obj({'sub': {'lit': 'b'}}).sub.literal == 'b'
+    assert TopAllow.parse_obj({'sub': {'literal': 'b'}}).sub.literal == 'b'
+
+    with pytest.raises(ValidationError) as exc_info:
+        TopAllow.parse_obj({'s': {'literal': 'a'}})
+
+    assert exc_info.value.errors() == [
+        {'loc': ('s', 'A', 'lit'), 'msg': 'field required', 'type': 
'value_error.missing'},
+    ]
+
+    with pytest.raises(ValidationError) as exc_info:
+        TopAllow.parse_obj({'sub': {'literal': 'a'}})
+
+    assert exc_info.value.errors() == [
+        {'loc': ('s', 'A', 'lit'), 'msg': 'field required', 'type': 
'value_error.missing'},
+    ]
+
+
 def test_discriminated_union_int():
     class A(BaseModel):
         l: Literal[1]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/test_types.py 
new/pydantic-1.10.8/tests/test_types.py
--- old/pydantic-1.10.7/tests/test_types.py     2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/tests/test_types.py     2023-05-23 19:13:55.000000000 
+0200
@@ -3440,3 +3440,22 @@
             'type': 'value_error.date.not_in_the_future',
         }
     ]
+
+
+def test_typing_extension_literal_field():
+    from typing_extensions import Literal
+
+    class Model(BaseModel):
+        foo: Literal['foo']
+
+    assert Model(foo='foo').foo == 'foo'
+
+
+@pytest.mark.skipif(sys.version_info < (3, 8), reason='`typing.Literal` is 
available for python 3.8 and above.')
+def test_typing_literal_field():
+    from typing import Literal
+
+    class Model(BaseModel):
+        foo: Literal['foo']
+
+    assert Model(foo='foo').foo == 'foo'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/test_typing.py 
new/pydantic-1.10.8/tests/test_typing.py
--- old/pydantic-1.10.7/tests/test_typing.py    2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/tests/test_typing.py    2023-05-23 19:13:55.000000000 
+0200
@@ -6,7 +6,7 @@
 from typing_extensions import Annotated  # noqa: F401
 
 from pydantic import Field  # noqa: F401
-from pydantic.typing import Literal, convert_generics, is_namedtuple, 
is_none_type, is_typeddict
+from pydantic.typing import Literal, convert_generics, is_literal_type, 
is_namedtuple, is_none_type, is_typeddict
 
 try:
     from typing import TypedDict as typing_TypedDict
@@ -124,3 +124,18 @@
     assert (
         convert_generics(dict['Hero', list['Team']] | int) == 
dict[ForwardRef('Hero'), list[ForwardRef('Team')]] | int
     )
+
+
+def test_is_literal_with_typing_extension_literal():
+    from typing_extensions import Literal
+
+    assert is_literal_type(Literal) is False
+    assert is_literal_type(Literal['foo']) is True
+
+
+@pytest.mark.skipif(sys.version_info < (3, 8), reason='`typing.Literal` is 
available for python 3.8 and above.')
+def test_is_literal_with_typing_literal():
+    from typing import Literal
+
+    assert is_literal_type(Literal) is False
+    assert is_literal_type(Literal['foo']) is True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydantic-1.10.7/tests/test_utils.py 
new/pydantic-1.10.8/tests/test_utils.py
--- old/pydantic-1.10.7/tests/test_utils.py     2023-03-22 20:29:23.000000000 
+0100
+++ new/pydantic-1.10.8/tests/test_utils.py     2023-05-23 19:13:55.000000000 
+0200
@@ -8,10 +8,9 @@
 from typing import Callable, Dict, ForwardRef, List, NewType, Tuple, TypeVar, 
Union
 
 import pytest
-from pkg_resources import safe_version
 from typing_extensions import Annotated, Literal
 
-from pydantic import VERSION, BaseModel, ConstrainedList, conlist
+from pydantic import BaseModel, ConstrainedList, conlist
 from pydantic.color import Color
 from pydantic.dataclasses import dataclass
 from pydantic.fields import Undefined
@@ -377,10 +376,6 @@
     assert s.count('\n') == 5
 
 
-def test_standard_version():
-    assert safe_version(VERSION) == VERSION
-
-
 def test_class_attribute():
     class Foo:
         attr = ClassAttribute('attr', 'foo')

Reply via email to