dev-python/cherrypy: Remove old

Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny
2022-07-18 15:52:12 +02:00
parent bf82a3afbc
commit 4b7dd82ca0
5 changed files with 0 additions and 597 deletions

View File

@@ -1,3 +1 @@
DIST CherryPy-18.6.1.tar.gz 692730 BLAKE2B 44cef7ed54a090df396691001b794bf13be2c61003bf80b63223e3a42914ce50fcfe43c06626fb881105e3ed6fbf587df7024bbf7cfde00a8263c432f4cc7ae4 SHA512 186a0992a443e1ffc1a2924b3351dcb0e6cc6c88b39ac32330d6365fe1b0a35c2008a3a18e1a57f61ffd1901ea6134333bb6288024d8ffbb1fd8e8dcd3145007
DIST CherryPy-18.7.0.tar.gz 621794 BLAKE2B d60cd21d0b0bacbb18bcaeb525be143c3639f462978e9835e5c77ba8ce732a3af4662e4c37e2d20e1ad19760900775dee4a3cd98db53e70a19611d30c8329bce SHA512 321771a3e3cda16090bfb7a79c297defd67655ba5453e440e09e85fec41cba850544bebac7203206c95e38d79b3bce22368ea19c0fb1fbedbb00d76a4ab59c8b
DIST CherryPy-18.8.0.tar.gz 622679 BLAKE2B 673f9a103a901161ee801656fa37fa0a4fcd2d9276a5231e48c1663264eb7f922d5d862018995a345a8485252416fa0229da49b8d265288efce2dccd37d79ff8 SHA512 abacc995c1757b8d0171d57eb59b6e5931c46019d8f0f43479e334bb4f58b61a27541d9d0997d665f81905bc3c89e42d40d8e5a6e3a5f9bf251bc9089ceb5249

View File

@@ -1,78 +0,0 @@
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{8..11} pypy3 )
inherit distutils-r1
MY_PN="CherryPy"
MY_P=${MY_PN}-${PV}
DESCRIPTION="CherryPy is a pythonic, object-oriented HTTP framework"
HOMEPAGE="
https://cherrypy.dev/
https://github.com/cherrypy/cherrypy/
https://pypi.org/project/CherryPy/
"
SRC_URI="mirror://pypi/${MY_PN::1}/${MY_PN}/${MY_P}.tar.gz"
S=${WORKDIR}/${MY_P}
LICENSE="BSD"
SLOT="0"
KEYWORDS="amd64 arm arm64 ppc ~ppc64 ~riscv x86"
IUSE="ssl test"
RDEPEND="
>=dev-python/cheroot-8.2.1[${PYTHON_USEDEP}]
>=dev-python/portend-2.1.1[${PYTHON_USEDEP}]
dev-python/more-itertools[${PYTHON_USEDEP}]
dev-python/zc-lockfile[${PYTHON_USEDEP}]
dev-python/jaraco-collections[${PYTHON_USEDEP}]
ssl? (
dev-python/pyopenssl[${PYTHON_USEDEP}]
)
"
BDEPEND="
dev-python/setuptools_scm[${PYTHON_USEDEP}]
test? (
dev-python/routes[${PYTHON_USEDEP}]
dev-python/simplejson[${PYTHON_USEDEP}]
dev-python/objgraph[${PYTHON_USEDEP}]
dev-python/path-py[${PYTHON_USEDEP}]
dev-python/requests-toolbelt[${PYTHON_USEDEP}]
dev-python/pytest-services[${PYTHON_USEDEP}]
)
"
distutils_enable_tests pytest
python_prepare_all() {
local PATCHES=(
# https://github.com/cherrypy/cherrypy/pull/1946
"${FILESDIR}"/${P}-close-files.patch
"${FILESDIR}"/${P}-py311.patch
)
sed -r -e '/(pytest-sugar|pytest-cov)/ d' \
-i setup.py || die
sed -r -e 's:--cov-report[[:space:]]+[[:graph:]]+::g' \
-e 's:--cov[[:graph:]]+::g' \
-e 's:--doctest[[:graph:]]+::g' \
-i pytest.ini || die
distutils-r1_python_prepare_all
}
python_test() {
local EPYTEST_DESELECT=()
[[ ${EPYTHON} == python3.11 ]] && EPYTEST_DESELECT+=(
# broken by changes in traceback output
cherrypy/test/test_request_obj.py::RequestObjectTests::testErrorHandling
cherrypy/test/test_tools.py::ToolTests::testHookErrors
)
epytest
}

View File

@@ -1,69 +0,0 @@
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{8..11} pypy3 )
inherit distutils-r1
MY_PN="CherryPy"
MY_P=${MY_PN}-${PV}
DESCRIPTION="CherryPy is a pythonic, object-oriented HTTP framework"
HOMEPAGE="
https://cherrypy.dev/
https://github.com/cherrypy/cherrypy/
https://pypi.org/project/CherryPy/
"
SRC_URI="mirror://pypi/${MY_PN::1}/${MY_PN}/${MY_P}.tar.gz"
S=${WORKDIR}/${MY_P}
LICENSE="BSD"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~x86"
IUSE="ssl test"
RDEPEND="
>=dev-python/cheroot-8.2.1[${PYTHON_USEDEP}]
>=dev-python/portend-2.1.1[${PYTHON_USEDEP}]
dev-python/more-itertools[${PYTHON_USEDEP}]
dev-python/zc-lockfile[${PYTHON_USEDEP}]
dev-python/jaraco-collections[${PYTHON_USEDEP}]
ssl? (
dev-python/pyopenssl[${PYTHON_USEDEP}]
)
"
BDEPEND="
dev-python/setuptools_scm[${PYTHON_USEDEP}]
test? (
dev-python/routes[${PYTHON_USEDEP}]
dev-python/simplejson[${PYTHON_USEDEP}]
dev-python/objgraph[${PYTHON_USEDEP}]
dev-python/path-py[${PYTHON_USEDEP}]
dev-python/requests-toolbelt[${PYTHON_USEDEP}]
dev-python/pytest-services[${PYTHON_USEDEP}]
)
"
distutils_enable_tests pytest
python_prepare_all() {
sed -i -e '/cov/d' pytest.ini || die
# upstream has been using xfail to mark flaky tests, then added
# xfail_strict... not a good idea
sed -i -e '/xfail_strict/d' pytest.ini || die
distutils-r1_python_prepare_all
}
python_test() {
local EPYTEST_DESELECT=()
[[ ${EPYTHON} == python3.11 ]] && EPYTEST_DESELECT+=(
# broken by changes in traceback output
cherrypy/test/test_request_obj.py::RequestObjectTests::testErrorHandling
cherrypy/test/test_tools.py::ToolTests::testHookErrors
)
epytest
}

View File

@@ -1,416 +0,0 @@
From 94a2cc036203c6da55174ef3b105c0c875bbc79f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Mon, 31 Jan 2022 22:25:34 +0100
Subject: [PATCH] Use context managers to close files properly and fix tests on
PyPy
Use context managers (`with`) to ensure that all open files are closed
correctly. This resolves resource leaks and test failures with PyPy3.7.
The code prior to this change used four approaches for closing files:
1. Using a context manager (`with` clause).
2. Using a try/finally clause.
3. Closing the file in the same scope (unreliable: file object can leak
on exception).
4. Not closing open files at all.
The last point is a real problem for PyPy since it does not GC
unreachable objects as aggressively as CPython does. While leaving
a function scope on CPython causes the file objects private to it to
be destroyed (and therefore closed), in PyPy they can stay dangling
for some time. When combines with buffered writes, this means that
writes can still remain pending after returning from function.
Using a context manager is a simple, consistent way to ensure that
the file object is closed once it is no longer needed. In turn, this
guarantees that all pending writes will be performed upon function
return and the code won't be hiting race conditions between writing
a file and reading it afterwards.
---
cherrypy/_cperror.py | 3 ++-
cherrypy/_cpmodpy.py | 5 +----
cherrypy/lib/auth_digest.py | 13 ++++++------
cherrypy/lib/covercp.py | 40 ++++++++++++++++++------------------
cherrypy/lib/reprconf.py | 5 +----
cherrypy/lib/sessions.py | 10 ++-------
cherrypy/process/plugins.py | 3 ++-
cherrypy/test/helper.py | 3 ++-
cherrypy/test/logtest.py | 33 ++++++++++++++++-------------
cherrypy/test/modfastcgi.py | 5 +----
cherrypy/test/modfcgid.py | 5 +----
cherrypy/test/modpy.py | 5 +----
cherrypy/test/modwsgi.py | 5 +----
cherrypy/test/test_core.py | 5 ++---
cherrypy/test/test_states.py | 11 +++++-----
15 files changed, 67 insertions(+), 84 deletions(-)
diff --git a/cherrypy/_cperror.py b/cherrypy/_cperror.py
index 4e727682..ebf1dcf6 100644
--- a/cherrypy/_cperror.py
+++ b/cherrypy/_cperror.py
@@ -532,7 +532,8 @@ def get_error_page(status, **kwargs):
return result
else:
# Load the template from this path.
- template = io.open(error_page, newline='').read()
+ with io.open(error_page, newline='') as f:
+ template = f.read()
except Exception:
e = _format_exception(*_exc_info())[-1]
m = kwargs['message']
diff --git a/cherrypy/_cpmodpy.py b/cherrypy/_cpmodpy.py
index 0e608c48..a08f0ed9 100644
--- a/cherrypy/_cpmodpy.py
+++ b/cherrypy/_cpmodpy.py
@@ -339,11 +339,8 @@ LoadModule python_module modules/mod_python.so
}
mpconf = os.path.join(os.path.dirname(__file__), 'cpmodpy.conf')
- f = open(mpconf, 'wb')
- try:
+ with open(mpconf, 'wb') as f:
f.write(conf_data)
- finally:
- f.close()
response = read_process(self.apache_path, '-k start -f %s' % mpconf)
self.ready = True
diff --git a/cherrypy/lib/auth_digest.py b/cherrypy/lib/auth_digest.py
index fbb5df64..981e9a5d 100644
--- a/cherrypy/lib/auth_digest.py
+++ b/cherrypy/lib/auth_digest.py
@@ -101,13 +101,12 @@ def get_ha1_file_htdigest(filename):
"""
def get_ha1(realm, username):
result = None
- f = open(filename, 'r')
- for line in f:
- u, r, ha1 = line.rstrip().split(':')
- if u == username and r == realm:
- result = ha1
- break
- f.close()
+ with open(filename, 'r') as f:
+ for line in f:
+ u, r, ha1 = line.rstrip().split(':')
+ if u == username and r == realm:
+ result = ha1
+ break
return result
return get_ha1
diff --git a/cherrypy/lib/covercp.py b/cherrypy/lib/covercp.py
index 3e219713..005fafa5 100644
--- a/cherrypy/lib/covercp.py
+++ b/cherrypy/lib/covercp.py
@@ -334,26 +334,26 @@ class CoverStats(object):
yield '</body></html>'
def annotated_file(self, filename, statements, excluded, missing):
- source = open(filename, 'r')
- buffer = []
- for lineno, line in enumerate(source.readlines()):
- lineno += 1
- line = line.strip('\n\r')
- empty_the_buffer = True
- if lineno in excluded:
- template = TEMPLATE_LOC_EXCLUDED
- elif lineno in missing:
- template = TEMPLATE_LOC_NOT_COVERED
- elif lineno in statements:
- template = TEMPLATE_LOC_COVERED
- else:
- empty_the_buffer = False
- buffer.append((lineno, line))
- if empty_the_buffer:
- for lno, pastline in buffer:
- yield template % (lno, cgi.escape(pastline))
- buffer = []
- yield template % (lineno, cgi.escape(line))
+ with open(filename, 'r') as source:
+ buffer = []
+ for lineno, line in enumerate(source.readlines()):
+ lineno += 1
+ line = line.strip('\n\r')
+ empty_the_buffer = True
+ if lineno in excluded:
+ template = TEMPLATE_LOC_EXCLUDED
+ elif lineno in missing:
+ template = TEMPLATE_LOC_NOT_COVERED
+ elif lineno in statements:
+ template = TEMPLATE_LOC_COVERED
+ else:
+ empty_the_buffer = False
+ buffer.append((lineno, line))
+ if empty_the_buffer:
+ for lno, pastline in buffer:
+ yield template % (lno, cgi.escape(pastline))
+ buffer = []
+ yield template % (lineno, cgi.escape(line))
@cherrypy.expose
def report(self, name):
diff --git a/cherrypy/lib/reprconf.py b/cherrypy/lib/reprconf.py
index 3976652e..76381d7b 100644
--- a/cherrypy/lib/reprconf.py
+++ b/cherrypy/lib/reprconf.py
@@ -163,11 +163,8 @@ class Parser(configparser.ConfigParser):
# fp = open(filename)
# except IOError:
# continue
- fp = open(filename)
- try:
+ with open(filename) as fp:
self._read(fp, filename)
- finally:
- fp.close()
def as_dict(self, raw=False, vars=None):
"""Convert an INI file to a dictionary"""
diff --git a/cherrypy/lib/sessions.py b/cherrypy/lib/sessions.py
index 5b3328f2..0f56a4fa 100644
--- a/cherrypy/lib/sessions.py
+++ b/cherrypy/lib/sessions.py
@@ -516,11 +516,8 @@ class FileSession(Session):
if path is None:
path = self._get_file_path()
try:
- f = open(path, 'rb')
- try:
+ with open(path, 'rb') as f:
return pickle.load(f)
- finally:
- f.close()
except (IOError, EOFError):
e = sys.exc_info()[1]
if self.debug:
@@ -531,11 +528,8 @@ class FileSession(Session):
def _save(self, expiration_time):
assert self.locked, ('The session was saved without being locked. '
"Check your tools' priority levels.")
- f = open(self._get_file_path(), 'wb')
- try:
+ with open(self._get_file_path(), 'wb') as f:
pickle.dump((self._data, expiration_time), f, self.pickle_protocol)
- finally:
- f.close()
def _delete(self):
assert self.locked, ('The session deletion without being locked. '
diff --git a/cherrypy/process/plugins.py b/cherrypy/process/plugins.py
index 2a9952de..e96fb1ce 100644
--- a/cherrypy/process/plugins.py
+++ b/cherrypy/process/plugins.py
@@ -436,7 +436,8 @@ class PIDFile(SimplePlugin):
if self.finalized:
self.bus.log('PID %r already written to %r.' % (pid, self.pidfile))
else:
- open(self.pidfile, 'wb').write(ntob('%s\n' % pid, 'utf8'))
+ with open(self.pidfile, 'wb') as f:
+ f.write(ntob('%s\n' % pid, 'utf8'))
self.bus.log('PID %r written to %r.' % (pid, self.pidfile))
self.finalized = True
start.priority = 70
diff --git a/cherrypy/test/helper.py b/cherrypy/test/helper.py
index c1ca4535..cae49533 100644
--- a/cherrypy/test/helper.py
+++ b/cherrypy/test/helper.py
@@ -505,7 +505,8 @@ server.ssl_private_key: r'%s'
def get_pid(self):
if self.daemonize:
- return int(open(self.pid_file, 'rb').read())
+ with open(self.pid_file, 'rb') as f:
+ return int(f.read())
return self._proc.pid
def join(self):
diff --git a/cherrypy/test/logtest.py b/cherrypy/test/logtest.py
index 344be987..112bdc25 100644
--- a/cherrypy/test/logtest.py
+++ b/cherrypy/test/logtest.py
@@ -97,7 +97,8 @@ class LogCase(object):
def emptyLog(self):
"""Overwrite self.logfile with 0 bytes."""
- open(self.logfile, 'wb').write('')
+ with open(self.logfile, 'wb') as f:
+ f.write('')
def markLog(self, key=None):
"""Insert a marker line into the log and set self.lastmarker."""
@@ -105,10 +106,11 @@ class LogCase(object):
key = str(time.time())
self.lastmarker = key
- open(self.logfile, 'ab+').write(
- b'%s%s\n'
- % (self.markerPrefix, key.encode('utf-8'))
- )
+ with open(self.logfile, 'ab+') as f:
+ f.write(
+ b'%s%s\n'
+ % (self.markerPrefix, key.encode('utf-8'))
+ )
def _read_marked_region(self, marker=None):
"""Return lines from self.logfile in the marked region.
@@ -122,20 +124,23 @@ class LogCase(object):
logfile = self.logfile
marker = marker or self.lastmarker
if marker is None:
- return open(logfile, 'rb').readlines()
+ with open(logfile, 'rb') as f:
+ return f.readlines()
if isinstance(marker, str):
marker = marker.encode('utf-8')
data = []
in_region = False
- for line in open(logfile, 'rb'):
- if in_region:
- if line.startswith(self.markerPrefix) and marker not in line:
- break
- else:
- data.append(line)
- elif marker in line:
- in_region = True
+ with open(logfile, 'rb') as f:
+ for line in f:
+ if in_region:
+ if (line.startswith(self.markerPrefix)
+ and marker not in line):
+ break
+ else:
+ data.append(line)
+ elif marker in line:
+ in_region = True
return data
def assertInLog(self, line, marker=None):
diff --git a/cherrypy/test/modfastcgi.py b/cherrypy/test/modfastcgi.py
index 79ec3d18..0c6d01e2 100644
--- a/cherrypy/test/modfastcgi.py
+++ b/cherrypy/test/modfastcgi.py
@@ -112,15 +112,12 @@ class ModFCGISupervisor(helper.LocalWSGISupervisor):
fcgiconf = os.path.join(curdir, fcgiconf)
# Write the Apache conf file.
- f = open(fcgiconf, 'wb')
- try:
+ with open(fcgiconf, 'wb') as f:
server = repr(os.path.join(curdir, 'fastcgi.pyc'))[1:-1]
output = self.template % {'port': self.port, 'root': curdir,
'server': server}
output = output.replace('\r\n', '\n')
f.write(output)
- finally:
- f.close()
result = read_process(APACHE_PATH, '-k start -f %s' % fcgiconf)
if result:
diff --git a/cherrypy/test/modfcgid.py b/cherrypy/test/modfcgid.py
index d101bd67..ea373004 100644
--- a/cherrypy/test/modfcgid.py
+++ b/cherrypy/test/modfcgid.py
@@ -101,15 +101,12 @@ class ModFCGISupervisor(helper.LocalSupervisor):
fcgiconf = os.path.join(curdir, fcgiconf)
# Write the Apache conf file.
- f = open(fcgiconf, 'wb')
- try:
+ with open(fcgiconf, 'wb') as f:
server = repr(os.path.join(curdir, 'fastcgi.pyc'))[1:-1]
output = self.template % {'port': self.port, 'root': curdir,
'server': server}
output = ntob(output.replace('\r\n', '\n'))
f.write(output)
- finally:
- f.close()
result = read_process(APACHE_PATH, '-k start -f %s' % fcgiconf)
if result:
diff --git a/cherrypy/test/modpy.py b/cherrypy/test/modpy.py
index 7c288d2c..024453e9 100644
--- a/cherrypy/test/modpy.py
+++ b/cherrypy/test/modpy.py
@@ -107,13 +107,10 @@ class ModPythonSupervisor(helper.Supervisor):
if not os.path.isabs(mpconf):
mpconf = os.path.join(curdir, mpconf)
- f = open(mpconf, 'wb')
- try:
+ with open(mpconf, 'wb') as f:
f.write(self.template %
{'port': self.port, 'modulename': modulename,
'host': self.host})
- finally:
- f.close()
result = read_process(APACHE_PATH, '-k start -f %s' % mpconf)
if result:
diff --git a/cherrypy/test/modwsgi.py b/cherrypy/test/modwsgi.py
index da7d240b..24c72684 100644
--- a/cherrypy/test/modwsgi.py
+++ b/cherrypy/test/modwsgi.py
@@ -109,14 +109,11 @@ class ModWSGISupervisor(helper.Supervisor):
if not os.path.isabs(mpconf):
mpconf = os.path.join(curdir, mpconf)
- f = open(mpconf, 'wb')
- try:
+ with open(mpconf, 'wb') as f:
output = (self.template %
{'port': self.port, 'testmod': modulename,
'curdir': curdir})
f.write(output)
- finally:
- f.close()
result = read_process(APACHE_PATH, '-k start -f %s' % mpconf)
if result:
diff --git a/cherrypy/test/test_core.py b/cherrypy/test/test_core.py
index 6fde3a97..42460b3f 100644
--- a/cherrypy/test/test_core.py
+++ b/cherrypy/test/test_core.py
@@ -586,9 +586,8 @@ class CoreRequestHandlingTest(helper.CPWebCase):
def testFavicon(self):
# favicon.ico is served by staticfile.
icofilename = os.path.join(localDir, '../favicon.ico')
- icofile = open(icofilename, 'rb')
- data = icofile.read()
- icofile.close()
+ with open(icofilename, 'rb') as icofile:
+ data = icofile.read()
self.getPage('/favicon.ico')
self.assertBody(data)
diff --git a/cherrypy/test/test_states.py b/cherrypy/test/test_states.py
index 28dd6510..d59a4d87 100644
--- a/cherrypy/test/test_states.py
+++ b/cherrypy/test/test_states.py
@@ -424,11 +424,12 @@ test_case_name: "test_signal_handler_unsubscribe"
p.join()
# Assert the old handler ran.
- log_lines = list(open(p.error_log, 'rb'))
- assert any(
- line.endswith(b'I am an old SIGTERM handler.\n')
- for line in log_lines
- )
+ with open(p.error_log, 'rb') as f:
+ log_lines = list(f)
+ assert any(
+ line.endswith(b'I am an old SIGTERM handler.\n')
+ for line in log_lines
+ )
def test_safe_wait_INADDR_ANY(): # pylint: disable=invalid-name
--
2.35.1

View File

@@ -1,32 +0,0 @@
From 8245a74aa4e090c40445535a9ce3997ed9904798 Mon Sep 17 00:00:00 2001
From: Dominic Davis-Foster <dominic@davis-foster.co.uk>
Date: Fri, 28 Jan 2022 23:11:52 +0000
Subject: [PATCH] Switch from inspect.getargspec to inspect.getfullargspec
inspect.getargspec has been deprecated since 3.0
---
cherrypy/_cpdispatch.py | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/cherrypy/_cpdispatch.py b/cherrypy/_cpdispatch.py
index 83eb79cb..5c506e99 100644
--- a/cherrypy/_cpdispatch.py
+++ b/cherrypy/_cpdispatch.py
@@ -206,12 +206,8 @@ except ImportError:
def test_callable_spec(callable, args, kwargs): # noqa: F811
return None
else:
- getargspec = inspect.getargspec
- # Python 3 requires using getfullargspec if
- # keyword-only arguments are present
- if hasattr(inspect, 'getfullargspec'):
- def getargspec(callable):
- return inspect.getfullargspec(callable)[:4]
+ def getargspec(callable):
+ return inspect.getfullargspec(callable)[:4]
class LateParamPageHandler(PageHandler):
--
2.35.1