feedparser, jsonpickle, sgmllib3k, toml, ujson: upgraded packages to upstream

Upgraded dev-python/jsonpickle to version 1.4.1-r1 on amd64
Upgraded dev-python/feedparser to version 6.0.0_beta1 on amd64
Upgraded dev-python/sgmllib3k to version 1.0.0 on amd64
Upgraded dev-python/ujson to version 3.0.0 on amd64
Upgraded dev-python/toml to version 0.10.1 on amd64

BUG=chromium:1103853
TEST=CQ passes

Change-Id: I913a6c947075d72848793a56c03aff3b980def78
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/overlays/portage-stable/+/2330255
Commit-Queue: Alex Klein <saklein@chromium.org>
Tested-by: Allen Webb <allenwebb@google.com>
Auto-Submit: Allen Webb <allenwebb@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/dev-python/feedparser/Manifest b/dev-python/feedparser/Manifest
new file mode 100644
index 0000000..16c4d86
--- /dev/null
+++ b/dev-python/feedparser/Manifest
@@ -0,0 +1 @@
+DIST feedparser-6.0.0b1.tar.gz 250065 BLAKE2B 54e955f011af0755e0f627caa1491be15a073984d5c7c2b4edd6e9dcd6054e19b5c77cea9741d0bf7af151f9c79b22739c12db94619373f195e024df65b1cff1 SHA512 580e02bd77dcba547eb8295f958c6d30e55c62bd7fdbe25eda7687d0654b9342edf82ab637902175fc90b86a8ae9cbae8ba2c7c9a83009d25ab5c007c37cf02d
diff --git a/dev-python/feedparser/feedparser-6.0.0_beta1.ebuild b/dev-python/feedparser/feedparser-6.0.0_beta1.ebuild
new file mode 100644
index 0000000..8cc3f76
--- /dev/null
+++ b/dev-python/feedparser/feedparser-6.0.0_beta1.ebuild
@@ -0,0 +1,41 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} pypy3 )
+
+inherit distutils-r1
+
+MY_PV=${PV/_beta/b}
+MY_P=${PN}-${MY_PV}
+DESCRIPTION="Parse RSS and Atom feeds in Python"
+HOMEPAGE="https://github.com/kurtmckee/feedparser https://pypi.org/project/feedparser/"
+SRC_URI="
+	https://github.com/kurtmckee/feedparser/archive/${MY_PV}.tar.gz
+		-> ${MY_P}.tar.gz"
+S=${WORKDIR}/${MY_P}
+
+LICENSE="BSD-2"
+SLOT="0"
+KEYWORDS="*"
+
+RDEPEND="dev-python/sgmllib3k[${PYTHON_USEDEP}]"
+
+distutils_enable_tests unittest
+
+PATCHES=(
+	"${FILESDIR}"/${P}-py39.patch
+)
+
+src_prepare() {
+	# broken
+	rm \
+		tests/illformed/chardet/big5.xml \
+		tests/illformed/undeclared_namespace.xml || die
+	distutils-r1_src_prepare
+}
+
+python_test() {
+	"${EPYTHON}" tests/runtests.py || die
+}
diff --git a/dev-python/feedparser/files/feedparser-5.2.1-sgmllib.patch b/dev-python/feedparser/files/feedparser-5.2.1-sgmllib.patch
new file mode 100644
index 0000000..7144805
--- /dev/null
+++ b/dev-python/feedparser/files/feedparser-5.2.1-sgmllib.patch
@@ -0,0 +1,78 @@
+From 812793c07d3202d3f5bc39091aec2e7071d000c8 Mon Sep 17 00:00:00 2001
+From: Sebastian Pipping <sebastian@pipping.org>
+Date: Sun, 1 Jan 2012 19:30:57 +0100
+Subject: [PATCH] Use shipped sgmllib for Python 3.x
+
+---
+ feedparser/feedparser.py |   19 +++----------------
+ setup.py                 |    2 +-
+ 2 files changed, 4 insertions(+), 17 deletions(-)
+
+diff --git a/feedparser/feedparser.py b/feedparser/feedparser.py
+index 8275c29..9a8a053 100644
+--- a/feedparser/feedparser.py
++++ b/feedparser/feedparser.py
+@@ -204,17 +204,9 @@ else:
+ try:
+     import sgmllib
+ except ImportError:
+-    # This is probably Python 3, which doesn't include sgmllib anymore
+-    _SGML_AVAILABLE = 0
++    import _feedparser_sgmllib as sgmllib
+ 
+-    # Mock sgmllib enough to allow subclassing later on
+-    class sgmllib(object):
+-        class SGMLParser(object):
+-            def goahead(self, i):
+-                pass
+-            def parse_starttag(self, i):
+-                pass
+-else:
++if True:
+     _SGML_AVAILABLE = 1
+ 
+     # sgmllib defines a number of module-level regular expressions that are
+@@ -2520,9 +2512,6 @@ class _RelativeURIResolver(_BaseHTMLProcessor):
+         _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
+ 
+ def _resolveRelativeURIs(htmlSource, baseURI, encoding, _type):
+-    if not _SGML_AVAILABLE:
+-        return htmlSource
+-
+     p = _RelativeURIResolver(baseURI, encoding, _type)
+     p.feed(htmlSource)
+     return p.output()
+@@ -2803,8 +2792,6 @@ class _HTMLSanitizer(_BaseHTMLProcessor):
+ 
+ 
+ def _sanitizeHTML(htmlSource, encoding, _type):
+-    if not _SGML_AVAILABLE:
+-        return htmlSource
+     p = _HTMLSanitizer(encoding, _type)
+     htmlSource = htmlSource.replace('<![CDATA[', '&lt;![CDATA[')
+     p.feed(htmlSource)
+@@ -3890,7 +3877,7 @@ def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, refer
+             result['bozo'] = 1
+             result['bozo_exception'] = feedparser.exc or e
+             use_strict_parser = 0
+-    if not use_strict_parser and _SGML_AVAILABLE:
++    if not use_strict_parser:
+         feedparser = _LooseFeedParser(baseuri, baselang, 'utf-8', entities)
+         feedparser.feed(data.decode('utf-8', 'replace'))
+     result['feed'] = feedparser.feeddata
+diff --git a/setup.py b/setup.py
+index a4a60fe..8c15451 100644
+--- a/setup.py
++++ b/setup.py
+@@ -16,7 +16,7 @@ setup(
+     download_url = 'https://pypi.python.org/pypi/feedparser',
+     platforms = ['POSIX', 'Windows'],
+     package_dir = {'': 'feedparser'},
+-    py_modules = ['feedparser'],
++    py_modules = ['feedparser', '_feedparser_sgmllib'],
+     keywords = ['atom', 'cdf', 'feed', 'parser', 'rdf', 'rss'],
+     classifiers = [
+         'Development Status :: 5 - Production/Stable',
+-- 
+1.7.8.1
+
diff --git a/dev-python/feedparser/files/feedparser-6.0.0_beta1-py39.patch b/dev-python/feedparser/files/feedparser-6.0.0_beta1-py39.patch
new file mode 100644
index 0000000..f9315e4
--- /dev/null
+++ b/dev-python/feedparser/files/feedparser-6.0.0_beta1-py39.patch
@@ -0,0 +1,89 @@
+From fa587d171aed1b44ee06af271d718ab6fa73b77a Mon Sep 17 00:00:00 2001
+From: Karthikeyan Singaravelan <tir.karthi@gmail.com>
+Date: Wed, 26 Feb 2020 22:06:39 +0530
+Subject: [PATCH 1/2] Use encodebytes instead of encodestring in Python 3.9.
+
+---
+ feedparser/http.py  | 5 ++++-
+ feedparser/mixin.py | 5 ++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/feedparser/http.py b/feedparser/http.py
+index 272faad6..53511f02 100644
+--- a/feedparser/http.py
++++ b/feedparser/http.py
+@@ -73,7 +73,10 @@ class request(object):
+ 
+ # Python 3.1 deprecated decodestring in favor of decodebytes.
+ # This can be removed after Python 2.7 support is dropped.
+-_base64decode = getattr(base64, 'decodebytes', base64.decodestring)
++try:
++    _base64decode = base64.decodebytes
++except AttributeError:
++    _base64decode = base64.decodestring
+ 
+ try:
+     basestring
+diff --git a/feedparser/mixin.py b/feedparser/mixin.py
+index 1b0dc1ae..549931f5 100644
+--- a/feedparser/mixin.py
++++ b/feedparser/mixin.py
+@@ -50,7 +50,10 @@
+ 
+ # Python 2.7 only offers "decodestring()".
+ # This name substitution can be removed when Python 2.7 support is dropped.
+-_base64decode = getattr(base64, 'decodebytes', base64.decodestring)
++try:
++    _base64decode = base64.decodebytes
++except AttributeError:
++    _base64decode = base64.decodestring
+ 
+ 
+ bytes_ = type(b'')
+
+From 7798957b66c9cee00db9a18f84c518cacf8f14aa Mon Sep 17 00:00:00 2001
+From: Karthikeyan Singaravelan <tir.karthi@gmail.com>
+Date: Sun, 17 May 2020 14:25:17 +0000
+Subject: [PATCH 2/2] Use base64.decodebytes only in Python 3
+
+---
+ feedparser/http.py  | 7 +------
+ feedparser/mixin.py | 7 +------
+ 2 files changed, 2 insertions(+), 12 deletions(-)
+
+diff --git a/feedparser/http.py b/feedparser/http.py
+index 53511f02..1119cb3b 100644
+--- a/feedparser/http.py
++++ b/feedparser/http.py
+@@ -71,12 +71,7 @@ class request(object):
+ from .datetimes import _parse_date
+ from .urls import convert_to_idn
+ 
+-# Python 3.1 deprecated decodestring in favor of decodebytes.
+-# This can be removed after Python 2.7 support is dropped.
+-try:
+-    _base64decode = base64.decodebytes
+-except AttributeError:
+-    _base64decode = base64.decodestring
++_base64decode = base64.decodebytes
+ 
+ try:
+     basestring
+diff --git a/feedparser/mixin.py b/feedparser/mixin.py
+index 549931f5..119fa4ca 100644
+--- a/feedparser/mixin.py
++++ b/feedparser/mixin.py
+@@ -48,12 +48,7 @@
+ from .urls import _urljoin, make_safe_absolute_uri, resolve_relative_uris
+ 
+ 
+-# Python 2.7 only offers "decodestring()".
+-# This name substitution can be removed when Python 2.7 support is dropped.
+-try:
+-    _base64decode = base64.decodebytes
+-except AttributeError:
+-    _base64decode = base64.decodestring
++_base64decode = base64.decodebytes
+ 
+ 
+ bytes_ = type(b'')
diff --git a/dev-python/feedparser/metadata.xml b/dev-python/feedparser/metadata.xml
new file mode 100644
index 0000000..723c95f
--- /dev/null
+++ b/dev-python/feedparser/metadata.xml
@@ -0,0 +1,13 @@
+<?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="google-code">feedparser</remote-id>
+    <remote-id type="github">kurtmckee/feedparser</remote-id>
+    <remote-id type="pypi">feedparser</remote-id>
+  </upstream>
+</pkgmetadata>
diff --git a/dev-python/jsonpickle/Manifest b/dev-python/jsonpickle/Manifest
new file mode 100644
index 0000000..eb7c9ea
--- /dev/null
+++ b/dev-python/jsonpickle/Manifest
@@ -0,0 +1 @@
+DIST jsonpickle-1.4.1.tar.gz 104564 BLAKE2B a3ad6f9c712f39153186b6ccdef515581012ad4ba1251dcb094074f2093eb4b158b9357bdf2e8668073cb21dc3bf6dd2fc3a0058c8597252c558a797432068b9 SHA512 ed6bf3472c59ba907a973c5c6f05de13dbfc75eef103796b8f8a63d388f769527f22667ca8761092d1649ff2caf5a73de0593e370df3e7fcabe06e73b265da35
diff --git a/dev-python/jsonpickle/jsonpickle-1.4.1-r1.ebuild b/dev-python/jsonpickle/jsonpickle-1.4.1-r1.ebuild
new file mode 100644
index 0000000..380af23
--- /dev/null
+++ b/dev-python/jsonpickle/jsonpickle-1.4.1-r1.ebuild
@@ -0,0 +1,47 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} )
+DISTUTILS_USE_SETUPTOOLS=rdepend
+inherit distutils-r1
+
+DESCRIPTION="Python library for serializing any arbitrary object graph into JSON"
+HOMEPAGE="https://github.com/jsonpickle/jsonpickle/ https://pypi.org/project/jsonpickle/"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="doc test"
+RESTRICT="!test? ( test )"
+
+# There are optional json backends serializer/deserializers in addition to those selected here
+# jsonlib, yajl.
+RDEPEND="
+	dev-python/simplejson[${PYTHON_USEDEP}]
+	dev-python/feedparser[${PYTHON_USEDEP}]
+	dev-python/ujson[${PYTHON_USEDEP}]
+"
+# toml via setuptools_scm[toml]
+BDEPEND="
+	dev-python/setuptools_scm[${PYTHON_USEDEP}]
+	dev-python/toml[${PYTHON_USEDEP}]"
+
+distutils_enable_sphinx "docs/source"
+distutils_enable_tests pytest
+
+python_prepare_all() {
+	# too many dependencies
+	rm tests/pandas_test.py || die
+	sed -e '/pandas/ d' -i tests/runtests.py || die
+
+	sed -i -e 's:--flake8 --black --cov --cov-append::' pytest.ini || die
+
+	distutils-r1_python_prepare_all
+}
+
+python_test() {
+	pytest -vv tests || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/jsonpickle/metadata.xml b/dev-python/jsonpickle/metadata.xml
new file mode 100644
index 0000000..6ee6ba0
--- /dev/null
+++ b/dev-python/jsonpickle/metadata.xml
@@ -0,0 +1,12 @@
+<?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">jsonpickle</remote-id>
+    <remote-id type="github">jsonpickle/jsonpickle</remote-id>
+  </upstream>
+</pkgmetadata>
diff --git a/dev-python/sgmllib3k/Manifest b/dev-python/sgmllib3k/Manifest
new file mode 100644
index 0000000..5f5d490
--- /dev/null
+++ b/dev-python/sgmllib3k/Manifest
@@ -0,0 +1 @@
+DIST sgmllib3k-1.0.0.tar.gz 5750 BLAKE2B 188ac3c55245ff431e1ad7981f706f1a8fce3e9f3aaf844252c02da1189e5b9c7d29b76d803cbbcfc157fbb1ec7f36245186693472b95ed1634a2989185308ae SHA512 f9238afb831356f66b1c3e55975e0ea88007ffe1469b8b4e325e704d1915eb0ab120f5f9e98f36eeb4bf6204a1938d8a4d5a424f0cc054b141ac94adc8ef8ca9
diff --git a/dev-python/sgmllib3k/metadata.xml b/dev-python/sgmllib3k/metadata.xml
new file mode 100644
index 0000000..266e3f1
--- /dev/null
+++ b/dev-python/sgmllib3k/metadata.xml
@@ -0,0 +1,7 @@
+<?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>
+	</maintainer>
+</pkgmetadata>
diff --git a/dev-python/sgmllib3k/sgmllib3k-1.0.0.ebuild b/dev-python/sgmllib3k/sgmllib3k-1.0.0.ebuild
new file mode 100644
index 0000000..3af55f7
--- /dev/null
+++ b/dev-python/sgmllib3k/sgmllib3k-1.0.0.ebuild
@@ -0,0 +1,15 @@
+# Copyright 2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6..8} pypy3 )
+inherit distutils-r1
+
+DESCRIPTION="Py3k port of sgmllib"
+HOMEPAGE="https://pypi.org/project/sgmllib3k/"
+SRC_URI="mirror://pypi/${PN::1}/${PN}/${P}.tar.gz"
+
+LICENSE="PSF-2"
+SLOT="0"
+KEYWORDS="*"
diff --git a/dev-python/toml/Manifest b/dev-python/toml/Manifest
new file mode 100644
index 0000000..1b62b1b
--- /dev/null
+++ b/dev-python/toml/Manifest
@@ -0,0 +1,2 @@
+DIST toml-0.10.1-1.tar.gz 22559 BLAKE2B 17d9d9c78f2b78a6fc5bc0efd8530af5514d2f965eb1896a0eaca9a6d8ce1dda3a5dc825a8b6cd2a2096a582bd35952e6f0a3372021c739c69186d5a2c5642be SHA512 0a2348bffc889e63f4c6f8ae4faf022cceff069b178d086a37ff03e97e0f24b4b5a72810a345692f21810f3f41908b6981da902862adb06286bdb2941e9e0d60
+DIST toml-test-280497fa5f12e43d7233aed0d74e07ca61ef176b.tar.gz 19593 BLAKE2B e9deba7c5d1eea7bd87fcf5e5c74bda4c2b9e9686e597e3ad51516f60eb8d192fb01d052ac57729c6f0851e2715cc6409a904affd637c9b099cabc1b12ad5d52 SHA512 7bd69b8c14f09bf431094b52d988eb233922527719ba5047ff769d2e709c2039fb6fb1c8144e630ad2a58835d19e0e4cc51433a427596d37f8eccb6d73d7e5c0
diff --git a/dev-python/toml/files/toml-0.10.1-skip-numpy.patch b/dev-python/toml/files/toml-0.10.1-skip-numpy.patch
new file mode 100644
index 0000000..5c6808d
--- /dev/null
+++ b/dev-python/toml/files/toml-0.10.1-skip-numpy.patch
@@ -0,0 +1,37 @@
+From 93901215b45db2ab9d50987ac109c29acbe34600 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
+Date: Mon, 25 May 2020 16:38:17 +0200
+Subject: [PATCH] Skip numpy tests when numpy is not available
+
+Make it possible to successfully run tests without numpy installed.
+This package is becoming quite hard profile, and being able to test it
+without building numpy first would be a nice feature.
+---
+ tests/test_api.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/test_api.py b/tests/test_api.py
+index dd12eb3..67bcd88 100644
+--- a/tests/test_api.py
++++ b/tests/test_api.py
+@@ -103,7 +103,7 @@ def test_array_sep():
+ 
+ 
+ def test_numpy_floats():
+-    import numpy as np
++    np = pytest.importorskip('numpy')
+ 
+     encoder = toml.TomlNumpyEncoder()
+     d = {'a': np.array([1, .3], dtype=np.float64)}
+@@ -120,7 +120,7 @@ def test_numpy_floats():
+ 
+ 
+ def test_numpy_ints():
+-    import numpy as np
++    np = pytest.importorskip('numpy')
+ 
+     encoder = toml.TomlNumpyEncoder()
+     d = {'a': np.array([1, 3], dtype=np.int64)}
+-- 
+2.26.2
+
diff --git a/dev-python/toml/metadata.xml b/dev-python/toml/metadata.xml
new file mode 100644
index 0000000..85b206a
--- /dev/null
+++ b/dev-python/toml/metadata.xml
@@ -0,0 +1,12 @@
+<?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>
+  <stabilize-allarches/>
+  <upstream>
+    <remote-id type="github">uiri/toml</remote-id>
+  </upstream>
+</pkgmetadata>
diff --git a/dev-python/toml/toml-0.10.1.ebuild b/dev-python/toml/toml-0.10.1.ebuild
new file mode 100644
index 0000000..0de359e
--- /dev/null
+++ b/dev-python/toml/toml-0.10.1.ebuild
@@ -0,0 +1,42 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python{2_7,3_{6,7,8}} pypy3 )
+
+inherit distutils-r1
+
+TOML_TEST_VER="280497fa5f12e43d7233aed0d74e07ca61ef176b"
+
+DESCRIPTION="Python library for handling TOML files"
+HOMEPAGE="https://github.com/uiri/toml"
+SRC_URI="https://github.com/uiri/${PN}/archive/${PV}.tar.gz -> ${P}-1.tar.gz
+	test? ( https://github.com/BurntSushi/toml-test/archive/${TOML_TEST_VER}.tar.gz -> toml-test-${TOML_TEST_VER}.tar.gz )"
+IUSE="test"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+
+BDEPEND="dev-python/setuptools[${PYTHON_USEDEP}]
+	test? (
+		$(python_gen_cond_dep '
+			dev-python/numpy[${PYTHON_USEDEP}]
+		' python3_{6,7,8})
+	)"
+
+DOCS=( README.rst )
+PATCHES=(
+	"${FILESDIR}"/toml-0.10.1-skip-numpy.patch
+)
+
+distutils_enable_tests pytest
+
+python_prepare_all() {
+	if use test; then
+		mv "${WORKDIR}/toml-test-${TOML_TEST_VER#v}" "${S}/toml-test" || die
+	fi
+
+	distutils-r1_python_prepare_all
+}
diff --git a/dev-python/ujson/Manifest b/dev-python/ujson/Manifest
new file mode 100644
index 0000000..ab20c90
--- /dev/null
+++ b/dev-python/ujson/Manifest
@@ -0,0 +1 @@
+DIST ujson-3.0.0.tar.gz 7128523 BLAKE2B b19525edf1528e3b2a43cb08ecbf7b5d070f2455fb0bbffbe4b866bbaca91df09d7f4d46509dfb92d825095d4b922fc866fa36e051fa0e27af60fe558c69c854 SHA512 058675627c1275df1dbada02fca3750e544e25c0d0842b4a4268a664456cae1869423d832b7e4af40e56168b687ec711adf124e9ab34b7c06a244b61f7e2fdfc
diff --git a/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch b/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch
new file mode 100644
index 0000000..98659ce
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch
@@ -0,0 +1,84 @@
+commit 409c6d4006fdea27e746ea397124f98c92a41a92
+Author: Joakim Hamren <joakim.hamren@gmail.com>
+Date:   Sat Feb 4 04:21:05 2017 +0100
+
+    Fix for overflowing long causing invalid json
+    
+    This was caused by checking for "__json__" using PyObject_HasAttrString
+    which clears the error set by a previous long overflow. Thus this was dependent
+    on the order of processing of dict items, which explains why it was
+    seemingly random as the dict items are likely ordered by a hash of
+    the key.
+    
+    This fixes GH224 and GH240.
+
+diff --git a/python/objToJSON.c b/python/objToJSON.c
+index 8133fb5..adea2f6 100644
+--- a/python/objToJSON.c
++++ b/python/objToJSON.c
+@@ -226,6 +226,21 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size
+   return NULL;
+ }
+ 
++static int PyHasAttrStringPreserveErr(PyObject *obj, const char *attr)
++{
++  int res;
++  PyObject *excType = NULL, *excValue, *excTraceback;
++
++  if (!PyErr_Occurred())
++    return PyObject_HasAttrString(obj, "__json__");
++
++  PyErr_Fetch(&excType, &excValue, &excTraceback);
++  res = PyObject_HasAttrString(obj, "__json__");
++  PyErr_Restore(excType, excValue, excTraceback);
++
++  return res;
++}
++
+ static int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   PyObject *item;
+@@ -471,21 +486,21 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+     GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName);
+   }
+   else
+-    if (!PyString_Check(GET_TC(tc)->itemName))
+-    {
+-      GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName);
++  if (!PyString_Check(GET_TC(tc)->itemName))
++  {
++    GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName);
+ #if PY_MAJOR_VERSION >= 3
+-      itemNameTmp = GET_TC(tc)->itemName;
+-      GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName);
+-      Py_DECREF(itemNameTmp);
++    itemNameTmp = GET_TC(tc)->itemName;
++    GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName);
++    Py_DECREF(itemNameTmp);
+ #endif
+-    }
+-    else
+-    {
+-      Py_INCREF(GET_TC(tc)->itemName);
+-    }
+-    PRINTMARK();
+-    return 1;
++  }
++  else
++  {
++    Py_INCREF(GET_TC(tc)->itemName);
++  }
++  PRINTMARK();
++  return 1;
+ }
+ 
+ static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+@@ -728,7 +743,7 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject
+     return;
+   }
+   else
+-  if (PyString_Check(obj) && !PyObject_HasAttrString(obj, "__json__"))
++  if (PyString_Check(obj) && !PyHasAttrStringPreserveErr(obj, "__json__"))
+   {
+     PRINTMARK();
+     pc->PyTypeToJSON = PyStringToUTF8; tc->type = JT_UTF8;
diff --git a/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch b/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch
new file mode 100644
index 0000000..37270d4
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch
@@ -0,0 +1,122 @@
+commit c9f8318bd823ae9d44797b6b881a2b3e22cdbade
+Author: Joakim Hamren <joakim.hamren@gmail.com>
+Date:   Tue Feb 7 02:02:38 2017 +0100
+
+    Fix for incorrect order when using OrderedDict
+
+diff --git a/python/objToJSON.c b/python/objToJSON.c
+index abe6588..9e6a390 100644
+--- a/python/objToJSON.c
++++ b/python/objToJSON.c
+@@ -253,8 +253,13 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+     GET_TC(tc)->itemName = NULL;
+   }
+ 
++  if (!(GET_TC(tc)->itemName = PyIter_Next(GET_TC(tc)->iterator)))
++  {
++    PRINTMARK();
++    return 0;
++  }
+ 
+-  if (!PyDict_Next ( (PyObject *)GET_TC(tc)->dictObj, &GET_TC(tc)->index, &GET_TC(tc)->itemName, &GET_TC(tc)->itemValue))
++  if (!(GET_TC(tc)->itemValue = PyObject_GetItem(GET_TC(tc)->dictObj, GET_TC(tc)->itemName)))
+   {
+     PRINTMARK();
+     return 0;
+@@ -295,6 +300,7 @@ static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+     Py_DECREF(GET_TC(tc)->itemName);
+     GET_TC(tc)->itemName = NULL;
+   }
++  Py_CLEAR(GET_TC(tc)->iterator);
+   Py_DECREF(GET_TC(tc)->dictObj);
+   PRINTMARK();
+ }
+@@ -425,20 +431,23 @@ static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outL
+ 
+ static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc)
+ {
+-  if (enc->sortKeys) {
++  pc->dictObj = dictObj;
++  if (enc->sortKeys)
++  {
+     pc->iterEnd = SortedDict_iterEnd;
+     pc->iterNext = SortedDict_iterNext;
+     pc->iterGetValue = SortedDict_iterGetValue;
+     pc->iterGetName = SortedDict_iterGetName;
++    pc->index = 0;
+   }
+-  else {
++  else
++  {
+     pc->iterEnd = Dict_iterEnd;
+     pc->iterNext = Dict_iterNext;
+     pc->iterGetValue = Dict_iterGetValue;
+     pc->iterGetName = Dict_iterGetName;
++    pc->iterator = PyObject_GetIter(dictObj);
+   }
+-  pc->dictObj = dictObj;
+-  pc->index = 0;
+ }
+ 
+ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc)
+@@ -446,7 +455,8 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject
+   PyObject *obj, *objRepr, *exc;
+   TypeContext *pc;
+   PRINTMARK();
+-  if (!_obj) {
++  if (!_obj)
++  {
+     tc->type = JT_INVALID;
+     return;
+   }
+diff --git a/tests/tests.py b/tests/tests.py
+index cd928e6..b7e46af 100644
+--- a/tests/tests.py
++++ b/tests/tests.py
+@@ -10,6 +10,8 @@ import json
+ import math
+ import time
+ import pytz
++from collections import OrderedDict
++
+ if six.PY2:
+     import unittest2 as unittest
+ else:
+@@ -383,6 +385,10 @@ class UltraJSONTests(unittest.TestCase):
+         input = -float('inf')
+         self.assertRaises(OverflowError, ujson.encode, input)
+ 
++    def test_encodeOrderedDict(self):
++        input = OrderedDict([(1, 1), (0, 0), (8, 8), (2, 2)])
++        self.assertEqual('{"1":1,"0":0,"8":8,"2":2}', ujson.encode(input))
++
+     def test_decodeJibberish(self):
+         input = "fdsa sda v9sa fdsa"
+         self.assertRaises(ValueError, ujson.decode, input)
+@@ -668,7 +674,7 @@ class UltraJSONTests(unittest.TestCase):
+         d = {u'key': JSONTest()}
+         output = ujson.encode(d)
+         dec = ujson.decode(output)
+-        self.assertEquals(dec, {u'key': output_text})
++        self.assertEqual(dec, {u'key': output_text})
+ 
+     def test_object_with_json_unicode(self):
+         # If __json__ returns a string, then that string
+@@ -681,7 +687,7 @@ class UltraJSONTests(unittest.TestCase):
+         d = {u'key': JSONTest()}
+         output = ujson.encode(d)
+         dec = ujson.decode(output)
+-        self.assertEquals(dec, {u'key': output_text})
++        self.assertEqual(dec, {u'key': output_text})
+ 
+     def test_object_with_complex_json(self):
+         # If __json__ returns a string, then that string
+@@ -694,7 +700,7 @@ class UltraJSONTests(unittest.TestCase):
+         d = {u'key': JSONTest()}
+         output = ujson.encode(d)
+         dec = ujson.decode(output)
+-        self.assertEquals(dec, {u'key': obj})
++        self.assertEqual(dec, {u'key': obj})
+ 
+     def test_object_with_json_type_error(self):
+         # __json__ must return a string, otherwise it should raise an error.
diff --git a/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch b/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch
new file mode 100644
index 0000000..7239bca
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch
@@ -0,0 +1,73 @@
+commit 870ee48fe109c289033cd0b7543b6f5ea4e6f128
+Author: Joakim Hamren <joakim.hamren@gmail.com>
+Date:   Sat Feb 4 01:07:52 2017 +0100
+
+    Fixes for sort_keys bug and a typo.
+    
+        - Fixed segfault when using sort_keys=True on dict with unorderable keys (GH247)
+    
+        - Fixed refcount becoming negative when using sort_keys=True (GH243)
+    
+        - Fixed compile error when defining JSON_NO_EXTRA_WHITESPACE
+          caused by a wrongly named variable. (GH245)
+
+diff --git a/lib/ultrajsonenc.c b/lib/ultrajsonenc.c
+index cb10024..1bfa8f4 100644
+--- a/lib/ultrajsonenc.c
++++ b/lib/ultrajsonenc.c
+@@ -717,7 +717,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c
+ {
+   const char *value;
+   char *objName;
+-  int count;
++  int count, res;
+   JSOBJ iterObj;
+   size_t szlen;
+   JSONTypeContext tc;
+@@ -796,7 +796,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c
+           {
+             Buffer_AppendCharUnchecked (enc, ',');
+ #ifndef JSON_NO_EXTRA_WHITESPACE
+-            Buffer_AppendCharUnchecked (buffer, ' ');
++            Buffer_AppendCharUnchecked (enc, ' ');
+ #endif
+             Buffer_AppendIndentNewlineUnchecked (enc);
+           }
+@@ -823,8 +823,16 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c
+       Buffer_AppendCharUnchecked (enc, '{');
+       Buffer_AppendIndentNewlineUnchecked (enc);
+ 
+-    while (enc->iterNext(obj, &tc))
++    while ((res = enc->iterNext(obj, &tc)))
+     {
++      if(res < 0)
++      {
++        enc->iterEnd(obj, &tc);
++        enc->endTypeContext(obj, &tc);
++        enc->level--;
++        return;
++      }
++
+       if (count > 0)
+       {
+         Buffer_AppendCharUnchecked (enc, ',');
+diff --git a/python/objToJSON.c b/python/objToJSON.c
+index 1960d40..8133fb5 100644
+--- a/python/objToJSON.c
++++ b/python/objToJSON.c
+@@ -537,6 +537,7 @@ static int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+     // Sort the list.
+     if (PyList_Sort(items) < 0)
+     {
++      PyErr_SetString(PyExc_ValueError, "unorderable keys");
+       goto error;
+     }
+ 
+@@ -607,7 +608,6 @@ static void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   GET_TC(tc)->itemName = NULL;
+   GET_TC(tc)->itemValue = NULL;
+-  Py_DECREF(GET_TC(tc)->newObj);
+   Py_DECREF(GET_TC(tc)->dictObj);
+   PRINTMARK();
+ }
diff --git a/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch b/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch
new file mode 100644
index 0000000..e2b7b91
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch
@@ -0,0 +1,77 @@
+commit ac4637fbc4e72bd59f221d9bba19127820d21023
+Author: Joakim Hamren <joakim.hamren@gmail.com>
+Date:   Sat Feb 4 16:36:14 2017 +0100
+
+    Following std json handling of None dict key
+    
+    Previously a None dict item key would be outputted in JSON as "None".
+    To better align with the standard json module this was changed to output
+    "null". There's no proper representation of null object keys in JSON so
+    this is implementation specific but it seems more natural to follow
+    suit when it can be done without a significant performance hit.
+    
+    Added and used branch prediction macros (LIKELY/UNLIKELY) as well.
+
+diff --git a/lib/ultrajson.h b/lib/ultrajson.h
+index 6c1dbc1..ca82a29 100644
+--- a/lib/ultrajson.h
++++ b/lib/ultrajson.h
+@@ -117,6 +117,14 @@ typedef uint32_t JSUINT32;
+ 
+ #define INLINE_PREFIX inline
+ 
++#ifdef __GNUC__
++#define LIKELY(x)       __builtin_expect(!!(x), 1)
++#define UNLIKELY(x)     __builtin_expect(!!(x), 0)
++#else
++#define LIKELY(x)       (x)
++#define UNLIKELY(x)     (x)
++#endif
++
+ typedef uint8_t JSUINT8;
+ typedef uint16_t JSUTF16;
+ typedef uint32_t JSUTF32;
+diff --git a/python/objToJSON.c b/python/objToJSON.c
+index adea2f6..41d4289 100644
+--- a/python/objToJSON.c
++++ b/python/objToJSON.c
+@@ -488,6 +488,12 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+   else
+   if (!PyString_Check(GET_TC(tc)->itemName))
+   {
++    if (UNLIKELY(GET_TC(tc)->itemName == Py_None))
++    {
++      GET_TC(tc)->itemName = PyString_FromString("null");
++      return 1;
++    }
++
+     GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName);
+ #if PY_MAJOR_VERSION >= 3
+     itemNameTmp = GET_TC(tc)->itemName;
+@@ -743,7 +749,7 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject
+     return;
+   }
+   else
+-  if (PyString_Check(obj) && !PyHasAttrStringPreserveErr(obj, "__json__"))
++  if (PyString_Check(obj) && LIKELY(!PyHasAttrStringPreserveErr(obj, "__json__")))
+   {
+     PRINTMARK();
+     pc->PyTypeToJSON = PyStringToUTF8; tc->type = JT_UTF8;
+@@ -837,7 +843,7 @@ ISITERABLE:
+   }
+   */
+ 
+-  if (PyObject_HasAttrString(obj, "toDict"))
++  if (UNLIKELY(PyObject_HasAttrString(obj, "toDict")))
+   {
+     PyObject* toDictFunc = PyObject_GetAttrString(obj, "toDict");
+     PyObject* tuple = PyTuple_New(0);
+@@ -863,7 +869,7 @@ ISITERABLE:
+     return;
+   }
+   else
+-  if (PyObject_HasAttrString(obj, "__json__"))
++  if (UNLIKELY(PyObject_HasAttrString(obj, "__json__")))
+   {
+     PyObject* toJSONFunc = PyObject_GetAttrString(obj, "__json__");
+     PyObject* tuple = PyTuple_New(0);
diff --git a/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch b/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch
new file mode 100644
index 0000000..6ce9875
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch
@@ -0,0 +1,11 @@
+--- ujson-1.35.orig/tests/tests.py	2017-04-14 18:14:36.298345782 -0700
++++ ujson-1.35/tests/tests.py	2017-04-14 18:14:47.899947795 -0700
+@@ -702,7 +702,7 @@
+ 
+         output = ujson.encode(ObjectTest())
+         dec = ujson.decode(output)
+-        self.assertEquals(dec, {})
++        self.assertEqual(dec, {})
+ 
+     def test_toDict(self):
+         d = {"key": 31337}
diff --git a/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch b/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch
new file mode 100644
index 0000000..7ce5d44
--- /dev/null
+++ b/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch
@@ -0,0 +1,591 @@
+commit 6cf6c7ff25c883349e8e9e5468e61498358e2e91
+Author: WGH <wgh@torlan.ru>
+Date:   Sat Aug 27 17:34:22 2016 +0300
+
+    added "static" to C functions, where possible
+    
+    1. It reduces clutter in symbol table.
+    2. It fixes issues with C99 inline semantics for functions
+       marked as inline (#237, #180, #222), which manifests
+       when compiled with GCC>=5.
+
+diff --git a/lib/ultrajsondec.c b/lib/ultrajsondec.c
+index 21a732e..19efc60 100644
+--- a/lib/ultrajsondec.c
++++ b/lib/ultrajsondec.c
+@@ -66,7 +66,7 @@ struct DecoderState
+   JSONObjectDecoder *dec;
+ };
+ 
+-JSOBJ FASTCALL_MSVC decode_any( struct DecoderState *ds) FASTCALL_ATTR;
++static JSOBJ FASTCALL_MSVC decode_any( struct DecoderState *ds) FASTCALL_ATTR;
+ typedef JSOBJ (*PFN_DECODER)( struct DecoderState *ds);
+ 
+ static JSOBJ SetError( struct DecoderState *ds, int offset, const char *message)
+@@ -76,13 +76,13 @@ static JSOBJ SetError( struct DecoderState *ds, int offset, const char *message)
+   return NULL;
+ }
+ 
+-double createDouble(double intNeg, double intValue, double frcValue, int frcDecimalCount)
++static double createDouble(double intNeg, double intValue, double frcValue, int frcDecimalCount)
+ {
+   static const double g_pow10[] = {1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001,0.0000001, 0.00000001, 0.000000001, 0.0000000001, 0.00000000001, 0.000000000001, 0.0000000000001, 0.00000000000001, 0.000000000000001};
+   return (intValue + (frcValue * g_pow10[frcDecimalCount])) * intNeg;
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds)
+ {
+   char *end;
+   double value;
+@@ -99,7 +99,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds)
+   return ds->dec->newDouble(ds->prv, value);
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_numeric (struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_numeric (struct DecoderState *ds)
+ {
+   int intNeg = 1;
+   int mantSize = 0;
+@@ -309,7 +309,7 @@ BREAK_EXP_LOOP:
+   return ds->dec->newDouble (ds->prv, createDouble( (double) intNeg, (double) intValue , frcValue, decimalCount) * pow(10.0, expValue * expNeg));
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_true ( struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_true ( struct DecoderState *ds)
+ {
+   char *offset = ds->start;
+   offset ++;
+@@ -329,7 +329,7 @@ SETERROR:
+   return SetError(ds, -1, "Unexpected character found when decoding 'true'");
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_false ( struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_false ( struct DecoderState *ds)
+ {
+   char *offset = ds->start;
+   offset ++;
+@@ -351,7 +351,7 @@ SETERROR:
+   return SetError(ds, -1, "Unexpected character found when decoding 'false'");
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_null ( struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_null ( struct DecoderState *ds)
+ {
+   char *offset = ds->start;
+   offset ++;
+@@ -371,7 +371,7 @@ SETERROR:
+   return SetError(ds, -1, "Unexpected character found when decoding 'null'");
+ }
+ 
+-FASTCALL_ATTR void FASTCALL_MSVC SkipWhitespace(struct DecoderState *ds)
++static FASTCALL_ATTR void FASTCALL_MSVC SkipWhitespace(struct DecoderState *ds)
+ {
+   char *offset = ds->start;
+ 
+@@ -422,7 +422,7 @@ static const JSUINT8 g_decoderLookup[256] =
+   /* 0xf0 */ 4, 4, 4, 4, 4, 4, 4, 4, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR,
+ };
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds)
+ {
+   JSUTF16 sur[2] = { 0 };
+   int iSur = 0;
+@@ -672,7 +672,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds)
+   }
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds)
+ {
+   JSOBJ itemValue;
+   JSOBJ newObj;
+@@ -736,7 +736,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds)
+   }
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds)
+ {
+   JSOBJ itemName;
+   JSOBJ itemValue;
+@@ -819,7 +819,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds)
+   }
+ }
+ 
+-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_any(struct DecoderState *ds)
++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_any(struct DecoderState *ds)
+ {
+   for (;;)
+   {
+diff --git a/lib/ultrajsonenc.c b/lib/ultrajsonenc.c
+index 6c1b120..f330171 100644
+--- a/lib/ultrajsonenc.c
++++ b/lib/ultrajsonenc.c
+@@ -112,7 +112,7 @@ static void SetError (JSOBJ obj, JSONObjectEncoder *enc, const char *message)
+ /*
+ FIXME: Keep track of how big these get across several encoder calls and try to make an estimate
+ That way we won't run our head into the wall each call */
+-void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded)
++static void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded)
+ {
+   size_t curSize = enc->end - enc->start;
+   size_t newSize = curSize * 2;
+@@ -148,7 +148,7 @@ void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded)
+   enc->end = enc->start + newSize;
+ }
+ 
+-FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (char *outputOffset, unsigned short value)
++static FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (char *outputOffset, unsigned short value)
+ {
+   *(outputOffset++) = g_hexChars[(value & 0xf000) >> 12];
+   *(outputOffset++) = g_hexChars[(value & 0x0f00) >> 8];
+@@ -156,7 +156,7 @@ FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (c
+   *(outputOffset++) = g_hexChars[(value & 0x000f) >> 0];
+ }
+ 
+-int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, const char *end)
++static int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, const char *end)
+ {
+   char *of = (char *) enc->offset;
+ 
+@@ -260,7 +260,7 @@ int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, cons
+   }
+ }
+ 
+-int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char *io, const char *end)
++static int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char *io, const char *end)
+ {
+   JSUTF32 ucs;
+   char *of = (char *) enc->offset;
+@@ -498,19 +498,19 @@ int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char
+ #define Buffer_AppendCharUnchecked(__enc, __chr) \
+                 *((__enc)->offset++) = __chr; \
+ 
+-FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC strreverse(char* begin, char* end)
++static FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC strreverse(char* begin, char* end)
+ {
+   char aux;
+   while (end > begin)
+   aux = *end, *end-- = *begin, *begin++ = aux;
+ }
+ 
+-void Buffer_AppendIndentNewlineUnchecked(JSONObjectEncoder *enc)
++static void Buffer_AppendIndentNewlineUnchecked(JSONObjectEncoder *enc)
+ {
+   if (enc->indent > 0) Buffer_AppendCharUnchecked(enc, '\n');
+ }
+ 
+-void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value)
++static void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value)
+ {
+   int i;
+   if (enc->indent > 0)
+@@ -519,7 +519,7 @@ void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value)
+         Buffer_AppendCharUnchecked(enc, ' ');
+ }
+ 
+-void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value)
++static void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value)
+ {
+   char* wstr;
+   JSUINT32 uvalue = (value < 0) ? -value : value;
+@@ -535,7 +535,7 @@ void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value)
+   enc->offset += (wstr - (enc->offset));
+ }
+ 
+-void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value)
++static void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value)
+ {
+   char* wstr;
+   JSUINT64 uvalue = (value < 0) ? -value : value;
+@@ -551,7 +551,7 @@ void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value)
+   enc->offset += (wstr - (enc->offset));
+ }
+ 
+-void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value)
++static void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value)
+ {
+   char* wstr;
+   JSUINT64 uvalue = value;
+@@ -566,7 +566,7 @@ void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value)
+   enc->offset += (wstr - (enc->offset));
+ }
+ 
+-int Buffer_AppendDoubleUnchecked(JSOBJ obj, JSONObjectEncoder *enc, double value)
++static int Buffer_AppendDoubleUnchecked(JSOBJ obj, JSONObjectEncoder *enc, double value)
+ {
+   /* if input is larger than thres_max, revert to exponential */
+   const double thres_max = (double) 1e16 - 1;
+@@ -714,7 +714,7 @@ Handle integration functions returning NULL here */
+ FIXME:
+ Perhaps implement recursion detection */
+ 
+-void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t cbName)
++static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t cbName)
+ {
+   const char *value;
+   char *objName;
+diff --git a/python/JSONtoObj.c b/python/JSONtoObj.c
+index 79d9f1a..6cef088 100644
+--- a/python/JSONtoObj.c
++++ b/python/JSONtoObj.c
+@@ -43,7 +43,7 @@ http://www.opensource.apple.com/source/tcl/tcl-14/tcl/license.terms
+ //#define PRINTMARK() fprintf(stderr, "%s: MARK(%d)\n", __FILE__, __LINE__)
+ #define PRINTMARK()
+ 
+-void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value)
++static void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value)
+ {
+   PyDict_SetItem (obj, name, value);
+   Py_DECREF( (PyObject *) name);
+@@ -51,59 +51,59 @@ void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value)
+   return;
+ }
+ 
+-void Object_arrayAddItem(void *prv, JSOBJ obj, JSOBJ value)
++static void Object_arrayAddItem(void *prv, JSOBJ obj, JSOBJ value)
+ {
+   PyList_Append(obj, value);
+   Py_DECREF( (PyObject *) value);
+   return;
+ }
+ 
+-JSOBJ Object_newString(void *prv, wchar_t *start, wchar_t *end)
++static JSOBJ Object_newString(void *prv, wchar_t *start, wchar_t *end)
+ {
+   return PyUnicode_FromWideChar (start, (end - start));
+ }
+ 
+-JSOBJ Object_newTrue(void *prv)
++static JSOBJ Object_newTrue(void *prv)
+ {
+   Py_RETURN_TRUE;
+ }
+ 
+-JSOBJ Object_newFalse(void *prv)
++static JSOBJ Object_newFalse(void *prv)
+ {
+   Py_RETURN_FALSE;
+ }
+ 
+-JSOBJ Object_newNull(void *prv)
++static JSOBJ Object_newNull(void *prv)
+ {
+   Py_RETURN_NONE;
+ }
+ 
+-JSOBJ Object_newObject(void *prv)
++static JSOBJ Object_newObject(void *prv)
+ {
+   return PyDict_New();
+ }
+ 
+-JSOBJ Object_newArray(void *prv)
++static JSOBJ Object_newArray(void *prv)
+ {
+   return PyList_New(0);
+ }
+ 
+-JSOBJ Object_newInteger(void *prv, JSINT32 value)
++static JSOBJ Object_newInteger(void *prv, JSINT32 value)
+ {
+   return PyInt_FromLong( (long) value);
+ }
+ 
+-JSOBJ Object_newLong(void *prv, JSINT64 value)
++static JSOBJ Object_newLong(void *prv, JSINT64 value)
+ {
+   return PyLong_FromLongLong (value);
+ }
+ 
+-JSOBJ Object_newUnsignedLong(void *prv, JSUINT64 value)
++static JSOBJ Object_newUnsignedLong(void *prv, JSUINT64 value)
+ {
+   return PyLong_FromUnsignedLongLong (value);
+ }
+ 
+-JSOBJ Object_newDouble(void *prv, double value)
++static JSOBJ Object_newDouble(void *prv, double value)
+ {
+   return PyFloat_FromDouble(value);
+ }
+diff --git a/python/objToJSON.c b/python/objToJSON.c
+index 04a4575..1960d40 100644
+--- a/python/objToJSON.c
++++ b/python/objToJSON.c
+@@ -226,7 +226,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size
+   return NULL;
+ }
+ 
+-int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   PyObject *item;
+ 
+@@ -242,21 +242,21 @@ int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc)
+   return 1;
+ }
+ 
+-void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+ }
+ 
+-JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   return NULL;
+ }
+ 
+-int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   PyObject *item;
+ 
+@@ -282,7 +282,7 @@ int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc)
+   return 1;
+ }
+ 
+-void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   if (GET_TC(tc)->itemValue)
+   {
+@@ -297,17 +297,17 @@ void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+   }
+ }
+ 
+-JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   return NULL;
+ }
+ 
+-void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   if (GET_TC(tc)->itemValue)
+   {
+@@ -325,7 +325,7 @@ void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+   PRINTMARK();
+ }
+ 
+-int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc)
++static int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc)
+ {
+   PyObject *obj = (PyObject *) _obj;
+   PyObject *itemValue = GET_TC(tc)->itemValue;
+@@ -401,20 +401,20 @@ int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc)
+   return 1;
+ }
+ 
+-JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   PRINTMARK();
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   PRINTMARK();
+   *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName);
+   return PyString_AS_STRING(GET_TC(tc)->itemName);
+ }
+ 
+-int List_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int List_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   if (GET_TC(tc)->index >= GET_TC(tc)->size)
+   {
+@@ -427,16 +427,16 @@ int List_iterNext(JSOBJ obj, JSONTypeContext *tc)
+   return 1;
+ }
+ 
+-void List_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void List_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+ }
+ 
+-JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   return NULL;
+ }
+@@ -447,7 +447,7 @@ char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ // itemValue is borrowed from object (which is dict). No refCounting
+ //=============================================================================
+ 
+-int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+ #if PY_MAJOR_VERSION >= 3
+   PyObject* itemNameTmp;
+@@ -488,7 +488,7 @@ int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+     return 1;
+ }
+ 
+-void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   if (GET_TC(tc)->itemName)
+   {
+@@ -499,18 +499,18 @@ void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+   PRINTMARK();
+ }
+ 
+-JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName);
+   return PyString_AS_STRING(GET_TC(tc)->itemName);
+ }
+ 
+-int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   PyObject *items = NULL, *item = NULL, *key = NULL, *value = NULL;
+   Py_ssize_t i, nitems;
+@@ -603,7 +603,7 @@ error:
+   return -1;
+ }
+ 
+-void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   GET_TC(tc)->itemName = NULL;
+   GET_TC(tc)->itemValue = NULL;
+@@ -612,19 +612,19 @@ void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+   PRINTMARK();
+ }
+ 
+-JSOBJ SortedDict_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ SortedDict_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->itemValue;
+ }
+ 
+-char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName);
+   return PyString_AS_STRING(GET_TC(tc)->itemName);
+ }
+ 
+ 
+-void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc)
++static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc)
+ {
+   if (enc->sortKeys) {
+     pc->iterEnd = SortedDict_iterEnd;
+@@ -642,7 +642,7 @@ void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc)
+   pc->index = 0;
+ }
+ 
+-void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc)
++static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc)
+ {
+   PyObject *obj, *exc, *iter;
+   TypeContext *pc;
+@@ -929,7 +929,7 @@ INVALID:
+   return;
+ }
+ 
+-void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc)
++static void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   Py_XDECREF(GET_TC(tc)->newObj);
+ 
+@@ -937,33 +937,33 @@ void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc)
+   tc->prv = NULL;
+ }
+ 
+-const char *Object_getStringValue(JSOBJ obj, JSONTypeContext *tc, size_t *_outLen)
++static const char *Object_getStringValue(JSOBJ obj, JSONTypeContext *tc, size_t *_outLen)
+ {
+   return GET_TC(tc)->PyTypeToJSON (obj, tc, NULL, _outLen);
+ }
+ 
+-JSINT64 Object_getLongValue(JSOBJ obj, JSONTypeContext *tc)
++static JSINT64 Object_getLongValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   JSINT64 ret;
+   GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL);
+   return ret;
+ }
+ 
+-JSUINT64 Object_getUnsignedLongValue(JSOBJ obj, JSONTypeContext *tc)
++static JSUINT64 Object_getUnsignedLongValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   JSUINT64 ret;
+   GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL);
+   return ret;
+ }
+ 
+-JSINT32 Object_getIntValue(JSOBJ obj, JSONTypeContext *tc)
++static JSINT32 Object_getIntValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   JSINT32 ret;
+   GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL);
+   return ret;
+ }
+ 
+-double Object_getDoubleValue(JSOBJ obj, JSONTypeContext *tc)
++static double Object_getDoubleValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   double ret;
+   GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL);
+@@ -975,22 +975,22 @@ static void Object_releaseObject(JSOBJ _obj)
+   Py_DECREF( (PyObject *) _obj);
+ }
+ 
+-int Object_iterNext(JSOBJ obj, JSONTypeContext *tc)
++static int Object_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->iterNext(obj, tc);
+ }
+ 
+-void Object_iterEnd(JSOBJ obj, JSONTypeContext *tc)
++static void Object_iterEnd(JSOBJ obj, JSONTypeContext *tc)
+ {
+   GET_TC(tc)->iterEnd(obj, tc);
+ }
+ 
+-JSOBJ Object_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
++static JSOBJ Object_iterGetValue(JSOBJ obj, JSONTypeContext *tc)
+ {
+   return GET_TC(tc)->iterGetValue(obj, tc);
+ }
+ 
+-char *Object_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
++static char *Object_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen)
+ {
+   return GET_TC(tc)->iterGetName(obj, tc, outLen);
+ }
diff --git a/dev-python/ujson/files/ujson-3.0.0-pypy3-test.patch b/dev-python/ujson/files/ujson-3.0.0-pypy3-test.patch
new file mode 100644
index 0000000..3bee41b
--- /dev/null
+++ b/dev-python/ujson/files/ujson-3.0.0-pypy3-test.patch
@@ -0,0 +1,80 @@
+From c9a5ee46a1112d5f7e51defebeefb1e0ab43111e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
+Date: Fri, 12 Jun 2020 15:04:57 +0200
+Subject: [PATCH 1/3] Do not depend on specific exception messages in tests
+
+Fix test_encode_raises_allow_nan() not to depend on specific exception
+messages.  This fixes test failures on PyPy which just happens to use
+different error messages.
+---
+ tests/test_ujson.py | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/tests/test_ujson.py b/tests/test_ujson.py
+index 72018a0..1d41de5 100644
+--- a/tests/test_ujson.py
++++ b/tests/test_ujson.py
+@@ -614,18 +614,17 @@ def test_dumps_raises(test_input, expected_exception, expected_message):
+ 
+ 
+ @pytest.mark.parametrize(
+-    "test_input, expected_exception, expected_message",
++    "test_input, expected_exception",
+     [
+-        (float("nan"), OverflowError, "Invalid value when encoding double"),
+-        (float("inf"), OverflowError, "Invalid value when encoding double"),
+-        (-float("inf"), OverflowError, "Invalid value when encoding double"),
+-        (12839128391289382193812939, OverflowError, "int too big to convert"),
++        (float("nan"), OverflowError),
++        (float("inf"), OverflowError),
++        (-float("inf"), OverflowError),
++        (12839128391289382193812939, OverflowError),
+     ],
+ )
+-def test_encode_raises_allow_nan(test_input, expected_exception, expected_message):
++def test_encode_raises_allow_nan(test_input, expected_exception):
+     with pytest.raises(expected_exception) as e:
+         ujson.dumps(test_input, allow_nan=False)
+-    assert str(e.value) == expected_message
+ 
+ 
+ @pytest.mark.parametrize(
+-- 
+2.27.0
+
+From 66cc0ad8a76d1bef848e36d9bdcaf476047b5605 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
+Date: Fri, 12 Jun 2020 15:08:27 +0200
+Subject: [PATCH 2/3] Skip GC tests on PyPy
+
+---
+ tests/test_ujson.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/tests/test_ujson.py b/tests/test_ujson.py
+index 1d41de5..fe20174 100644
+--- a/tests/test_ujson.py
++++ b/tests/test_ujson.py
+@@ -215,6 +215,9 @@ def test_encode_dict_conversion():
+     assert test_input == ujson.decode(output)
+ 
+ 
++@pytest.mark.skipif(
++    hasattr(sys, "pypy_version_info"), reason="PyPy uses incompatible GC"
++)
+ def test_encode_dict_values_ref_counting():
+     import gc
+ 
+@@ -226,6 +229,9 @@ def test_encode_dict_values_ref_counting():
+     assert ref_count == sys.getrefcount(value)
+ 
+ 
++@pytest.mark.skipif(
++    hasattr(sys, "pypy_version_info"), reason="PyPy uses incompatible GC"
++)
+ def test_encode_dict_key_ref_counting():
+     import gc
+ 
+-- 
+2.27.0
+
diff --git a/dev-python/ujson/metadata.xml b/dev-python/ujson/metadata.xml
new file mode 100644
index 0000000..54e7ce8
--- /dev/null
+++ b/dev-python/ujson/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="person">
+    <email>swegener@gentoo.org</email>
+    <name>Sven Wegener</name>
+  </maintainer>
+  <maintainer type="project">
+    <email>python@gentoo.org</email>
+    <name>Python</name>
+  </maintainer>
+  <upstream>
+    <remote-id type="pypi">ujson</remote-id>
+  </upstream>
+</pkgmetadata>
diff --git a/dev-python/ujson/ujson-3.0.0.ebuild b/dev-python/ujson/ujson-3.0.0.ebuild
new file mode 100644
index 0000000..da827f7
--- /dev/null
+++ b/dev-python/ujson/ujson-3.0.0.ebuild
@@ -0,0 +1,28 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+PYTHON_COMPAT=( python3_{6..8} pypy3 )
+
+inherit distutils-r1
+
+DESCRIPTION="Ultra fast JSON encoder and decoder for Python"
+HOMEPAGE="https://pypi.org/project/ujson/"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="*"
+IUSE="test"
+RESTRICT="!test? ( test )"
+
+DEPEND="
+	dev-python/setuptools_scm[${PYTHON_USEDEP}]
+	test? ( dev-python/pytz[${PYTHON_USEDEP}] )
+"
+
+distutils_enable_tests pytest
+
+PATCHES=(
+	"${FILESDIR}"/${P}-pypy3-test.patch
+)
diff --git a/metadata/md5-cache/dev-python/feedparser-6.0.0_beta1 b/metadata/md5-cache/dev-python/feedparser-6.0.0_beta1
new file mode 100644
index 0000000..2070234
--- /dev/null
+++ b/metadata/md5-cache/dev-python/feedparser-6.0.0_beta1
@@ -0,0 +1,15 @@
+BDEPEND=test? ( dev-python/sgmllib3k[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] ) python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Parse RSS and Atom feeds in Python
+EAPI=7
+HOMEPAGE=https://github.com/kurtmckee/feedparser https://pypi.org/project/feedparser/
+IUSE=test python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=BSD-2
+RDEPEND=dev-python/sgmllib3k[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=https://github.com/kurtmckee/feedparser/archive/6.0.0b1.tar.gz -> feedparser-6.0.0b1.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	605c126bed8d87e4378d5ff1645330cb
+_md5_=4077ce27ead6773a5b10acc74af986c7
diff --git a/metadata/md5-cache/dev-python/jsonpickle-1.4.1-r1 b/metadata/md5-cache/dev-python/jsonpickle-1.4.1-r1
new file mode 100644
index 0000000..5d5a002
--- /dev/null
+++ b/metadata/md5-cache/dev-python/jsonpickle-1.4.1-r1
@@ -0,0 +1,15 @@
+BDEPEND=dev-python/setuptools_scm[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/toml[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] doc? ( || ( ( dev-lang/python:3.9 dev-python/sphinx[python_targets_python3_9(-),python_single_target_python3_9(+)] ) ( dev-lang/python:3.8 dev-python/sphinx[python_targets_python3_8(-),python_single_target_python3_8(+)] ) ( dev-lang/python:3.7 dev-python/sphinx[python_targets_python3_7(-),python_single_target_python3_7(+)] ) ( dev-lang/python:3.6 dev-python/sphinx[python_targets_python3_6(-),python_single_target_python3_6(+)] ) ) ) test? ( dev-python/pytest[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/simplejson[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/feedparser[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/ujson[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Python library for serializing any arbitrary object graph into JSON
+EAPI=7
+HOMEPAGE=https://github.com/jsonpickle/jsonpickle/ https://pypi.org/project/jsonpickle/
+IUSE=doc test doc test python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=dev-python/simplejson[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/feedparser[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/ujson[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+RESTRICT=!test? ( test ) !test? ( test )
+SLOT=0
+SRC_URI=mirror://pypi/j/jsonpickle/jsonpickle-1.4.1.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	605c126bed8d87e4378d5ff1645330cb
+_md5_=88c2ce2af95929f9bb5e3563983ba396
diff --git a/metadata/md5-cache/dev-python/sgmllib3k-1.0.0 b/metadata/md5-cache/dev-python/sgmllib3k-1.0.0
new file mode 100644
index 0000000..5c64c57
--- /dev/null
+++ b/metadata/md5-cache/dev-python/sgmllib3k-1.0.0
@@ -0,0 +1,14 @@
+BDEPEND=python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Py3k port of sgmllib
+EAPI=7
+HOMEPAGE=https://pypi.org/project/sgmllib3k/
+IUSE=python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=PSF-2
+RDEPEND=python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+SLOT=0
+SRC_URI=mirror://pypi/s/sgmllib3k/sgmllib3k-1.0.0.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	605c126bed8d87e4378d5ff1645330cb
+_md5_=013b6a92b665e7dc59089073b03d3f98
diff --git a/metadata/md5-cache/dev-python/toml-0.10.1 b/metadata/md5-cache/dev-python/toml-0.10.1
new file mode 100644
index 0000000..0339ba8
--- /dev/null
+++ b/metadata/md5-cache/dev-python/toml-0.10.1
@@ -0,0 +1,15 @@
+BDEPEND=dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] test? ( python_targets_python3_6? ( dev-python/numpy[python_targets_python3_6(-)?,-python_single_target_python3_6(-),python_targets_python3_7(-)?,-python_single_target_python3_7(-),python_targets_python3_8(-)?,-python_single_target_python3_8(-)] ) python_targets_python3_7? ( dev-python/numpy[python_targets_python3_6(-)?,-python_single_target_python3_6(-),python_targets_python3_7(-)?,-python_single_target_python3_7(-),python_targets_python3_8(-)?,-python_single_target_python3_8(-)] ) python_targets_python3_8? ( dev-python/numpy[python_targets_python3_6(-)?,-python_single_target_python3_6(-),python_targets_python3_7(-)?,-python_single_target_python3_7(-),python_targets_python3_8(-)?,-python_single_target_python3_8(-)] ) ) test? ( dev-python/pytest[python_targets_pypy3(-)?,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] ) python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DEFINED_PHASES=compile configure install prepare test
+DESCRIPTION=Python library for handling TOML files
+EAPI=7
+HOMEPAGE=https://github.com/uiri/toml
+IUSE=test test python_targets_pypy3 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python2_7(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python2_7(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python2_7 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=https://github.com/uiri/toml/archive/0.10.1.tar.gz -> toml-0.10.1-1.tar.gz test? ( https://github.com/BurntSushi/toml-test/archive/280497fa5f12e43d7233aed0d74e07ca61ef176b.tar.gz -> toml-test-280497fa5f12e43d7233aed0d74e07ca61ef176b.tar.gz )
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	605c126bed8d87e4378d5ff1645330cb
+_md5_=da9e4c319de2ba63c4a1a319eeb75d17
diff --git a/metadata/md5-cache/dev-python/ujson-3.0.0 b/metadata/md5-cache/dev-python/ujson-3.0.0
new file mode 100644
index 0000000..1c17a11
--- /dev/null
+++ b/metadata/md5-cache/dev-python/ujson-3.0.0
@@ -0,0 +1,16 @@
+BDEPEND=test? ( dev-python/pytest[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] ) python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] dev-python/setuptools[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+DEFINED_PHASES=compile configure install prepare test
+DEPEND=dev-python/setuptools_scm[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] test? ( dev-python/pytz[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)] )
+DESCRIPTION=Ultra fast JSON encoder and decoder for Python
+EAPI=7
+HOMEPAGE=https://pypi.org/project/ujson/
+IUSE=test test python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9
+KEYWORDS=*
+LICENSE=BSD
+RDEPEND=python_targets_pypy3? ( >=dev-python/pypy3-7.3.0:0= ) python_targets_python3_6? ( dev-lang/python:3.6 ) python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) python_targets_python3_9? ( dev-lang/python:3.9 ) >=dev-lang/python-exec-2:=[python_targets_pypy3(-)?,python_targets_python3_6(-)?,python_targets_python3_7(-)?,python_targets_python3_8(-)?,python_targets_python3_9(-)?,-python_single_target_pypy3(-),-python_single_target_python3_6(-),-python_single_target_python3_7(-),-python_single_target_python3_8(-),-python_single_target_python3_9(-)]
+REQUIRED_USE=|| ( python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 )
+RESTRICT=!test? ( test ) !test? ( test )
+SLOT=0
+SRC_URI=mirror://pypi/u/ujson/ujson-3.0.0.tar.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	multibuild	40fe59465edacd730c644ec2bc197809	multilib	2477ebe553d3e4d2c606191fe6c33602	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	79e26ce8f853c9daebe9a4956e37cc1b	python-utils-r1	157a6a7a3e99c7dbdf81acc9dd4f57cd	toolchain-funcs	605c126bed8d87e4378d5ff1645330cb
+_md5_=40e2db074d8f4330fd274c587152a8ef