Skip to content

Commit 47a7fbb

Browse files
committed
handle DeciderFeatureNotFoundException with warnings.warn
1 parent 56e46d6 commit 47a7fbb

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

reddit_decider/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import warnings
23

34
from copy import deepcopy
45
from dataclasses import dataclass
@@ -13,6 +14,7 @@
1314

1415
import rust_decider # type: ignore
1516
from rust_decider import Decider as RustDecider
17+
from rust_decider import DeciderFeatureNotFoundException
1618
from rust_decider import DeciderInitException
1719
from rust_decider import DeciderException
1820

@@ -346,6 +348,9 @@ def get_variant(
346348

347349
try:
348350
decision = self._rs_decider.choose(experiment_name, ctx)
351+
except DeciderFeatureNotFoundException as exc:
352+
warnings.warn(exc)
353+
return None
349354
except DeciderException as exc:
350355
logger.info(exc)
351356
return None

tests/decider_tests.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import tempfile
55
import unittest
6+
import warnings
67

78
from unittest import mock
89

@@ -149,7 +150,7 @@ def test_make_object_for_context_and_decider_context(self):
149150
with self.assertLogs(logger, logging.WARN) as captured:
150151
# ensure no warnings are printed except for the dummy one
151152
# https://stackoverflow.com/a/61381576/4260179
152-
logger.warn("Dummy warning")
153+
logger.warning("Dummy warning")
153154
decider = decider_ctx_factory.make_object_for_context(name="test", span=self.mock_span)
154155
assert len(captured.records) == 1
155156
self.assertEqual(["WARNING:root:Dummy warning"], captured.output)
@@ -226,7 +227,7 @@ def test_make_object_for_context_and_decider_context_without_span(self):
226227
with self.assertLogs(logger, logging.WARN) as captured:
227228
# ensure no warnings are printed except for the dummy one
228229
# https://stackoverflow.com/a/61381576/4260179
229-
logger.warn("Dummy warning")
230+
logger.warning("Dummy warning")
230231

231232
decider = decider_ctx_factory.make_object_for_context(name="test", span=None)
232233
assert len(captured.records) == 1
@@ -520,9 +521,22 @@ def test_none_returned_on_get_variant_call_with_experiment_not_found(self):
520521
decider = setup_decider(f, self.minimal_decider_context, self.mock_span, self.event_logger)
521522

522523
self.assertEqual(self.event_logger.log.call_count, 0)
523-
variant = decider.get_variant("anything")
524+
with warnings.catch_warnings(record=True) as captured:
525+
variant = decider.get_variant("anything")
526+
527+
# can't test warning log only shows up only once if `decider.get_variant("anything")`
528+
# is called again due to bug in `catch_warnings` contextmanager
529+
# see https://github.com/python/cpython/issues/73858
530+
assert any(
531+
'Feature "anything" not found.'
532+
in str(x.message)
533+
for x in captured
534+
)
524535
self.assertEqual(variant, None)
525536

537+
# no exposures should be triggered
538+
self.assertEqual(self.event_logger.log.call_count, 0)
539+
526540
def test_get_variant_without_expose(self):
527541
with create_temp_config_file(self.exp_base_config) as f:
528542
decider = setup_decider(f, self.dc, self.mock_span, self.event_logger)

0 commit comments

Comments
 (0)