Skip to content

Commit f7af3c3

Browse files
committed
RustDecider#choose() in get_variant_for_identifier*()
1 parent b087fc5 commit f7af3c3

File tree

2 files changed

+26
-94
lines changed

2 files changed

+26
-94
lines changed

reddit_decider/__init__.py

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -483,38 +483,31 @@ def get_variant_for_identifier(
483483
)
484484
return None
485485

486-
decider = self._get_decider()
487-
if decider is None:
488-
return None
489-
490-
ctx = self._get_ctx_with_set_identifier(
491-
identifier=identifier, identifier_type=identifier_type
492-
)
493-
ctx_err = ctx.err()
494-
if ctx_err is not None:
495-
logger.info(f"Encountered error in rust_decider.make_ctx(): {ctx_err}")
486+
if self._internal is None:
487+
logger.error("RustDecider is None--did not initialize.")
496488
return None
497489

498-
choice = decider.choose(
499-
feature_name=experiment_name, ctx=ctx, identifier_type=identifier_type
500-
)
501-
error = choice.err()
490+
ctx = self._decider_context.to_dict()
491+
ctx[identifier_type] = identifier
502492

503-
if error:
504-
logger.info(f"Encountered error in decider.choose(): {error}")
493+
try:
494+
decision = self._internal.choose(experiment_name, ctx)
495+
except FeatureNotFoundException as exc:
496+
warnings.warn(str(exc))
497+
return None
498+
except DeciderException as exc:
499+
logger.info(str(exc))
505500
return None
506-
507-
variant = choice.decision()
508501

509502
event_context_fields = self._decider_context.to_event_dict()
510503
event_context_fields.update(exposure_kwargs or {})
511504

512-
for event in choice.events():
505+
for event in decision.events:
513506
self._send_expose(
514507
event=event, exposure_fields=event_context_fields, overwrite_identifier=True
515508
)
516509

517-
return variant
510+
return decision.variant
518511

519512
def get_variant_for_identifier_without_expose(
520513
self,
@@ -549,37 +542,31 @@ def get_variant_for_identifier_without_expose(
549542
)
550543
return None
551544

552-
decider = self._get_decider()
553-
if decider is None:
545+
if self._internal is None:
546+
logger.error("RustDecider is None--did not initialize.")
554547
return None
555548

556-
ctx = self._get_ctx_with_set_identifier(
557-
identifier=identifier, identifier_type=identifier_type
558-
)
559-
ctx_err = ctx.err()
560-
if ctx_err is not None:
561-
logger.info(f"Encountered error in rust_decider.make_ctx(): {ctx_err}")
562-
return None
549+
ctx = self._decider_context.to_dict()
550+
ctx[identifier_type] = identifier
563551

564-
choice = decider.choose(
565-
feature_name=experiment_name, ctx=ctx, identifier_type=identifier_type
566-
)
567-
error = choice.err()
568-
if error:
569-
logger.info(f"Encountered error in decider.choose(): {error}")
552+
try:
553+
decision = self._internal.choose(experiment_name, ctx)
554+
except FeatureNotFoundException as exc:
555+
warnings.warn(str(exc))
556+
return None
557+
except DeciderException as exc:
558+
logger.info(str(exc))
570559
return None
571-
572-
variant = choice.decision()
573560

574561
event_context_fields = self._decider_context.to_event_dict()
575562

576563
# expose Holdout if the experiment is part of one
577-
for event in choice.events():
564+
for event in decision.events:
578565
self._send_expose_if_holdout(
579566
event=event, exposure_fields=event_context_fields, overwrite_identifier=True
580567
)
581568

582-
return variant
569+
return decision.variant
583570

584571
def get_all_variants_without_expose(self) -> List[Dict[str, Union[str, int]]]:
585572
"""Return a list of experiment dicts in this format:

tests/decider_tests.py

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -708,31 +708,6 @@ def test_get_variant_for_identifier_device_id(self):
708708
# `identifier` passed to correct event field of experiment's `bucket_val` config
709709
self.assertEqual(event_fields["device_id"], identifier)
710710

711-
def test_get_variant_for_identifier_wrong_bucket_val(self):
712-
identifier = USER_ID
713-
bucket_val = "device_id"
714-
self.exp_base_config["exp_1"]["experiment"].update({"bucket_val": bucket_val})
715-
716-
with create_temp_config_file(self.exp_base_config) as f:
717-
decider = setup_decider(f, self.dc, self.mock_span, self.event_logger)
718-
719-
self.assertEqual(self.event_logger.log.call_count, 0)
720-
with self.assertLogs() as captured:
721-
# `identifier_type="canonical_url"`, which doesn't match `bucket_val` of `device_id`
722-
variant = decider.get_variant_for_identifier(
723-
experiment_name="exp_1", identifier=identifier, identifier_type="canonical_url"
724-
)
725-
# `None` is returned since `identifier_type` doesn't match `bucket_val` in experiment-config json
726-
self.assertEqual(variant, None)
727-
# exposure isn't emitted either
728-
self.assertEqual(self.event_logger.log.call_count, 0)
729-
730-
assert any(
731-
'Encountered error in decider.choose(): Requested identifier_type "canonical_url" is incompatible with experiment\'s bucket_val = device_id'
732-
in x.getMessage()
733-
for x in captured.records
734-
)
735-
736711
def test_get_variant_for_identifier_bogus_identifier_type(self):
737712
identifier = "anything"
738713
identifier_type = "blah"
@@ -816,36 +791,6 @@ def test_get_variant_for_identifier_without_expose_user_id_for_holdout_exposure(
816791
experiment_name="hg", variant="holdout", event_fields=event_fields
817792
)
818793

819-
def test_get_variant_for_identifier_without_expose_for_holdout_exposure_wrong_bucket_val(self):
820-
identifier = DEVICE_ID
821-
bucket_val = "device_id"
822-
self.exp_base_config["exp_1"]["experiment"].update({"bucket_val": bucket_val})
823-
824-
self.exp_base_config["exp_1"].update({"parent_hg_name": "hg"})
825-
self.parent_hg_config["hg"]["experiment"].update({"bucket_val": bucket_val})
826-
self.exp_base_config.update(self.parent_hg_config)
827-
828-
with create_temp_config_file(self.exp_base_config) as f:
829-
decider = setup_decider(f, self.dc, self.mock_span, self.event_logger)
830-
831-
self.assertEqual(self.event_logger.log.call_count, 0)
832-
# `identifier_type="canonical_url"`, which doesn't match `bucket_val` of `device_id`
833-
self.assertEqual(self.event_logger.log.call_count, 0)
834-
with self.assertLogs() as captured:
835-
variant = decider.get_variant_for_identifier_without_expose(
836-
experiment_name="exp_1", identifier=identifier, identifier_type="canonical_url"
837-
)
838-
# `None` is returned since `identifier_type` doesn't match `bucket_val` in experiment-config json
839-
self.assertEqual(variant, None)
840-
841-
assert any(
842-
'Encountered error in decider.choose(): Requested identifier_type "canonical_url" is incompatible with experiment\'s bucket_val = device_id'
843-
in x.getMessage()
844-
for x in captured.records
845-
)
846-
847-
self.assertEqual(self.event_logger.log.call_count, 0)
848-
849794
def test_get_variant_for_identifier_without_expose_canonical_url(self):
850795
identifier = CANONICAL_URL
851796
bucket_val = "canonical_url"

0 commit comments

Comments
 (0)