PYTHON-5049 Drop support for PyPy 3.9 (#2070)

This commit is contained in:
Steven Silvester 2025-01-21 12:38:02 -06:00 committed by GitHub
parent 85877a0802
commit 2ff2fde911
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 29 additions and 99 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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.

View File

@ -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?
--------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------

View File

@ -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
..................... .....................

View File

@ -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?
----------------------------------------------------- -----------------------------------------------------

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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]

View File

@ -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: