PYTHON-5049 Drop support for PyPy 3.9 (#2070)
This commit is contained in:
parent
85877a0802
commit
2ff2fde911
@ -256,15 +256,15 @@ buildvariants:
|
|||||||
expansions:
|
expansions:
|
||||||
COMPRESSORS: zstd
|
COMPRESSORS: zstd
|
||||||
PYTHON_BINARY: /opt/python/3.9/bin/python3
|
PYTHON_BINARY: /opt/python/3.9/bin/python3
|
||||||
- name: compression-snappy-rhel8-pypy3.9
|
- name: compression-snappy-rhel8-pypy3.10
|
||||||
tasks:
|
tasks:
|
||||||
- name: .standalone .noauth .nossl .sync_async
|
- name: .standalone .noauth .nossl .sync_async
|
||||||
display_name: Compression snappy RHEL8 PyPy3.9
|
display_name: Compression snappy RHEL8 PyPy3.10
|
||||||
run_on:
|
run_on:
|
||||||
- rhel87-small
|
- rhel87-small
|
||||||
expansions:
|
expansions:
|
||||||
COMPRESSORS: snappy
|
COMPRESSORS: snappy
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
||||||
- name: compression-zlib-rhel8-pypy3.10
|
- name: compression-zlib-rhel8-pypy3.10
|
||||||
tasks:
|
tasks:
|
||||||
- name: .standalone .noauth .nossl .sync_async
|
- name: .standalone .noauth .nossl .sync_async
|
||||||
@ -274,15 +274,15 @@ buildvariants:
|
|||||||
expansions:
|
expansions:
|
||||||
COMPRESSORS: zlib
|
COMPRESSORS: zlib
|
||||||
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
||||||
- name: compression-zstd-rhel8-pypy3.9
|
- name: compression-zstd-rhel8-pypy3.10
|
||||||
tasks:
|
tasks:
|
||||||
- name: .standalone .noauth .nossl .sync_async !.4.0
|
- name: .standalone .noauth .nossl .sync_async !.4.0
|
||||||
display_name: Compression zstd RHEL8 PyPy3.9
|
display_name: Compression zstd RHEL8 PyPy3.10
|
||||||
run_on:
|
run_on:
|
||||||
- rhel87-small
|
- rhel87-small
|
||||||
expansions:
|
expansions:
|
||||||
COMPRESSORS: zstd
|
COMPRESSORS: zstd
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
||||||
|
|
||||||
# Disable test commands tests
|
# Disable test commands tests
|
||||||
- name: disable-test-commands-rhel8-python3.9
|
- name: disable-test-commands-rhel8-python3.9
|
||||||
@ -460,15 +460,6 @@ buildvariants:
|
|||||||
test_encryption: "true"
|
test_encryption: "true"
|
||||||
test_encryption_pyopenssl: "true"
|
test_encryption_pyopenssl: "true"
|
||||||
PYTHON_BINARY: /opt/python/3.12/bin/python3
|
PYTHON_BINARY: /opt/python/3.12/bin/python3
|
||||||
- name: encryption-rhel8-pypy3.9
|
|
||||||
tasks:
|
|
||||||
- name: .sharded_cluster .auth .ssl .sync_async
|
|
||||||
display_name: Encryption RHEL8 PyPy3.9
|
|
||||||
run_on:
|
|
||||||
- rhel87-small
|
|
||||||
expansions:
|
|
||||||
test_encryption: "true"
|
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
|
||||||
- name: encryption-macos-python3.9
|
- name: encryption-macos-python3.9
|
||||||
tasks:
|
tasks:
|
||||||
- name: .latest .replica_set .sync_async
|
- name: .latest .replica_set .sync_async
|
||||||
@ -608,15 +599,6 @@ buildvariants:
|
|||||||
expansions:
|
expansions:
|
||||||
AUTH: auth
|
AUTH: auth
|
||||||
PYTHON_BINARY: C:/python/Python313/python.exe
|
PYTHON_BINARY: C:/python/Python313/python.exe
|
||||||
- name: auth-enterprise-rhel8-pypy3.9-auth
|
|
||||||
tasks:
|
|
||||||
- name: test-enterprise-auth
|
|
||||||
display_name: Auth Enterprise RHEL8 PyPy3.9 Auth
|
|
||||||
run_on:
|
|
||||||
- rhel87-small
|
|
||||||
expansions:
|
|
||||||
AUTH: auth
|
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
|
||||||
- name: auth-enterprise-rhel8-pypy3.10-auth
|
- name: auth-enterprise-rhel8-pypy3.10-auth
|
||||||
tasks:
|
tasks:
|
||||||
- name: test-enterprise-auth
|
- name: test-enterprise-auth
|
||||||
@ -900,10 +882,10 @@ buildvariants:
|
|||||||
TOPOLOGY: server
|
TOPOLOGY: server
|
||||||
VERSION: "8.0"
|
VERSION: "8.0"
|
||||||
PYTHON_BINARY: /opt/python/3.13/bin/python3
|
PYTHON_BINARY: /opt/python/3.13/bin/python3
|
||||||
- name: ocsp-rhel8-rapid-pypy3.9
|
- name: ocsp-rhel8-rapid-pypy3.10
|
||||||
tasks:
|
tasks:
|
||||||
- name: .ocsp
|
- name: .ocsp
|
||||||
display_name: OCSP RHEL8 rapid PyPy3.9
|
display_name: OCSP RHEL8 rapid PyPy3.10
|
||||||
run_on:
|
run_on:
|
||||||
- rhel87-small
|
- rhel87-small
|
||||||
batchtime: 20160
|
batchtime: 20160
|
||||||
@ -912,11 +894,11 @@ buildvariants:
|
|||||||
SSL: ssl
|
SSL: ssl
|
||||||
TOPOLOGY: server
|
TOPOLOGY: server
|
||||||
VERSION: rapid
|
VERSION: rapid
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
||||||
- name: ocsp-rhel8-latest-pypy3.10
|
- name: ocsp-rhel8-latest-python3.9
|
||||||
tasks:
|
tasks:
|
||||||
- name: .ocsp
|
- name: .ocsp
|
||||||
display_name: OCSP RHEL8 latest PyPy3.10
|
display_name: OCSP RHEL8 latest Python3.9
|
||||||
run_on:
|
run_on:
|
||||||
- rhel87-small
|
- rhel87-small
|
||||||
batchtime: 20160
|
batchtime: 20160
|
||||||
@ -925,7 +907,7 @@ buildvariants:
|
|||||||
SSL: ssl
|
SSL: ssl
|
||||||
TOPOLOGY: server
|
TOPOLOGY: server
|
||||||
VERSION: latest
|
VERSION: latest
|
||||||
PYTHON_BINARY: /opt/python/pypy3.10/bin/python3
|
PYTHON_BINARY: /opt/python/3.9/bin/python3
|
||||||
- name: ocsp-win64-v4.4-python3.9
|
- name: ocsp-win64-v4.4-python3.9
|
||||||
tasks:
|
tasks:
|
||||||
- name: .ocsp-rsa !.ocsp-staple
|
- name: .ocsp-rsa !.ocsp-staple
|
||||||
@ -1061,17 +1043,6 @@ buildvariants:
|
|||||||
expansions:
|
expansions:
|
||||||
test_pyopenssl: "true"
|
test_pyopenssl: "true"
|
||||||
PYTHON_BINARY: C:/python/Python313/python.exe
|
PYTHON_BINARY: C:/python/Python313/python.exe
|
||||||
- name: pyopenssl-rhel8-pypy3.9
|
|
||||||
tasks:
|
|
||||||
- name: .replica_set .auth .ssl .sync_async
|
|
||||||
- name: .7.0 .auth .ssl .sync_async
|
|
||||||
display_name: PyOpenSSL RHEL8 PyPy3.9
|
|
||||||
run_on:
|
|
||||||
- rhel87-small
|
|
||||||
batchtime: 10080
|
|
||||||
expansions:
|
|
||||||
test_pyopenssl: "true"
|
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
|
||||||
- name: pyopenssl-rhel8-pypy3.10
|
- name: pyopenssl-rhel8-pypy3.10
|
||||||
tasks:
|
tasks:
|
||||||
- name: .replica_set .auth .ssl .sync_async
|
- name: .replica_set .auth .ssl .sync_async
|
||||||
@ -1164,17 +1135,6 @@ buildvariants:
|
|||||||
expansions:
|
expansions:
|
||||||
COVERAGE: coverage
|
COVERAGE: coverage
|
||||||
PYTHON_BINARY: /opt/python/3.12/bin/python3
|
PYTHON_BINARY: /opt/python/3.12/bin/python3
|
||||||
- name: test-rhel8-pypy3.9
|
|
||||||
tasks:
|
|
||||||
- name: .sharded_cluster .auth .ssl .sync_async
|
|
||||||
- name: .replica_set .noauth .ssl .sync_async
|
|
||||||
- name: .standalone .noauth .nossl .sync_async
|
|
||||||
display_name: "* Test RHEL8 PyPy3.9"
|
|
||||||
run_on:
|
|
||||||
- rhel87-small
|
|
||||||
expansions:
|
|
||||||
COVERAGE: coverage
|
|
||||||
PYTHON_BINARY: /opt/python/pypy3.9/bin/python3
|
|
||||||
- name: test-macos-python3.9
|
- name: test-macos-python3.9
|
||||||
tasks:
|
tasks:
|
||||||
- name: .sharded_cluster .auth .ssl !.sync_async
|
- name: .sharded_cluster .auth .ssl !.sync_async
|
||||||
|
|||||||
@ -28,7 +28,7 @@ from shrub.v3.shrub_service import ShrubService
|
|||||||
|
|
||||||
ALL_VERSIONS = ["4.0", "4.4", "5.0", "6.0", "7.0", "8.0", "rapid", "latest"]
|
ALL_VERSIONS = ["4.0", "4.4", "5.0", "6.0", "7.0", "8.0", "rapid", "latest"]
|
||||||
CPYTHONS = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
CPYTHONS = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||||
PYPYS = ["pypy3.9", "pypy3.10"]
|
PYPYS = ["pypy3.10"]
|
||||||
ALL_PYTHONS = CPYTHONS + PYPYS
|
ALL_PYTHONS = CPYTHONS + PYPYS
|
||||||
MIN_MAX_PYTHON = [CPYTHONS[0], CPYTHONS[-1]]
|
MIN_MAX_PYTHON = [CPYTHONS[0], CPYTHONS[-1]]
|
||||||
BATCHTIME_WEEK = 10080
|
BATCHTIME_WEEK = 10080
|
||||||
|
|||||||
2
.github/workflows/test-python.yml
vendored
2
.github/workflows/test-python.yml
vendored
@ -55,7 +55,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-20.04]
|
os: [ubuntu-20.04]
|
||||||
python-version: ["3.9", "pypy-3.9", "3.13", "3.13t"]
|
python-version: ["3.9", "pypy-3.10", "3.13", "3.13t"]
|
||||||
name: CPython ${{ matrix.python-version }}-${{ matrix.os }}
|
name: CPython ${{ matrix.python-version }}-${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
@ -90,7 +90,7 @@ package that is incompatible with PyMongo.
|
|||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
PyMongo supports CPython 3.9+ and PyPy3.9+.
|
PyMongo supports CPython 3.9+ and PyPy3.10+.
|
||||||
|
|
||||||
Required dependencies:
|
Required dependencies:
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ Changelog
|
|||||||
Changes in Version 4.11.0 (YYYY/MM/DD)
|
Changes in Version 4.11.0 (YYYY/MM/DD)
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
.. warning:: PyMongo 4.11 drops support for Python 3.8: Python 3.9+ or PyPy 3.9+ is now required.
|
.. warning:: PyMongo 4.11 drops support for Python 3.8 and PyPy 3.9: Python 3.9+ or PyPy 3.10+ is now required.
|
||||||
.. warning:: PyMongo 4.11 drops support for MongoDB 3.6. PyMongo now supports MongoDB 4.0+.
|
.. warning:: PyMongo 4.11 drops support for MongoDB 3.6. PyMongo now supports MongoDB 4.0+.
|
||||||
Driver support for MongoDB 3.6 reached end of life in April 2024.
|
Driver support for MongoDB 3.6 reached end of life in April 2024.
|
||||||
.. warning:: Driver support for MongoDB 4.0 reaches end of life in April 2025.
|
.. warning:: Driver support for MongoDB 4.0 reaches end of life in April 2025.
|
||||||
@ -14,7 +14,7 @@ Changes in Version 4.11.0 (YYYY/MM/DD)
|
|||||||
|
|
||||||
PyMongo 4.11 brings a number of changes including:
|
PyMongo 4.11 brings a number of changes including:
|
||||||
|
|
||||||
- Dropped support for Python 3.8.
|
- Dropped support for Python 3.8 and PyPy 3.9.
|
||||||
- Dropped support for MongoDB 3.6.
|
- Dropped support for MongoDB 3.6.
|
||||||
- Dropped support for the MONGODB-CR authenticate mechanism, which is no longer supported by MongoDB 4.0+.
|
- Dropped support for the MONGODB-CR authenticate mechanism, which is no longer supported by MongoDB 4.0+.
|
||||||
- pymongocrypt>=1.12 is now required for :ref:`In-Use Encryption` support.
|
- pymongocrypt>=1.12 is now required for :ref:`In-Use Encryption` support.
|
||||||
|
|||||||
@ -166,7 +166,7 @@ they are returned to the pool.
|
|||||||
Does PyMongo support Python 3?
|
Does PyMongo support Python 3?
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
PyMongo supports CPython 3.9+ and PyPy3.9+. See the :doc:`python3` for details.
|
PyMongo supports CPython 3.9+ and PyPy3.10+. See the :doc:`python3` for details.
|
||||||
|
|
||||||
Does PyMongo support asynchronous frameworks like Gevent, asyncio, Tornado, or Twisted?
|
Does PyMongo support asynchronous frameworks like Gevent, asyncio, Tornado, or Twisted?
|
||||||
---------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -28,7 +28,7 @@ To upgrade using pip::
|
|||||||
Dependencies
|
Dependencies
|
||||||
------------
|
------------
|
||||||
|
|
||||||
PyMongo supports CPython 3.9+ and PyPy3.9+.
|
PyMongo supports CPython 3.9+ and PyPy3.10+.
|
||||||
|
|
||||||
Required dependencies
|
Required dependencies
|
||||||
.....................
|
.....................
|
||||||
|
|||||||
@ -4,7 +4,7 @@ Python 3 FAQ
|
|||||||
What Python 3 versions are supported?
|
What Python 3 versions are supported?
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
PyMongo supports CPython 3.9+ and PyPy3.9+.
|
PyMongo supports CPython 3.9+ and PyPy3.10+.
|
||||||
|
|
||||||
Are there any PyMongo behavior changes with Python 3?
|
Are there any PyMongo behavior changes with Python 3?
|
||||||
-----------------------------------------------------
|
-----------------------------------------------------
|
||||||
|
|||||||
@ -237,10 +237,7 @@ class AsyncClientUnitTest(AsyncUnitTest):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
client = self.client
|
client = self.client
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'AsyncMongoClient' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
msg = "'AsyncMongoClient' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in client: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in client: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -133,13 +133,7 @@ class TestCollectionNoConnect(AsyncUnitTest):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
coll = self.db.coll
|
coll = self.db.coll
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'AsyncCollection' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
if _IS_SYNC:
|
|
||||||
msg = "'Collection' object is not iterable"
|
|
||||||
else:
|
|
||||||
msg = "'AsyncCollection' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in coll: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in coll: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -103,10 +103,7 @@ class TestDatabaseNoConnect(unittest.TestCase):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
db = self.client.pymongo_test
|
db = self.client.pymongo_test
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'AsyncDatabase' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
msg = "'AsyncDatabase' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in db: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in db: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -234,10 +234,7 @@ class ClientUnitTest(UnitTest):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
client = self.client
|
client = self.client
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'MongoClient' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
msg = "'MongoClient' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in client: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in client: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -133,13 +133,7 @@ class TestCollectionNoConnect(UnitTest):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
coll = self.db.coll
|
coll = self.db.coll
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'Collection' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
if _IS_SYNC:
|
|
||||||
msg = "'Collection' object is not iterable"
|
|
||||||
else:
|
|
||||||
msg = "'Collection' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in coll: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in coll: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -102,10 +102,7 @@ class TestDatabaseNoConnect(unittest.TestCase):
|
|||||||
|
|
||||||
def test_iteration(self):
|
def test_iteration(self):
|
||||||
db = self.client.pymongo_test
|
db = self.client.pymongo_test
|
||||||
if "PyPy" in sys.version and sys.version_info < (3, 8, 15):
|
msg = "'Database' object is not iterable"
|
||||||
msg = "'NoneType' object is not callable"
|
|
||||||
else:
|
|
||||||
msg = "'Database' object is not iterable"
|
|
||||||
# Iteration fails
|
# Iteration fails
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
for _ in db: # type: ignore[misc] # error: "None" not callable [misc]
|
for _ in db: # type: ignore[misc] # error: "None" not callable [misc]
|
||||||
|
|||||||
@ -47,15 +47,9 @@ class TestErrors(PyMongoTestCase):
|
|||||||
self.assertIn("full error", traceback.format_exc())
|
self.assertIn("full error", traceback.format_exc())
|
||||||
|
|
||||||
def _test_unicode_strs(self, exc):
|
def _test_unicode_strs(self, exc):
|
||||||
if sys.implementation.name == "pypy" and sys.implementation.version < (7, 3, 7):
|
self.assertEqual(
|
||||||
# PyPy used to display unicode in repr differently.
|
"unicode \U0001f40d, full error: {'errmsg': 'unicode \U0001f40d'}", str(exc)
|
||||||
self.assertEqual(
|
)
|
||||||
"unicode \U0001f40d, full error: {'errmsg': 'unicode \\U0001f40d'}", str(exc)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.assertEqual(
|
|
||||||
"unicode \U0001f40d, full error: {'errmsg': 'unicode \U0001f40d'}", str(exc)
|
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
raise exc
|
raise exc
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user