diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 37f0d86cd..ada617419 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -20,6 +20,7 @@ jobs: - "3.10" - "3.11" - "3.12" + - "3.13-dev" - "pypy-3.8" os: - "ubuntu-20.04" diff --git a/setup.py b/setup.py index 08e44d2fa..4ab7c4fda 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,7 @@ def readfile(name): tests_require = [ 'webtest >= 1.3.1', # py3 compat 'zope.component >= 4.0', # py3 compat + 'legacy-cgi;python_version>="3.13"', # needed by webob, Pylons/webob#437 ] docs_extras = [ diff --git a/src/pyramid/util.py b/src/pyramid/util.py index c71528a49..3fe72bf6f 100644 --- a/src/pyramid/util.py +++ b/src/pyramid/util.py @@ -110,7 +110,8 @@ def make_property(cls, callable, name=None, reify=False): if name is None: if not hasattr(callable, '__name__'): raise ValueError( - 'missing __name__, must specify "name" for property' + 'missing __name__, must specify "name" for property ' + 'on Python < 3.13' ) name = callable.__name__ name = get_callable_name(name) diff --git a/tests/test_util.py b/tests/test_util.py index bf4c08988..ae313844e 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -67,13 +67,21 @@ def worker(obj): def test_property_without_name(self): def worker(obj): # pragma: no cover - pass + return obj.bar foo = Dummy() helper = self._getTargetClass() - self.assertRaises( - ValueError, helper.set_property, foo, property(worker) - ) + if sys.version_info < (3, 13): + self.assertRaises( + ValueError, helper.set_property, foo, property(worker) + ) + else: + # Since Python 3.13, the name of the property is automatic + helper.set_property(foo, property(worker)) + foo.bar = 1 + self.assertEqual(1, foo.worker) + foo.bar = 2 + self.assertEqual(2, foo.worker) def test_property_with_name(self): def worker(obj): @@ -272,10 +280,18 @@ def worker(obj): def test_property_without_name(self): def worker(obj): # pragma: no cover - pass + return obj.bar foo = self._makeOne() - self.assertRaises(ValueError, foo.set_property, property(worker)) + if sys.version_info < (3, 13): + self.assertRaises(ValueError, foo.set_property, property(worker)) + else: + # Since Python 3.13, the name of the property is automatic + foo.set_property(property(worker)) + foo.bar = 1 + self.assertEqual(1, foo.worker) + foo.bar = 2 + self.assertEqual(2, foo.worker) def test_property_with_name(self): def worker(obj): diff --git a/tox.ini b/tox.ini index ff962a935..832eaefa4 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = lint, - py38,py39,py310,py311,py312,pypy3, + py38,py39,py310,py311,py312,py313,pypy3, py312-cover,coverage, docs