Skip to content

Commit 396b076

Browse files
committed
Add test, address review
1 parent d5aa363 commit 396b076

File tree

5 files changed

+83
-52
lines changed

5 files changed

+83
-52
lines changed

doc/changelog.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ PyMongo 4.12 brings a number of changes including:
99
- Support for configuring DEK cache lifetime via the ``key_expiration_ms`` argument to
1010
:class:`~pymongo.encryption_options.AutoEncryptionOpts`.
1111
- Support for $lookup in CSFLE and QE supported on MongoDB 8.1+.
12+
- Deprecated the ``hedge`` parameter for
13+
:class:`~pymongo.read_preferences.PrimaryPreferred`,
14+
:class:`~pymongo.read_preferences.Secondary`,
15+
:class:`~pymongo.read_preferences.SecondaryPreferred`,
16+
:class:`~pymongo.read_preferences.Nearest`. Support for ``hedge`` will be removed in PyMongo 5.0.
17+
1218

1319
Issues Resolved
1420
...............

pymongo/read_preferences.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def _validate_hedge(hedge: Optional[_Hedge]) -> Optional[_Hedge]:
105105
raise TypeError(f"hedge must be a dictionary, not {hedge!r}")
106106

107107
warnings.warn(
108-
"Hedged reads are deprecated starting in server version 8.0.",
108+
"The read preference 'hedge' option is deprecated in PyMongo 4.12+ because hedged reads are deprecated in MongoDB version 8.0+. Support for 'hedge' will be removed in PyMongo 5.0.",
109109
DeprecationWarning,
110110
stacklevel=2,
111111
)
@@ -150,7 +150,7 @@ def document(self) -> dict[str, Any]:
150150
doc["maxStalenessSeconds"] = self.__max_staleness
151151
if self.__hedge not in (None, {}):
152152
warnings.warn(
153-
"Hedged reads are deprecated starting in server version 8.0.",
153+
"The read preference 'hedge' option is deprecated in PyMongo 4.12+ because hedged reads are deprecated in MongoDB version 8.0+. Support for 'hedge' will be removed in PyMongo 5.0.",
154154
DeprecationWarning,
155155
stacklevel=2,
156156
)
@@ -216,7 +216,7 @@ def hedge(self) -> Optional[_Hedge]:
216216
"""
217217
if self.__hedge is not None:
218218
warnings.warn(
219-
"Hedged reads are deprecated starting in server version 8.0.",
219+
"The read preference 'hedge' option is deprecated in PyMongo 4.12+ because hedged reads are deprecated in MongoDB version 8.0+. Support for 'hedge' will be removed in PyMongo 5.0.",
220220
DeprecationWarning,
221221
stacklevel=2,
222222
)

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ filterwarnings = [
119119
"module:please use dns.resolver.Resolver.resolve:DeprecationWarning",
120120
# https://github.com/dateutil/dateutil/issues/1314
121121
"module:datetime.datetime.utc:DeprecationWarning",
122-
"module:Hedged reads are deprecated:DeprecationWarning",
123122
]
124123
markers = [
125124
"auth_aws: tests that rely on pymongo-auth-aws",

test/asynchronous/test_read_preferences.py

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
)
3636
from test.utils_shared import (
3737
OvertCommandListener,
38+
_ignore_deprecations,
3839
async_wait_until,
3940
one,
4041
)
@@ -542,33 +543,44 @@ def test_read_preference_document_hedge(self):
542543
for mode, cls in cases.items():
543544
with self.assertRaises(TypeError):
544545
cls(hedge=[]) # type: ignore
545-
546-
pref = cls(hedge={})
547-
self.assertEqual(pref.document, {"mode": mode})
548-
out = _maybe_add_read_preference({}, pref)
549-
if cls == SecondaryPreferred:
550-
# SecondaryPreferred without hedge doesn't add $readPreference.
551-
self.assertEqual(out, {})
552-
else:
546+
with _ignore_deprecations():
547+
pref = cls(hedge={})
548+
self.assertEqual(pref.document, {"mode": mode})
549+
out = _maybe_add_read_preference({}, pref)
550+
if cls == SecondaryPreferred:
551+
# SecondaryPreferred without hedge doesn't add $readPreference.
552+
self.assertEqual(out, {})
553+
else:
554+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
555+
556+
hedge: dict[str, Any] = {"enabled": True}
557+
pref = cls(hedge=hedge)
558+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
559+
out = _maybe_add_read_preference({}, pref)
553560
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
554561

555-
hedge: dict[str, Any] = {"enabled": True}
556-
pref = cls(hedge=hedge)
557-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
558-
out = _maybe_add_read_preference({}, pref)
559-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
562+
hedge = {"enabled": False}
563+
pref = cls(hedge=hedge)
564+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
565+
out = _maybe_add_read_preference({}, pref)
566+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
560567

561-
hedge = {"enabled": False}
562-
pref = cls(hedge=hedge)
563-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
564-
out = _maybe_add_read_preference({}, pref)
565-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
568+
hedge = {"enabled": False, "extra": "option"}
569+
pref = cls(hedge=hedge)
570+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
571+
out = _maybe_add_read_preference({}, pref)
572+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
566573

567-
hedge = {"enabled": False, "extra": "option"}
568-
pref = cls(hedge=hedge)
569-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
570-
out = _maybe_add_read_preference({}, pref)
571-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
574+
def test_read_preference_hedge_deprecated(self):
575+
cases = {
576+
"primaryPreferred": PrimaryPreferred,
577+
"secondary": Secondary,
578+
"secondaryPreferred": SecondaryPreferred,
579+
"nearest": Nearest,
580+
}
581+
for _, cls in cases.items():
582+
with self.assertRaises(DeprecationWarning):
583+
cls(hedge={"enabled": True})
572584

573585
async def test_send_hedge(self):
574586
cases = {
@@ -582,7 +594,8 @@ async def test_send_hedge(self):
582594
client = await self.async_rs_client(event_listeners=[listener])
583595
await client.admin.command("ping")
584596
for _mode, cls in cases.items():
585-
pref = cls(hedge={"enabled": True})
597+
with _ignore_deprecations():
598+
pref = cls(hedge={"enabled": True})
586599
coll = client.test.get_collection("test", read_preference=pref)
587600
listener.reset()
588601
await coll.find_one()

test/test_read_preferences.py

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
)
3636
from test.utils_shared import (
3737
OvertCommandListener,
38+
_ignore_deprecations,
3839
one,
3940
wait_until,
4041
)
@@ -522,33 +523,44 @@ def test_read_preference_document_hedge(self):
522523
for mode, cls in cases.items():
523524
with self.assertRaises(TypeError):
524525
cls(hedge=[]) # type: ignore
525-
526-
pref = cls(hedge={})
527-
self.assertEqual(pref.document, {"mode": mode})
528-
out = _maybe_add_read_preference({}, pref)
529-
if cls == SecondaryPreferred:
530-
# SecondaryPreferred without hedge doesn't add $readPreference.
531-
self.assertEqual(out, {})
532-
else:
526+
with _ignore_deprecations():
527+
pref = cls(hedge={})
528+
self.assertEqual(pref.document, {"mode": mode})
529+
out = _maybe_add_read_preference({}, pref)
530+
if cls == SecondaryPreferred:
531+
# SecondaryPreferred without hedge doesn't add $readPreference.
532+
self.assertEqual(out, {})
533+
else:
534+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
535+
536+
hedge: dict[str, Any] = {"enabled": True}
537+
pref = cls(hedge=hedge)
538+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
539+
out = _maybe_add_read_preference({}, pref)
533540
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
534541

535-
hedge: dict[str, Any] = {"enabled": True}
536-
pref = cls(hedge=hedge)
537-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
538-
out = _maybe_add_read_preference({}, pref)
539-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
542+
hedge = {"enabled": False}
543+
pref = cls(hedge=hedge)
544+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
545+
out = _maybe_add_read_preference({}, pref)
546+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
540547

541-
hedge = {"enabled": False}
542-
pref = cls(hedge=hedge)
543-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
544-
out = _maybe_add_read_preference({}, pref)
545-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
548+
hedge = {"enabled": False, "extra": "option"}
549+
pref = cls(hedge=hedge)
550+
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
551+
out = _maybe_add_read_preference({}, pref)
552+
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
546553

547-
hedge = {"enabled": False, "extra": "option"}
548-
pref = cls(hedge=hedge)
549-
self.assertEqual(pref.document, {"mode": mode, "hedge": hedge})
550-
out = _maybe_add_read_preference({}, pref)
551-
self.assertEqual(out, SON([("$query", {}), ("$readPreference", pref.document)]))
554+
def test_read_preference_hedge_deprecated(self):
555+
cases = {
556+
"primaryPreferred": PrimaryPreferred,
557+
"secondary": Secondary,
558+
"secondaryPreferred": SecondaryPreferred,
559+
"nearest": Nearest,
560+
}
561+
for _, cls in cases.items():
562+
with self.assertRaises(DeprecationWarning):
563+
cls(hedge={"enabled": True})
552564

553565
def test_send_hedge(self):
554566
cases = {
@@ -562,7 +574,8 @@ def test_send_hedge(self):
562574
client = self.rs_client(event_listeners=[listener])
563575
client.admin.command("ping")
564576
for _mode, cls in cases.items():
565-
pref = cls(hedge={"enabled": True})
577+
with _ignore_deprecations():
578+
pref = cls(hedge={"enabled": True})
566579
coll = client.test.get_collection("test", read_preference=pref)
567580
listener.reset()
568581
coll.find_one()

0 commit comments

Comments
 (0)