From dcd419cd050db18e2d2eae2a9fcd35ad443c6da9 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Mon, 14 Apr 2025 12:14:05 -0400 Subject: [PATCH 1/4] PYTHON-5310 - Fix uri_parser AttributeError when used directly --- doc/changelog.rst | 1 + pymongo/__init__.py | 1 + test/test_default_exports.py | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index e82804565f..597f75f873 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -9,6 +9,7 @@ Version 4.12.1 is a bug fix release. - Fixed a bug that could raise ``UnboundLocalError`` when creating asynchronous connections over SSL. - Fixed a bug causing SRV hostname validation to fail when resolver and resolved hostnames are identical with three domain levels. +- Fixed a bug that caused direct use of ``pymongo.uri_parser`` to raise an ``AttributeError``. Issues Resolved ............... diff --git a/pymongo/__init__.py b/pymongo/__init__.py index e392508912..a98db9c6bd 100644 --- a/pymongo/__init__.py +++ b/pymongo/__init__.py @@ -103,6 +103,7 @@ from pymongo.read_preferences import ReadPreference from pymongo.synchronous.collection import ReturnDocument from pymongo.synchronous.mongo_client import MongoClient +from pymongo.uri_parser import * # noqa: F403 from pymongo.write_concern import WriteConcern version = __version__ diff --git a/test/test_default_exports.py b/test/test_default_exports.py index d9301d2223..30d7024167 100644 --- a/test/test_default_exports.py +++ b/test/test_default_exports.py @@ -209,6 +209,11 @@ def test_pymongo_imports(self): ) from pymongo.write_concern import WriteConcern, validate_boolean + def test_pymongo_submodule_attributes(self): + import pymongo + + self.assertTrue(hasattr(pymongo, "uri_parser")) + def test_gridfs_imports(self): import gridfs from gridfs.errors import CorruptGridFile, FileExists, GridFSError, NoFile From fa291147368a5fd2e58b84981d285b586f6d9468 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Mon, 14 Apr 2025 14:04:25 -0400 Subject: [PATCH 2/4] Fix __all__ --- pymongo/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymongo/__init__.py b/pymongo/__init__.py index a98db9c6bd..9f2784dd96 100644 --- a/pymongo/__init__.py +++ b/pymongo/__init__.py @@ -45,6 +45,7 @@ "WriteConcern", "has_c", "timeout", + "uri_parser", ] ASCENDING = 1 @@ -103,7 +104,6 @@ from pymongo.read_preferences import ReadPreference from pymongo.synchronous.collection import ReturnDocument from pymongo.synchronous.mongo_client import MongoClient -from pymongo.uri_parser import * # noqa: F403 from pymongo.write_concern import WriteConcern version = __version__ From b306d6cf955eafe97bf36b67057ce62081b6ee80 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Mon, 14 Apr 2025 15:30:03 -0400 Subject: [PATCH 3/4] Update tests --- test/test_default_exports.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_default_exports.py b/test/test_default_exports.py index 30d7024167..bd7672f812 100644 --- a/test/test_default_exports.py +++ b/test/test_default_exports.py @@ -34,7 +34,7 @@ "ConfigurationError", "WriteConcern", ] -PYMONGO_IGNORE = [] +PYMONGO_IGNORE = ["uri_parser"] GLOBAL_INGORE = ["TYPE_CHECKING", "annotations"] @@ -213,6 +213,8 @@ def test_pymongo_submodule_attributes(self): import pymongo self.assertTrue(hasattr(pymongo, "uri_parser")) + self.assertTrue(pymongo.uri_parser) + self.assertTrue(pymongo.uri_parser.parse_uri) def test_gridfs_imports(self): import gridfs From 3dbbeab7f3550891eb77ff5824e952e34ab049db Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Mon, 14 Apr 2025 16:14:38 -0400 Subject: [PATCH 4/4] Fix --- pymongo/__init__.py | 4 +++- test/test_default_exports.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pymongo/__init__.py b/pymongo/__init__.py index 9f2784dd96..9a35750811 100644 --- a/pymongo/__init__.py +++ b/pymongo/__init__.py @@ -45,7 +45,6 @@ "WriteConcern", "has_c", "timeout", - "uri_parser", ] ASCENDING = 1 @@ -106,6 +105,9 @@ from pymongo.synchronous.mongo_client import MongoClient from pymongo.write_concern import WriteConcern +# Public module compatibility imports +import pymongo.uri_parser # noqa: F401 # isort: skip + version = __version__ """Current version of PyMongo.""" diff --git a/test/test_default_exports.py b/test/test_default_exports.py index bd7672f812..5f3e749d36 100644 --- a/test/test_default_exports.py +++ b/test/test_default_exports.py @@ -34,7 +34,7 @@ "ConfigurationError", "WriteConcern", ] -PYMONGO_IGNORE = ["uri_parser"] +PYMONGO_IGNORE = [] GLOBAL_INGORE = ["TYPE_CHECKING", "annotations"]