summaryrefslogtreecommitdiff
path: root/dev-python
diff options
context:
space:
mode:
authorLiguros - Gitlab CI/CD [feature/flatten] <gitlab@liguros.net>2020-10-09 00:41:40 +0000
committerLiguros - Gitlab CI/CD [feature/flatten] <gitlab@liguros.net>2020-10-09 00:41:40 +0000
commit4c8c321bcb4c72fb07381e83cf15990e2e8ecafc (patch)
tree2505b329105dd9c3cb99e6f224a840d1beac5b36 /dev-python
parentaf36d2f1ecbbfd675291221e8b74229a01f839a1 (diff)
downloadbaldeagleos-repo-4c8c321bcb4c72fb07381e83cf15990e2e8ecafc.tar.gz
baldeagleos-repo-4c8c321bcb4c72fb07381e83cf15990e2e8ecafc.tar.xz
baldeagleos-repo-4c8c321bcb4c72fb07381e83cf15990e2e8ecafc.zip
Updating liguros repo
Diffstat (limited to 'dev-python')
-rw-r--r--dev-python/bleach/bleach-3.2.1.ebuild2
-rw-r--r--dev-python/boto3/Manifest1
-rw-r--r--dev-python/boto3/boto3-1.15.15.ebuild56
-rw-r--r--dev-python/botocore/Manifest1
-rw-r--r--dev-python/botocore/botocore-1.18.15.ebuild59
-rw-r--r--dev-python/html5lib/Manifest1
-rw-r--r--dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch44
-rw-r--r--dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch270
-rw-r--r--dev-python/html5lib/html5lib-1.0.1-r2.ebuild37
-rw-r--r--dev-python/html5lib/html5lib-1.1.ebuild2
-rw-r--r--dev-python/passlib/Manifest1
-rw-r--r--dev-python/passlib/metadata.xml1
-rw-r--r--dev-python/passlib/passlib-1.7.4.ebuild33
-rw-r--r--dev-python/pydantic/Manifest1
-rw-r--r--dev-python/pydantic/files/pydantic-1.6.1-fix-tests.patch45
-rw-r--r--dev-python/pydantic/files/pydantic-1.6.1-py39.patch316
-rw-r--r--dev-python/pydantic/metadata.xml15
-rw-r--r--dev-python/pydantic/pydantic-1.6.1.ebuild38
-rw-r--r--dev-python/sqlparse/Manifest1
-rw-r--r--dev-python/sqlparse/sqlparse-0.4.1.ebuild22
-rw-r--r--dev-python/tqdm/Manifest1
-rw-r--r--dev-python/tqdm/tqdm-4.50.2.ebuild58
22 files changed, 650 insertions, 355 deletions
diff --git a/dev-python/bleach/bleach-3.2.1.ebuild b/dev-python/bleach/bleach-3.2.1.ebuild
index b9030d3ebc6c..56837977c9d4 100644
--- a/dev-python/bleach/bleach-3.2.1.ebuild
+++ b/dev-python/bleach/bleach-3.2.1.ebuild
@@ -12,7 +12,7 @@ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
LICENSE="Apache-2.0"
SLOT="0"
-KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 s390 sparc x86"
RDEPEND="
dev-python/packaging[${PYTHON_USEDEP}]
diff --git a/dev-python/boto3/Manifest b/dev-python/boto3/Manifest
index 90222564325d..d187ce5def14 100644
--- a/dev-python/boto3/Manifest
+++ b/dev-python/boto3/Manifest
@@ -8,6 +8,7 @@ DIST boto3-1.15.11.tar.gz 336108 BLAKE2B 9fdc00c194698c047ba7e42dbe8eedd3952fdb6
DIST boto3-1.15.12.tar.gz 336150 BLAKE2B c6817e39fb19cd40f7cdcf6140303bd1993ec115e4ed9d0379d3fb05d31115abb964df86d5532cf3325a313957006565718945c2b07fb482d241e45a61659134 SHA512 a12cbfdd7664263ce1a2cba40d13b8a1b82fda9acf113c547e660adba46c31f382cce018ebc47686d5c65763ba5507757504ef00a4c5f2f12d3ff161b5badb14
DIST boto3-1.15.13.tar.gz 336233 BLAKE2B d82c38c4021c4f76ba5aa37c2b6328cd4870c3d64b343d2ccf4d441c231243ff369d91ec56b45380ca19b1b35a3934c548bca41a61832a7ca519e4119911c383 SHA512 5e50a212f1b47c79e75d3f2dc6ace0984c82041c11a8c87c831cf3ed2452234089b3f91be05af5342893ae377ad3e119e5e2b5f329cf200a877a46f418b55cc1
DIST boto3-1.15.14.tar.gz 336351 BLAKE2B 61e4ee1b235c07dc3d0d961a3e4b6138c79ee49a9d9e80b15d68d9f1d3bf7eaddc3f993f7de914d2f8ba939d0508875a912b87c58570f91e726a5b44198c2adb SHA512 a40c123b017d45dc100d70d66a2cd7850dbfe5cf3fca715d3f6226e23423c7710a157ec7567d9d9f45311bbb764b47b281c9a3757e9910c4453451bec385383a
+DIST boto3-1.15.15.tar.gz 336346 BLAKE2B 1dab0b7810cba83b28391b50e8c24a50d051827c090f7eb1b9511ecdcfcf625986aba639e292439315a413029c4392fa7a795ab154819ee7ac5dc7cd476169fa SHA512 b6ffe472bac7c6a12d9a1c901ddf9ed55368913e242421282e003eac1c02ad3336993e3c4343e5b8b624ea981e78df2536a41c74f42cc2e8a0d4f46d315200a6
DIST boto3-1.15.2.tar.gz 335231 BLAKE2B f1eb144da7afc1cf630cdc1f61880d094186a37d46556ae361da278fd3045a119dcb09c3d08387a019ca88d6502fa8710a5e5733cd9dc9056676ef17853d76e2 SHA512 6866e0d6a50d11495e5f2a33a392b0edbe1ff6625235b26b5d6028f7c2c7089d78febe17b982f65dc2564254800a23409247ac09716b099f09f3751c5b7f47b5
DIST boto3-1.15.3.tar.gz 335286 BLAKE2B 05c9ef757b8d227ae06a22e78d978821ff50da719f122ac025940b2e1ac5728d6bac044d4bfab95c56ac8c363efd7abfe3de2b3fd65d423ab53dbdfc60b910da SHA512 dfecfc075896ce84fd58d0437b84a6a794af69ff3e598b35b43f83b2b5ef57b88f96ef62a0d6505d5fe7fef0401513c8ecf0dfcaa22e4575510acd3ece191901
DIST boto3-1.15.4.tar.gz 335401 BLAKE2B 42ee1f2cf1e82338ea59a40b95aa5c76abae51aacf325ae845f407ccbc3caf1b3901bca48036889ad6307f96c257259cce39784a3f52ec6ff03c0c6c5633c654 SHA512 14626faa3943b65a215b8f1bce24f217e69421cdfd40caaf7de0fec13ca9b5b25c5e290c27672b2a6bc41316917224209110e2efd5be817de7273f93ae5764ce
diff --git a/dev-python/boto3/boto3-1.15.15.ebuild b/dev-python/boto3/boto3-1.15.15.ebuild
new file mode 100644
index 000000000000..12584b2fba42
--- /dev/null
+++ b/dev-python/boto3/boto3-1.15.15.ebuild
@@ -0,0 +1,56 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{5,6,7,8,9} )
+DISTUTILS_USE_SETUPTOOLS=bdepend
+inherit distutils-r1
+
+DESCRIPTION="The AWS SDK for Python"
+HOMEPAGE="https://github.com/boto/boto3"
+LICENSE="Apache-2.0"
+SLOT="0"
+
+if [[ "${PV}" == "9999" ]]; then
+ EGIT_REPO_URI="https://github.com/boto/boto3"
+ inherit git-r3
+ BOTOCORE_PV=${PV}
+else
+ SRC_URI="https://github.com/boto/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
+ KEYWORDS="~amd64 ~arm ~arm64 ~x86 ~amd64-linux ~x86-linux"
+
+ # botocore is x.(y+3).z
+ BOTOCORE_PV="$(ver_cut 1).$(( $(ver_cut 2) + 3)).$(ver_cut 3-)"
+fi
+
+RDEPEND="
+ >=dev-python/botocore-${BOTOCORE_PV}[${PYTHON_USEDEP}]
+ >=dev-python/jmespath-0.7.1[${PYTHON_USEDEP}]
+ >=dev-python/s3transfer-0.3.0[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ test? (
+ dev-python/mock[${PYTHON_USEDEP}]
+ )
+"
+
+distutils_enable_sphinx docs/source \
+ 'dev-python/guzzle_sphinx_theme'
+distutils_enable_tests nose
+
+python_prepare_all() {
+ # don't lock versions to narrow ranges
+ sed -e '/botocore/ d' \
+ -e '/jmespath/ d' \
+ -e '/s3transfer/ d' \
+ -i setup.py || die
+
+ # prevent an infinite loop
+ rm tests/functional/docs/test_smoke.py || die
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ nosetests -v tests/unit/ tests/functional/ || die "test failed under ${EPYTHON}"
+}
diff --git a/dev-python/botocore/Manifest b/dev-python/botocore/Manifest
index 83e1b48052eb..126b2ec4e757 100644
--- a/dev-python/botocore/Manifest
+++ b/dev-python/botocore/Manifest
@@ -8,6 +8,7 @@ DIST botocore-1.18.11.tar.gz 6903038 BLAKE2B 07115ca9106997f9185fe84ef0ce8dd415e
DIST botocore-1.18.12.tar.gz 6913367 BLAKE2B 243b30d32e229d72d659ebf2b27b57a69042f488c8ca43e00f82e6b64e2c09665e129894b972ce806ea0bd0a89a295d0545d1d53e0cd3246d2dafcdb2e43f56c SHA512 173e5b3ed7de93362ea69e581b236b551dfeec7f8a57652ca04347f334e5163f5adf52acd20a2aef0cfe20f157d0a5b13f09ca4c92bf603f6a3f22d517cf6306
DIST botocore-1.18.13.tar.gz 6919052 BLAKE2B 52ef86c31e0b92221058ad2eb43eafe2953c59d1ed21d033f855961b409f43a77cfd72cce297b9752e230cb9953ed55febd3b0bdf44c99733472868b7e3db8dc SHA512 b3cf534d679533e43dee05d6c6e89271b88bd11185abf3790effe8df3b698e1d79a96d3d23b51f943861f975a3c883d9318e085b8ceda8d9dc454f6f0c50b9e7
DIST botocore-1.18.14.tar.gz 6924624 BLAKE2B 78aa481a792cdd54712730189808df3627c5475e0f86a6927978eeb4c0056ed8f5f65d35949094164fba5be31b05664418b1c9368af265af5bd52c95a159c9a8 SHA512 dcc790b786634a308676b8f43b3bc9fbf4c84ac455a547b2240eb48bf93592fd30f68616efa562be0f1b59fa1a8b5dcefa1d5453ffaaf21804a282a5fcb56f47
+DIST botocore-1.18.15.tar.gz 6926102 BLAKE2B 04947ce595233c04c37268ffb237ba97b1a758280367ed4e01dc9dec17daf75e545d621f42b08fc74d7a27d680188ac3405b4368adef0c1adf6949225913af72 SHA512 a97f12a6fdbdeb97b4e44c895122bee6aeef0b67211dfdb43c7b5aa41af9b4881fcc9d75d83b0dfbc716000c8429577d7c2e73ea63b84f8337ef5f826a3a7015
DIST botocore-1.18.2.tar.gz 6843154 BLAKE2B 77f4cbccd6a686cfbdb2f25fafb9f2210c0e23de72fb40403f905711ec5d073b92cfd003d39406d273feb0bfb90e2ab594f2bb9c1564b5b0879efdf3bcfa47e3 SHA512 f4fec4caf3b4ebca8a593d58827fb4377c2458b7ebccb53ccd830df5423a2021ecebd534d2fe276662f8d8e91078bb5adbf611a52baa29c8ab3526d9c7b975ac
DIST botocore-1.18.3.tar.gz 6846755 BLAKE2B 3f6709cac832dff1ba07c2e8b4c235b5bcdf305c9851eedea2ce5f7847d0be93d7e9cbcb1765add47aaec1d0c1c31cdd2c88542a984af570140ffb7fe30d8388 SHA512 a8831b1549a768cea9d550dc2dc3c1c8afc03e018d2ce246569bed35cb9ce25bcb18689d066dc5b6e6dcc69db93e0b0957b32cb68c101127e01cfe3fbfa9fe08
DIST botocore-1.18.4.tar.gz 6850892 BLAKE2B 013319b1055db5a65f25b4d11c0ae97e6eb58a8976eafea98c80a33c756b8715d69fddb86c900e9c3c1a6447d05a7afd2f11a155db5f6cbcefc5f80fccbf680c SHA512 c84b7c5dcb78101d6d04bea2a4453e2c47711133bf4ee1e96c6bea18a0b3de7c41021bfe5ac501eeb2b35d50bfe8782ee29d931adf79ae77a45a2f3b117716df
diff --git a/dev-python/botocore/botocore-1.18.15.ebuild b/dev-python/botocore/botocore-1.18.15.ebuild
new file mode 100644
index 000000000000..12940d28a2af
--- /dev/null
+++ b/dev-python/botocore/botocore-1.18.15.ebuild
@@ -0,0 +1,59 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{5,6,7,8,9} )
+
+inherit distutils-r1
+
+DESCRIPTION="Low-level, data-driven core of boto 3"
+HOMEPAGE="https://github.com/boto/botocore"
+LICENSE="Apache-2.0"
+SLOT="0"
+
+if [[ "${PV}" == "9999" ]]; then
+ EGIT_REPO_URI="https://github.com/boto/botocore"
+ inherit git-r3
+else
+ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+ KEYWORDS="~amd64 ~arm ~arm64 ~x86 ~amd64-linux ~x86-linux"
+fi
+
+RDEPEND="
+ dev-python/six[${PYTHON_USEDEP}]
+ dev-python/jmespath[${PYTHON_USEDEP}]
+ dev-python/python-dateutil[${PYTHON_USEDEP}]
+ dev-python/urllib3[${PYTHON_USEDEP}]
+"
+BDEPEND="
+ test? (
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/jsonschema[${PYTHON_USEDEP}]
+ )
+"
+
+PATCHES=(
+ "${FILESDIR}/1.8.6-tests-pass-all-env-vars-to-cmd-runner.patch"
+)
+
+distutils_enable_sphinx docs/source \
+ 'dev-python/guzzle_sphinx_theme'
+distutils_enable_tests nose
+
+src_prepare() {
+ # unpin deps
+ sed -i -e "s:>=.*':':" setup.py || die
+ # very unstable
+ sed -i -e 's:test_stress_test_token_bucket:_&:' \
+ tests/functional/retries/test_bucket.py || die
+ distutils-r1_src_prepare
+}
+
+python_test() {
+ # note: suites need to be run separately as one of the unit tests
+ # seems to be leaking mocks and breaking a few functional tests
+ nosetests -v tests/unit ||
+ die "unit tests failed under ${EPYTHON}"
+ nosetests -v tests/functional ||
+ die "functional tests failed under ${EPYTHON}"
+}
diff --git a/dev-python/html5lib/Manifest b/dev-python/html5lib/Manifest
index 03c605eb9e69..24a9ed5ed3c1 100644
--- a/dev-python/html5lib/Manifest
+++ b/dev-python/html5lib/Manifest
@@ -1,2 +1 @@
-DIST html5lib-1.0.1.tar.gz 252959 BLAKE2B d2a9fa19d6a18b9e0c39f737a22ff4d5a6533734843f787c083f9497fd94788dad0e1e96478fe48b262c208370cf58e91ab94cc06a3e2757a40e936363cd3148 SHA512 35939b4450893864da04e735ee5e0addacf1dd34bae6a6909c76572abf6bfded446a78a713dfde91c1485ba45867d7abeb6a45cf0545c16ea968707be7de5dd2
DIST html5lib-1.1.tar.gz 272215 BLAKE2B 11a4fc3fb84bf8bab4af5da1de30b0892a9eb454505716b3db391187053c9aac159b1c82ae787896592b8fc850363bba9313b9d7fc617150771c3bfa1aeadefb SHA512 af7c29591007fded99be6c38e3d0ae5a4ac32d71d26046a615918ae732cb1c1ecbf754f47ceca1a53726c3843f3ecea7af87a7362281b45ff3af495815818626
diff --git a/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch b/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch
deleted file mode 100644
index d5a9dcac299d..000000000000
--- a/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 4f9235752cea29c5a31721440578b430823a1e69 Mon Sep 17 00:00:00 2001
-From: 5j9 <5j9@users.noreply.github.com>
-Date: Mon, 1 Oct 2018 15:02:33 +0330
-Subject: [PATCH] Try to import MutableMapping from collections.abc (#403)
-
-Note that collections.abc has been added in Python 3.3.
-
-Fixes #402
----
- html5lib/_trie/_base.py | 5 ++++-
- html5lib/treebuilders/dom.py | 5 ++++-
- 2 files changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/html5lib/_trie/_base.py b/html5lib/_trie/_base.py
-index a1158bbb..6b71975f 100644
---- a/html5lib/_trie/_base.py
-+++ b/html5lib/_trie/_base.py
-@@ -1,6 +1,9 @@
- from __future__ import absolute_import, division, unicode_literals
-
--from collections import Mapping
-+try:
-+ from collections.abc import Mapping
-+except ImportError: # Python 2.7
-+ from collections import Mapping
-
-
- class Trie(Mapping):
-diff --git a/html5lib/treebuilders/dom.py b/html5lib/treebuilders/dom.py
-index dcfac220..d8b53004 100644
---- a/html5lib/treebuilders/dom.py
-+++ b/html5lib/treebuilders/dom.py
-@@ -1,7 +1,10 @@
- from __future__ import absolute_import, division, unicode_literals
-
-
--from collections import MutableMapping
-+try:
-+ from collections.abc import MutableMapping
-+except ImportError: # Python 2.7
-+ from collections import MutableMapping
- from xml.dom import minidom, Node
- import weakref
-
diff --git a/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch b/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch
deleted file mode 100644
index 98c9fb23fc77..000000000000
--- a/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch
+++ /dev/null
@@ -1,270 +0,0 @@
-From 2699544837e68b12f1740a7eb56882a0dc0a4008 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
-Date: Thu, 28 Mar 2019 01:45:43 +0100
-Subject: [PATCH 1/4] Support pytest 4
-
-Fixes https://github.com/html5lib/html5lib-python/issues/411
----
- html5lib/tests/test_encoding.py | 4 ++--
- html5lib/tests/test_sanitizer.py | 14 +++++++-------
- html5lib/tests/test_serializer.py | 2 +-
- html5lib/tests/test_stream.py | 7 ++++---
- html5lib/tests/test_treewalkers.py | 2 +-
- requirements-test.txt | 2 +-
- tox.ini | 2 +-
- 7 files changed, 17 insertions(+), 16 deletions(-)
-
-diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py
-index 9a411c77..97b6ca2a 100644
---- a/html5lib/tests/test_encoding.py
-+++ b/html5lib/tests/test_encoding.py
-@@ -99,8 +99,8 @@ def test_encoding():
- for filename in get_data_files("encoding"):
- tests = _TestData(filename, b"data", encoding=None)
- for test in tests:
-- yield (runParserEncodingTest, test[b'data'], test[b'encoding'])
-- yield (runPreScanEncodingTest, test[b'data'], test[b'encoding'])
-+ runParserEncodingTest(test[b'data'], test[b'encoding'])
-+ runPreScanEncodingTest(test[b'data'], test[b'encoding'])
-
-
- # pylint:disable=wrong-import-position
-diff --git a/html5lib/tests/test_sanitizer.py b/html5lib/tests/test_sanitizer.py
-index 45046d57..1b7285fc 100644
---- a/html5lib/tests/test_sanitizer.py
-+++ b/html5lib/tests/test_sanitizer.py
-@@ -67,19 +67,19 @@ def test_sanitizer():
- 'tfoot', 'th', 'thead', 'tr', 'select']:
- continue # TODO
- if tag_name == 'image':
-- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
-+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
- "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
- elif tag_name == 'br':
-- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
-+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
- "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
- elif tag_name in constants.voidElements:
-- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
-+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
- "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" % tag_name,
- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
- else:
-- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
-+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
- "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" % (tag_name, tag_name),
- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
-
-@@ -93,7 +93,7 @@ def test_sanitizer():
- attribute_value = 'foo'
- if attribute_name in sanitizer.attr_val_is_uri:
- attribute_value = '%s://sub.domain.tld/path/object.ext' % sanitizer.allowed_protocols[0]
-- yield (runSanitizerTest, "test_should_allow_%s_attribute" % attribute_name,
-+ runSanitizerTest("test_should_allow_%s_attribute" % attribute_name,
- "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" % (attribute_name, attribute_value),
- "<p %s='%s'>foo <bad>bar</bad> baz</p>" % (attribute_name, attribute_value))
-
-@@ -101,7 +101,7 @@ def test_sanitizer():
- rest_of_uri = '//sub.domain.tld/path/object.ext'
- if protocol == 'data':
- rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
-- yield (runSanitizerTest, "test_should_allow_uppercase_%s_uris" % protocol,
-+ runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
-
-@@ -110,7 +110,7 @@ def test_sanitizer():
- if protocol == 'data':
- rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
- protocol = protocol.upper()
-- yield (runSanitizerTest, "test_should_allow_uppercase_%s_uris" % protocol,
-+ runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
-
-diff --git a/html5lib/tests/test_serializer.py b/html5lib/tests/test_serializer.py
-index c23592af..a4250935 100644
---- a/html5lib/tests/test_serializer.py
-+++ b/html5lib/tests/test_serializer.py
-@@ -222,4 +222,4 @@ def test_serializer():
- with open(filename) as fp:
- tests = json.load(fp)
- for test in tests['tests']:
-- yield runSerializerTest, test["input"], test["expected"], test.get("options", {})
-+ runSerializerTest(test["input"], test["expected"], test.get("options", {}))
-diff --git a/html5lib/tests/test_stream.py b/html5lib/tests/test_stream.py
-index 27c39538..a9b3ebbe 100644
---- a/html5lib/tests/test_stream.py
-+++ b/html5lib/tests/test_stream.py
-@@ -308,9 +308,10 @@ def test_invalid_codepoints(inp, num):
- ("'\\uD800\\uD800\\uD800'", 3),
- ("'a\\uD800a\\uD800a\\uD800a'", 3),
- ("'\\uDFFF\\uDBFF'", 2),
-- pytest.mark.skipif(sys.maxunicode == 0xFFFF,
-- ("'\\uDBFF\\uDFFF'", 2),
-- reason="narrow Python")])
-+ pytest.param(
-+ "'\\uDBFF\\uDFFF'", 2,
-+ mark=pytest.mark.skipif(sys.maxunicode == 0xFFFF,
-+ reason="narrow Python"))])
- def test_invalid_codepoints_surrogates(inp, num):
- inp = eval(inp) # pylint:disable=eval-used
- fp = StringIO(inp)
-diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py
-index 67fc89e5..c2323b7e 100644
---- a/html5lib/tests/test_treewalkers.py
-+++ b/html5lib/tests/test_treewalkers.py
-@@ -99,7 +99,7 @@ def test_treewalker_six_mix():
-
- for tree in sorted(treeTypes.items()):
- for intext, attrs, expected in sm_tests:
-- yield runTreewalkerEditTest, intext, expected, attrs, tree
-+ runTreewalkerEditTest(intext, expected, attrs, tree)
-
-
- @pytest.mark.parametrize("tree,char", itertools.product(sorted(treeTypes.items()), ["x", "\u1234"]))
-diff --git a/requirements-test.txt b/requirements-test.txt
-index 4e223a3f..b936e0fa 100644
---- a/requirements-test.txt
-+++ b/requirements-test.txt
-@@ -4,7 +4,7 @@ tox
-
- flake8<3.0
-
--pytest==3.2.5
-+pytest>=4.3,<4.4
- coverage
- pytest-expect>=1.1,<2.0
- mock
-diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py
-index 97b6ca2a..9f137e7a 100644
---- a/html5lib/tests/test_encoding.py
-+++ b/html5lib/tests/test_encoding.py
-@@ -95,6 +95,7 @@ def runPreScanEncodingTest(data, encoding):
- assert encoding == stream.charEncoding[0].name, errorMessage(data, encoding, stream.charEncoding[0].name)
-
-
-+@pytest.mark.skip(reason="broken under pytest4")
- def test_encoding():
- for filename in get_data_files("encoding"):
- tests = _TestData(filename, b"data", encoding=None)
-
-From 8ded69fdc0ae45f0531e1633927beb2190ab18a6 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
-Date: Fri, 8 Nov 2019 15:28:00 +0100
-Subject: [PATCH 3/4] Make flake8 happy
-
----
- html5lib/tests/test_sanitizer.py | 44 ++++++++++++++++++++------------
- 1 file changed, 27 insertions(+), 17 deletions(-)
-
-diff --git a/html5lib/tests/test_sanitizer.py b/html5lib/tests/test_sanitizer.py
-index 1b7285fc..a29d5ef3 100644
---- a/html5lib/tests/test_sanitizer.py
-+++ b/html5lib/tests/test_sanitizer.py
-@@ -63,25 +63,32 @@ def test_sanitizer():
- for ns, tag_name in sanitizer.allowed_elements:
- if ns != constants.namespaces["html"]:
- continue
-- if tag_name in ['caption', 'col', 'colgroup', 'optgroup', 'option', 'table', 'tbody', 'td',
-- 'tfoot', 'th', 'thead', 'tr', 'select']:
-+ if tag_name in ['caption', 'col', 'colgroup', 'optgroup', 'option',
-+ 'table', 'tbody', 'td', 'tfoot', 'th', 'thead',
-+ 'tr', 'select']:
- continue # TODO
- if tag_name == 'image':
- runSanitizerTest("test_should_allow_%s_tag" % tag_name,
-- "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
-- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
-+ "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
-+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
-+ (tag_name, tag_name))
- elif tag_name == 'br':
- runSanitizerTest("test_should_allow_%s_tag" % tag_name,
-- "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
-- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
-+ "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
-+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
-+ (tag_name, tag_name))
- elif tag_name in constants.voidElements:
- runSanitizerTest("test_should_allow_%s_tag" % tag_name,
-- "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" % tag_name,
-- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
-+ "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" %
-+ tag_name,
-+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
-+ (tag_name, tag_name))
- else:
- runSanitizerTest("test_should_allow_%s_tag" % tag_name,
-- "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" % (tag_name, tag_name),
-- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
-+ "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" %
-+ (tag_name, tag_name),
-+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
-+ (tag_name, tag_name))
-
- for ns, attribute_name in sanitizer.allowed_attributes:
- if ns is not None:
-@@ -92,18 +99,21 @@ def test_sanitizer():
- continue
- attribute_value = 'foo'
- if attribute_name in sanitizer.attr_val_is_uri:
-- attribute_value = '%s://sub.domain.tld/path/object.ext' % sanitizer.allowed_protocols[0]
-+ attribute_value = '%s://sub.domain.tld/path/object.ext' \
-+ % sanitizer.allowed_protocols[0]
- runSanitizerTest("test_should_allow_%s_attribute" % attribute_name,
-- "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" % (attribute_name, attribute_value),
-- "<p %s='%s'>foo <bad>bar</bad> baz</p>" % (attribute_name, attribute_value))
-+ "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" %
-+ (attribute_name, attribute_value),
-+ "<p %s='%s'>foo <bad>bar</bad> baz</p>" %
-+ (attribute_name, attribute_value))
-
- for protocol in sanitizer.allowed_protocols:
- rest_of_uri = '//sub.domain.tld/path/object.ext'
- if protocol == 'data':
- rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
- runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
-- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
-- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
-+ "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
-+ '<img src="%s:%s">foo</a>' % (protocol, rest_of_uri))
-
- for protocol in sanitizer.allowed_protocols:
- rest_of_uri = '//sub.domain.tld/path/object.ext'
-@@ -111,8 +121,8 @@ def test_sanitizer():
- rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
- protocol = protocol.upper()
- runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
-- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
-- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
-+ "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
-+ '<img src="%s:%s">foo</a>' % (protocol, rest_of_uri))
-
-
- def test_lowercase_color_codes_in_style():
-
-From b4d066b2d9b4ea1135183c6500565c2ab8758bf1 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
-Date: Fri, 8 Nov 2019 16:17:19 +0100
-Subject: [PATCH 4/4] No limits on the upper version of pytest
-
----
- requirements-test.txt | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/requirements-test.txt b/requirements-test.txt
-index b936e0fa..1cd46922 100644
---- a/requirements-test.txt
-+++ b/requirements-test.txt
-@@ -4,7 +4,7 @@ tox
-
- flake8<3.0
-
--pytest>=4.3,<4.4
-+pytest>=4.3
- coverage
- pytest-expect>=1.1,<2.0
- mock
diff --git a/dev-python/html5lib/html5lib-1.0.1-r2.ebuild b/dev-python/html5lib/html5lib-1.0.1-r2.ebuild
deleted file mode 100644
index 70ca6e1eb355..000000000000
--- a/dev-python/html5lib/html5lib-1.0.1-r2.ebuild
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-PYTHON_COMPAT=( python3_{5,6,7,8,9} pypy3 )
-PYTHON_REQ_USE="xml(+)"
-
-inherit distutils-r1
-
-DESCRIPTION="HTML parser based on the HTML5 specification"
-HOMEPAGE="https://github.com/html5lib/html5lib-python/ https://html5lib.readthedocs.org"
-SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
-LICENSE="MIT"
-SLOT="0"
-KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 s390 sparc x86 ~x64-macos"
-IUSE="test"
-RESTRICT+=" !test? ( test )"
-
-RDEPEND=">=dev-python/six-1.9[${PYTHON_USEDEP}]
- dev-python/webencodings[${PYTHON_USEDEP}]"
-BDEPEND="
- test? (
- ${RDEPEND}
- dev-python/pytest-expect[${PYTHON_USEDEP}]
- dev-python/mock[${PYTHON_USEDEP}]
- )"
-
-PATCHES=(
- # fix deprecated import
- "${FILESDIR}/html5lib-1.0.1-collections-abc.patch"
- # https://github.com/html5lib/html5lib-python/pull/429
- "${FILESDIR}/html5lib-python-1.0.1-support-pytest4.patch"
-)
-
-distutils_enable_tests pytest
diff --git a/dev-python/html5lib/html5lib-1.1.ebuild b/dev-python/html5lib/html5lib-1.1.ebuild
index 9b4476cbef8b..fc7790f2fbba 100644
--- a/dev-python/html5lib/html5lib-1.1.ebuild
+++ b/dev-python/html5lib/html5lib-1.1.ebuild
@@ -14,7 +14,7 @@ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
LICENSE="MIT"
SLOT="0"
-KEYWORDS="~alpha ~amd64 ~arm ~arm64 hppa ~ia64 ~mips ppc ppc64 ~riscv ~s390 sparc x86 ~x64-macos"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 ~riscv s390 sparc x86 ~x64-macos"
IUSE="test"
RESTRICT+=" !test? ( test )"
diff --git a/dev-python/passlib/Manifest b/dev-python/passlib/Manifest
index 2da76b89308b..dd4d6da38fe6 100644
--- a/dev-python/passlib/Manifest
+++ b/dev-python/passlib/Manifest
@@ -1 +1,2 @@
DIST passlib-1.7.2.tar.gz 649654 BLAKE2B 40279113d9ff633cea47222f2d72af0abee78dc52a9b46adf66aaae213594eaae7f245cc80004f85b5055b882741b4bedfd81ee39132db23760d37a34e87ac6a SHA512 1ea0654b177b5ab2e1a7e5c3949642c34805ace6e4e4a0f82fafdb3f374edd99c667906ce598c335b668da049860648d5cbebb3e62d775898d5b0cb8cfc7bf53
+DIST passlib-1.7.4.tar.gz 689844 BLAKE2B 38f616105ba70cf93cf36383c73f2a4da7bf66ced2844effffe74d9f7c29ee0aece5652974dd1414f16e32fbe6957e2e921cf01bc59daa70195a6d50a4a3bf2f SHA512 350bd6da5ac57e6c266ffe8bf9684c8c2cce3fc6b513eb6c7bc1b302d2d8a1b701e9c01c953782520a2ac37b7ec1f6d7bd5855f99f6ee0e2dbbf33f2d49a9530
diff --git a/dev-python/passlib/metadata.xml b/dev-python/passlib/metadata.xml
index ee090a3b1952..a5b2e0ec0296 100644
--- a/dev-python/passlib/metadata.xml
+++ b/dev-python/passlib/metadata.xml
@@ -20,7 +20,6 @@
</use>
<upstream>
<remote-id type="pypi">passlib</remote-id>
- <remote-id type="bitbucket">ecollins/passlib</remote-id>
</upstream>
<origin>gentoo-staging</origin>
</pkgmetadata>
diff --git a/dev-python/passlib/passlib-1.7.4.ebuild b/dev-python/passlib/passlib-1.7.4.ebuild
new file mode 100644
index 000000000000..36ef6b66e6c5
--- /dev/null
+++ b/dev-python/passlib/passlib-1.7.4.ebuild
@@ -0,0 +1,33 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{5,6,7,8,9} pypy3 )
+
+inherit distutils-r1
+
+DESCRIPTION="Password hashing framework supporting over 20 schemes"
+HOMEPAGE="https://foss.heptapod.net/python-libs/passlib/wikis/home"
+SRC_URI="mirror://pypi/p/${PN}/${P}.tar.gz"
+
+LICENSE="BSD-2"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+SLOT="0"
+IUSE="+bcrypt doc +scrypt +totp"
+
+RDEPEND="bcrypt? ( dev-python/bcrypt[${PYTHON_USEDEP}] )
+ totp? ( dev-python/cryptography[${PYTHON_USEDEP}] )
+ scrypt? ( dev-python/scrypt[${PYTHON_USEDEP}] )"
+BDEPEND="
+ test? (
+ dev-python/bcrypt[${PYTHON_USEDEP}]
+ dev-python/cryptography[${PYTHON_USEDEP}]
+ dev-python/scrypt[${PYTHON_USEDEP}]
+ )"
+
+distutils_enable_tests nose
+
+python_install_all() {
+ distutils-r1_python_install_all
+ use doc && dodoc docs/{*.rst,requirements.txt,lib/*.rst}
+}
diff --git a/dev-python/pydantic/Manifest b/dev-python/pydantic/Manifest
new file mode 100644
index 000000000000..08803723d751
--- /dev/null
+++ b/dev-python/pydantic/Manifest
@@ -0,0 +1 @@
+DIST pydantic-1.6.1.tar.gz 244677 BLAKE2B 0a1d6986858ab753cbc4dd262bd268b2a365c241a7de106a7bf21714c6c499c7dbacaea095789d3503507965ca50106da32545be670ed0261827f1fe0316ff67 SHA512 b0442f78a661f56d29697da7e27393261420bdb0f08473d2f7872145a49a18de8c17c903d0899a44263bcd8229e8790161da032dd5a3d5f2dae347c66bd6a567
diff --git a/dev-python/pydantic/files/pydantic-1.6.1-fix-tests.patch b/dev-python/pydantic/files/pydantic-1.6.1-fix-tests.patch
new file mode 100644
index 000000000000..1d6dc5d311a6
--- /dev/null
+++ b/dev-python/pydantic/files/pydantic-1.6.1-fix-tests.patch
@@ -0,0 +1,45 @@
+commit 44eac223df11a1b711ffe0d7946019a173c2a88e
+Author: Louis Sautier <sautier.louis@gmail.com>
+Date: Thu Oct 8 14:19:58 2020 +0200
+
+ test_config_file_settings_nornir: use less common env. var names
+
+ Gentoo's Portage sets A during the test phase, switching to less common
+ environment variable names reduces the likelihood of something similar
+ happening.
+
+diff --git a/tests/test_settings.py b/tests/test_settings.py
+index d24aae3..1f4d678 100644
+--- a/tests/test_settings.py
++++ b/tests/test_settings.py
+@@ -437,21 +437,21 @@ def test_config_file_settings_nornir(env):
+ """
+
+ class Settings(BaseSettings):
+- a: str
+- b: str
+- c: str
++ param_a: str
++ param_b: str
++ param_c: str
+
+ def _build_values(self, init_kwargs, _env_file, _env_file_encoding):
+ config_settings = init_kwargs.pop('__config_settings__')
+ return {**config_settings, **init_kwargs, **self._build_environ()}
+
+- env.set('C', 'env setting c')
++ env.set('PARAM_C', 'env setting c')
+
+- config = {'a': 'config a', 'b': 'config b', 'c': 'config c'}
+- s = Settings(__config_settings__=config, b='argument b', c='argument c')
+- assert s.a == 'config a'
+- assert s.b == 'argument b'
+- assert s.c == 'env setting c'
++ config = {'param_a': 'config a', 'param_b': 'config b', 'param_c': 'config c'}
++ s = Settings(__config_settings__=config, param_b='argument b', param_c='argument c')
++ assert s.param_a == 'config a'
++ assert s.param_b == 'argument b'
++ assert s.param_c == 'env setting c'
+
+
+ test_env_file = """\
diff --git a/dev-python/pydantic/files/pydantic-1.6.1-py39.patch b/dev-python/pydantic/files/pydantic-1.6.1-py39.patch
new file mode 100644
index 000000000000..7cd5290cd591
--- /dev/null
+++ b/dev-python/pydantic/files/pydantic-1.6.1-py39.patch
@@ -0,0 +1,316 @@
+diff --git a/changes/1832-PrettyWood.md b/changes/1832-PrettyWood.md
+new file mode 100644
+index 000000000..5038a0da0
+--- /dev/null
++++ b/changes/1832-PrettyWood.md
+@@ -0,0 +1 @@
++add basic support of python 3.9
+diff --git a/pydantic/fields.py b/pydantic/fields.py
+index 01792b628..c52b34ea4 100644
+--- a/pydantic/fields.py
++++ b/pydantic/fields.py
+@@ -32,6 +32,8 @@
+ NoArgAnyCallable,
+ NoneType,
+ display_as_type,
++ get_args,
++ get_origin,
+ is_literal_type,
+ is_new_type,
+ new_type_supertype,
+@@ -411,7 +413,7 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ elif is_literal_type(self.type_):
+ return
+
+- origin = getattr(self.type_, '__origin__', None)
++ origin = get_origin(self.type_)
+ if origin is None:
+ # field is not "typing" object eg. Union, Dict, List etc.
+ # allow None for virtual superclasses of NoneType, e.g. Hashable
+@@ -422,7 +424,7 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ return
+ if origin is Union:
+ types_ = []
+- for type_ in self.type_.__args__:
++ for type_ in get_args(self.type_):
+ if type_ is NoneType:
+ if self.required is Undefined:
+ self.required = False
+@@ -444,9 +446,9 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ if issubclass(origin, Tuple): # type: ignore
+ self.shape = SHAPE_TUPLE
+ self.sub_fields = []
+- for i, t in enumerate(self.type_.__args__):
++ for i, t in enumerate(get_args(self.type_)):
+ if t is Ellipsis:
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_TUPLE_ELLIPSIS
+ return
+ self.sub_fields.append(self._create_sub_type(t, f'{self.name}_{i}'))
+@@ -460,7 +462,7 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ {f'list_{i}': Validator(validator, pre=True) for i, validator in enumerate(get_validators())}
+ )
+
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_LIST
+ elif issubclass(origin, Set):
+ # Create self validators
+@@ -470,22 +472,22 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ {f'set_{i}': Validator(validator, pre=True) for i, validator in enumerate(get_validators())}
+ )
+
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_SET
+ elif issubclass(origin, FrozenSet):
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_FROZENSET
+ elif issubclass(origin, Sequence):
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_SEQUENCE
+ elif issubclass(origin, Mapping):
+- self.key_field = self._create_sub_type(self.type_.__args__[0], 'key_' + self.name, for_keys=True)
+- self.type_ = self.type_.__args__[1]
++ self.key_field = self._create_sub_type(get_args(self.type_)[0], 'key_' + self.name, for_keys=True)
++ self.type_ = get_args(self.type_)[1]
+ self.shape = SHAPE_MAPPING
+ # Equality check as almost everything inherits form Iterable, including str
+ # check for Iterable and CollectionsIterable, as it could receive one even when declared with the other
+ elif origin in {Iterable, CollectionsIterable}:
+- self.type_ = self.type_.__args__[0]
++ self.type_ = get_args(self.type_)[0]
+ self.shape = SHAPE_ITERABLE
+ self.sub_fields = [self._create_sub_type(self.type_, f'{self.name}_type')]
+ elif issubclass(origin, Type): # type: ignore
+@@ -494,7 +496,7 @@ def _type_analysis(self) -> None: # noqa: C901 (ignore complexity)
+ # Is a Pydantic-compatible generic that handles itself
+ # or we have arbitrary_types_allowed = True
+ self.shape = SHAPE_GENERIC
+- self.sub_fields = [self._create_sub_type(t, f'{self.name}_{i}') for i, t in enumerate(self.type_.__args__)]
++ self.sub_fields = [self._create_sub_type(t, f'{self.name}_{i}') for i, t in enumerate(get_args(self.type_))]
+ self.type_ = origin
+ return
+ else:
+diff --git a/pydantic/generics.py b/pydantic/generics.py
+index 64562227d..0a5e75401 100644
+--- a/pydantic/generics.py
++++ b/pydantic/generics.py
+@@ -3,6 +3,7 @@
+ from .class_validators import gather_all_validators
+ from .fields import FieldInfo, ModelField
+ from .main import BaseModel, create_model
++from .typing import get_origin
+ from .utils import lenient_issubclass
+
+ _generic_types_cache: Dict[Tuple[Type[Any], Union[Any, Tuple[Any, ...]]], Type[BaseModel]] = {}
+@@ -37,7 +38,7 @@ def __class_getitem__(cls: Type[GenericModelT], params: Union[Type[Any], Tuple[T
+ check_parameters_count(cls, params)
+ typevars_map: Dict[TypeVarType, Type[Any]] = dict(zip(cls.__parameters__, params))
+ type_hints = get_type_hints(cls).items()
+- instance_type_hints = {k: v for k, v in type_hints if getattr(v, '__origin__', None) is not ClassVar}
++ instance_type_hints = {k: v for k, v in type_hints if get_origin(v) is not ClassVar}
+ concrete_type_hints: Dict[str, Type[Any]] = {
+ k: resolve_type_hint(v, typevars_map) for k, v in instance_type_hints.items()
+ }
+@@ -79,7 +80,7 @@ def __concrete_name__(cls: Type[Any], params: Tuple[Type[Any], ...]) -> str:
+
+
+ def resolve_type_hint(type_: Any, typevars_map: Dict[Any, Any]) -> Type[Any]:
+- if hasattr(type_, '__origin__') and getattr(type_, '__parameters__', None):
++ if get_origin(type_) and getattr(type_, '__parameters__', None):
+ concrete_type_args = tuple([typevars_map[x] for x in type_.__parameters__])
+ return type_[concrete_type_args]
+ return typevars_map.get(type_, type_)
+diff --git a/pydantic/main.py b/pydantic/main.py
+index c872f1e3b..87299b645 100644
+--- a/pydantic/main.py
++++ b/pydantic/main.py
+@@ -33,7 +33,7 @@
+ from .parse import Protocol, load_file, load_str_bytes
+ from .schema import model_schema
+ from .types import PyObject, StrBytes
+-from .typing import AnyCallable, ForwardRef, is_classvar, resolve_annotations, update_field_forward_refs
++from .typing import AnyCallable, ForwardRef, get_origin, is_classvar, resolve_annotations, update_field_forward_refs
+ from .utils import (
+ ClassAttribute,
+ GetterDict,
+@@ -256,7 +256,7 @@ def __new__(mcs, name, bases, namespace, **kwargs): # noqa C901
+ if (
+ isinstance(value, untouched_types)
+ and ann_type != PyObject
+- and not lenient_issubclass(getattr(ann_type, '__origin__', None), Type)
++ and not lenient_issubclass(get_origin(ann_type), Type)
+ ):
+ continue
+ fields[ann_name] = inferred = ModelField.infer(
+diff --git a/pydantic/schema.py b/pydantic/schema.py
+index 27c66b2bd..4f6258ab1 100644
+--- a/pydantic/schema.py
++++ b/pydantic/schema.py
+@@ -55,7 +55,7 @@
+ conset,
+ constr,
+ )
+-from .typing import ForwardRef, Literal, is_callable_type, is_literal_type, literal_values
++from .typing import ForwardRef, Literal, get_args, get_origin, is_callable_type, is_literal_type, literal_values
+ from .utils import get_model, lenient_issubclass, sequence_like
+
+ if TYPE_CHECKING:
+@@ -803,9 +803,9 @@ def go(type_: Any) -> Type[Any]:
+ or lenient_issubclass(type_, (ConstrainedList, ConstrainedSet))
+ ):
+ return type_
+- origin = getattr(type_, '__origin__', None)
++ origin = get_origin(type_)
+ if origin is not None:
+- args: Tuple[Any, ...] = type_.__args__
++ args: Tuple[Any, ...] = get_args(type_)
+ if any(isinstance(a, ForwardRef) for a in args):
+ # forward refs cause infinite recursion below
+ return type_
+diff --git a/pydantic/typing.py b/pydantic/typing.py
+index 070691eeb..729ebd71b 100644
+--- a/pydantic/typing.py
++++ b/pydantic/typing.py
+@@ -44,12 +44,19 @@ def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
+ return type_._eval_type(globalns, localns)
+
+
+-else:
++elif sys.version_info < (3, 9):
+
+ def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
+ return type_._evaluate(globalns, localns)
+
+
++else:
++
++ # TODO: remove the pragma: no cover once we can run CI on python 3.9
++ def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any: # pragma: no cover
++ return type_._evaluate(globalns, localns, set())
++
++
+ if sys.version_info < (3, 7):
+ from typing import Callable as Callable
+
+@@ -70,8 +77,50 @@ def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
+ from typing_extensions import Literal
+ except ImportError:
+ Literal = None
++
++ def get_args(t: Type[Any]) -> Tuple[Any, ...]:
++ return getattr(t, '__args__', ())
++
++ def get_origin(t: Type[Any]) -> Optional[Type[Any]]:
++ return getattr(t, '__origin__', None)
++
++
+ else:
+- from typing import Literal
++ from typing import Literal, get_args as typing_get_args, get_origin as typing_get_origin
++
++ def get_origin(tp: Type[Any]) -> Type[Any]:
++ return typing_get_origin(tp) or getattr(tp, '__origin__', None)
++
++ def generic_get_args(tp: Type[Any]) -> Tuple[Any, ...]:
++ """
++ In python 3.9, `typing.Dict`, `typing.List`, ...
++ do have an empty `__args__` by default (instead of the generic ~T for example).
++ In order to still support `Dict` for example and consider it as `Dict[Any, Any]`,
++ we retrieve the `_nparams` value that tells us how many parameters it needs.
++ """
++ # TODO: remove the pragma: no cover once we can run CI on python 3.9
++ if hasattr(tp, '_nparams'): # pragma: no cover
++ return (Any,) * tp._nparams
++ return ()
++
++ def get_args(tp: Type[Any]) -> Tuple[Any, ...]:
++ """Get type arguments with all substitutions performed.
++
++ For unions, basic simplifications used by Union constructor are performed.
++ Examples::
++ get_args(Dict[str, int]) == (str, int)
++ get_args(int) == ()
++ get_args(Union[int, Union[T, int], str][int]) == (int, str)
++ get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
++ get_args(Callable[[], T][int]) == ([], int)
++ """
++ try:
++ args = typing_get_args(tp)
++ # TODO: remove the pragma: no cover once we can run CI on python 3.9
++ except IndexError: # pragma: no cover
++ args = ()
++ return args or getattr(tp, '__args__', ()) or generic_get_args(tp)
++
+
+ if TYPE_CHECKING:
+ from .fields import ModelField
+@@ -115,6 +164,8 @@ def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any:
+ 'CallableGenerator',
+ 'ReprArgs',
+ 'CallableGenerator',
++ 'get_args',
++ 'get_origin',
+ )
+
+
+@@ -167,16 +218,16 @@ def resolve_annotations(raw_annotations: Dict[str, Type[Any]], module_name: Opti
+
+
+ def is_callable_type(type_: Type[Any]) -> bool:
+- return type_ is Callable or getattr(type_, '__origin__', None) is Callable
++ return type_ is Callable or get_origin(type_) is Callable
+
+
+ if sys.version_info >= (3, 7):
+
+ def is_literal_type(type_: Type[Any]) -> bool:
+- return Literal is not None and getattr(type_, '__origin__', None) is Literal
++ return Literal is not None and get_origin(type_) is Literal
+
+ def literal_values(type_: Type[Any]) -> Tuple[Any, ...]:
+- return type_.__args__
++ return get_args(type_)
+
+
+ else:
+@@ -217,12 +268,15 @@ def new_type_supertype(type_: Type[Any]) -> Type[Any]:
+ return type_
+
+
+-def _check_classvar(v: Type[Any]) -> bool:
++def _check_classvar(v: Optional[Type[Any]]) -> bool:
++ if v is None:
++ return False
++
+ return v.__class__ == ClassVar.__class__ and (sys.version_info < (3, 7) or getattr(v, '_name', None) == 'ClassVar')
+
+
+ def is_classvar(ann_type: Type[Any]) -> bool:
+- return _check_classvar(ann_type) or _check_classvar(getattr(ann_type, '__origin__', None))
++ return _check_classvar(ann_type) or _check_classvar(get_origin(ann_type))
+
+
+ def update_field_forward_refs(field: 'ModelField', globalns: Any, localns: Any) -> None:
+@@ -243,13 +297,13 @@ def get_class(type_: Type[Any]) -> Union[None, bool, Type[Any]]:
+ without brackets. Otherwise returns None.
+ """
+ try:
+- origin = getattr(type_, '__origin__')
++ origin = get_origin(type_)
+ if origin is None: # Python 3.6
+ origin = type_
+ if issubclass(origin, Type): # type: ignore
+- if type_.__args__ is None or not isinstance(type_.__args__[0], type):
++ if not get_args(type_) or not isinstance(get_args(type_)[0], type):
+ return True
+- return type_.__args__[0]
+- except AttributeError:
++ return get_args(type_)[0]
++ except (AttributeError, TypeError):
+ pass
+ return None
diff --git a/dev-python/pydantic/metadata.xml b/dev-python/pydantic/metadata.xml
new file mode 100644
index 000000000000..f3c0494f5fb1
--- /dev/null
+++ b/dev-python/pydantic/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="project">
+ <email>python@gentoo.org</email>
+ <name>Python</name>
+ </maintainer>
+ <upstream>
+ <remote-id type="pypi">pydantic</remote-id>
+ <remote-id type="github">samuelcolvin/pydantic</remote-id>
+ <bugs-to>https://github.com/samuelcolvin/pydantic/issues</bugs-to>
+ <doc>https://pydantic-docs.helpmanual.io/</doc>
+ </upstream>
+ <origin>gentoo-staging</origin>
+</pkgmetadata>
diff --git a/dev-python/pydantic/pydantic-1.6.1.ebuild b/dev-python/pydantic/pydantic-1.6.1.ebuild
new file mode 100644
index 000000000000..1f636ea6688f
--- /dev/null
+++ b/dev-python/pydantic/pydantic-1.6.1.ebuild
@@ -0,0 +1,38 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+# At the moment, PyPy3 doesn't have a dataclasses module
+# It can probably be added when PyPy3.7 is stable
+PYTHON_COMPAT=( python3_{5,6,7,8,9} )
+
+inherit distutils-r1
+
+DESCRIPTION="Data parsing and validation using Python type hints"
+HOMEPAGE="https://github.com/samuelcolvin/pydantic"
+# No tests on PyPI: https://github.com/samuelcolvin/pydantic/pull/1976
+SRC_URI="https://github.com/samuelcolvin/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+
+BDEPEND="
+ dev-python/cython[${PYTHON_USEDEP}]
+"
+
+PATCHES=(
+ # https://github.com/samuelcolvin/pydantic/pull/1977
+ "${FILESDIR}/${P}-fix-tests.patch"
+ # https://github.com/samuelcolvin/pydantic/pull/1844
+ "${FILESDIR}/${P}-py39.patch"
+)
+
+distutils_enable_tests pytest
+
+python_prepare_all() {
+ # So we don't need pytest-timeout
+ sed -i '/^timeout = /d' setup.cfg || die
+ distutils-r1_python_prepare_all
+}
diff --git a/dev-python/sqlparse/Manifest b/dev-python/sqlparse/Manifest
index e682baca7cb0..b3753b7ac39c 100644
--- a/dev-python/sqlparse/Manifest
+++ b/dev-python/sqlparse/Manifest
@@ -1,2 +1,3 @@
DIST sqlparse-0.3.1.tar.gz 67572 BLAKE2B 27c9267de1a269a4574019d457a3dad53ad805e56a57ba73e294c229a7852b7ca04557fb45d07566e94eba7593257ad7eb413b1e0ec04d1044838d5039dc8ba8 SHA512 4c56a528b43578a7a48fc31cee369215b15761d9903ea1d8e034c69f0eb6431dd15362aab13af25a36fccb361436f1cba746bcbb515cbab5d30319629dd2ddfb
DIST sqlparse-0.4.0.tar.gz 67191 BLAKE2B 748a30102b104ecd951d2e39b626e7351a7d141c756b3ae47451ccbbcef16f32201592aeee5bbf7a82a601e02f2faae8a569134b37b0660e54149e9ba56e096f SHA512 3314fe6ee7694a01c7ab00469ca6de90d3e954c5da39d2d8e2e085608b0b1ff304757378aa473d0687a16d064d952d0cd987237340e2f169604533d6757a61f3
+DIST sqlparse-0.4.1.tar.gz 67228 BLAKE2B 677b592af263e94e1f6d36242f4bf75d28d0466636c0c578b83f472acf05c357b6899150ce01b594db89f2844c1b85220429857583c79e6dbba34a75bdf54e47 SHA512 49f02a63ef490c2e900cea6a0882891cd1381e0f398c4e38688444300b0f0e961c91c4f1a2355704bba7f170083594bd9e26c2a6cac934da9d87ab291accd27c
diff --git a/dev-python/sqlparse/sqlparse-0.4.1.ebuild b/dev-python/sqlparse/sqlparse-0.4.1.ebuild
new file mode 100644
index 000000000000..d3c96ffa5c3b
--- /dev/null
+++ b/dev-python/sqlparse/sqlparse-0.4.1.ebuild
@@ -0,0 +1,22 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DISTUTILS_USE_SETUPTOOLS=rdepend
+PYTHON_COMPAT=( python3_{5,6,7,8,9} )
+inherit distutils-r1
+
+MY_PN="${PN##python-}"
+MY_P="${MY_PN}-${PV}"
+DESCRIPTION="A non-validating SQL parser module for Python"
+HOMEPAGE="https://github.com/andialbrecht/sqlparse"
+SRC_URI="mirror://pypi/${MY_PN:0:1}/${MY_PN}/${MY_P}.tar.gz"
+S="${WORKDIR}"/${P#python-}
+
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~ppc ~ppc64 ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux"
+LICENSE="BSD-2"
+
+distutils_enable_sphinx docs/source
+distutils_enable_tests pytest
diff --git a/dev-python/tqdm/Manifest b/dev-python/tqdm/Manifest
index 419c55bfbd1b..a57a57d25267 100644
--- a/dev-python/tqdm/Manifest
+++ b/dev-python/tqdm/Manifest
@@ -1,3 +1,4 @@
DIST tqdm-4.48.2.tar.gz 148978 BLAKE2B 2423a3d23b86ec6b535a2157d0fbaea6921f95873fb2507a08ff57de0fdcf8fcbfb030210393f5410437ee9977da3ad2011f07a866b3f91a057e338082325976 SHA512 849e4dad4bd0819b328e906af8a8f7acf2ebfd559c9ae3ebf822bc64c1b1a5c96e44b9b69d3dedf6387c44cf9eed559f1377ea29f71fadfc8f056c52685425e9
DIST tqdm-4.49.0.tar.gz 151935 BLAKE2B 790e2912a402795af9aba2e4db80cf41a7cb08267dad5946d89b4d9fb8b8c7a1dd65f33dcaf315bbe82862c0c2934b2dd2b8cee894c592d5a61ac61dd8c5126f SHA512 44197eb09b90551eb66c8b2e0dc97f6864fc91654465e7d478ece6ecd610242d8e378c6814f9d3e1cf05b2db1aa533743535051ad456ec5ef6d477be906ee217
DIST tqdm-4.50.1.tar.gz 153435 BLAKE2B 5dda14bc4007e2820dc1899d352dccfd72988ce0ec84b556404d4a92f13cf51f340b7e745c39d01076485adcc6331eaf86e49c37d441ab667e4ee9e07019b238 SHA512 4db3ab73ca387961e0522fb5521bbad0420f1cf99a38a5192f048e08a30aeddd20d39ca2d7cd24dbd29e2342018fe65d55a2d0b275d188bf41f7592b8b77cd32
+DIST tqdm-4.50.2.tar.gz 153853 BLAKE2B 12eccead810b8434ac1c7787b34ee54e78f6f2fa566e7ad10bbb428bb48af723e75126955e6af5262062d9a98621b5e70ca08925a2024c09488579c128ff5d00 SHA512 2d13473d3f7e85de1c62cc753bca2c2971acbfb8c1a0f99cebf248e9e384b5875ae655c41438abb9861d6c90051eec0d1a23af849f157359fa88c730718ecd33
diff --git a/dev-python/tqdm/tqdm-4.50.2.ebuild b/dev-python/tqdm/tqdm-4.50.2.ebuild
new file mode 100644
index 000000000000..9b6164953dcf
--- /dev/null
+++ b/dev-python/tqdm/tqdm-4.50.2.ebuild
@@ -0,0 +1,58 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DISTUTILS_USE_SETUPTOOLS=rdepend
+PYTHON_COMPAT=( python3_{5,6,7,8,9} pypy3 )
+
+inherit distutils-r1
+
+if [[ ${PV} == 9999 ]]; then
+ inherit git-r3
+ EGIT_REPO_URI="https://github.com/tqdm/tqdm"
+else
+ SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+ KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+fi
+
+DESCRIPTION="Add a progress meter to your loops in a second"
+HOMEPAGE="https://github.com/tqdm/tqdm"
+
+LICENSE="MIT"
+SLOT="0"
+IUSE="examples"
+
+distutils_enable_tests nose
+
+python_prepare_all() {
+ sed -r \
+ -e "s:'nose'(,[[:space:]]*|)::" \
+ -e "s:'flake8'(,[[:space:]]*|)::" \
+ -e "s:'coverage'(,[[:space:]]*|)::" \
+ -i setup.py
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ # tests_main.py requires the package to be installed
+ distutils_install_for_testing
+ # Skip unpredictable performance tests
+ nosetests tqdm -v --ignore 'tests_perf.py' \
+ || die "tests failed with ${EPYTHON}"
+}
+
+python_install() {
+ doman "${BUILD_DIR}"/lib/tqdm/tqdm.1
+ rm "${BUILD_DIR}"/lib/tqdm/tqdm.1 || die
+ distutils-r1_python_install --skip-build
+}
+
+python_install_all() {
+ if use examples; then
+ dodoc -r examples
+ docompress -x /usr/share/doc/${PF}/examples
+ fi
+ distutils-r1_python_install_all
+}