|
24 | 24 | from reddit_edgecontext import ValidatedAuthenticationToken |
25 | 25 | from rust_decider import Decider as RustDecider |
26 | 26 | from rust_decider import DeciderException |
| 27 | +from rust_decider import Decision |
27 | 28 | from rust_decider import FeatureNotFoundException |
28 | 29 | from rust_decider import make_ctx |
29 | 30 | from typing_extensions import Literal |
@@ -610,47 +611,40 @@ def get_all_variants_without_expose(self) -> List[Dict[str, Union[str, int]]]: |
610 | 611 |
|
611 | 612 | :return: list of experiment dicts with non-:code:`None` variants. |
612 | 613 | """ |
613 | | - decider = self._get_decider() |
614 | | - if decider is None: |
615 | | - return [] |
616 | | - |
617 | | - ctx = self._get_ctx() |
618 | | - ctx_err = ctx.err() |
619 | | - if ctx_err is not None: |
620 | | - logger.info(f"Encountered error in rust_decider.make_ctx(): {ctx_err}") |
| 614 | + if self._internal is None: |
| 615 | + logger.error("rs_decider is None--did not initialize.") |
621 | 616 | return [] |
622 | 617 |
|
623 | | - all_decisions_result = decider.choose_all(ctx) |
| 618 | + ctx = self._decider_context.to_dict() |
624 | 619 |
|
625 | | - error = all_decisions_result.err() |
626 | | - if error: |
627 | | - logger.info(f"Encountered error in decider.choose_all(): {error}") |
| 620 | + try: |
| 621 | + all_decisions = self._internal.choose_all(ctx) |
| 622 | + except DeciderException as exc: |
| 623 | + logger.info(str(exc)) |
628 | 624 | return [] |
629 | 625 |
|
630 | | - all_decisions = all_decisions_result.decisions() |
631 | 626 | parsed_choices = [] |
632 | 627 |
|
633 | 628 | event_context_fields = self._decider_context.to_event_dict() |
634 | 629 |
|
635 | | - for exp_name, decision in all_decisions.items(): |
636 | | - decision_error = decision.err() |
637 | | - if decision_error: |
638 | | - logger.info( |
639 | | - f"Encountered error for experiment: {exp_name} in decider.choose_all(): {decision_error}" |
640 | | - ) |
641 | | - continue |
642 | | - |
643 | | - decision_dict = decision.decision_dict() |
644 | | - |
645 | | - if decision_dict: |
646 | | - parsed_choices.append(self._format_decision(decision_dict)) |
| 630 | + for decision in all_decisions.values(): |
| 631 | + if decision.variant: |
| 632 | + parsed_choices.append(self._decision_to_dict(decision)) |
647 | 633 |
|
648 | 634 | # expose Holdout if the experiment is part of one |
649 | | - for event in decision.events(): |
| 635 | + for event in decision.events: |
650 | 636 | self._send_expose_if_holdout(event=event, exposure_fields=event_context_fields) |
651 | 637 |
|
652 | 638 | return parsed_choices |
653 | 639 |
|
| 640 | + def _decision_to_dict(self, decision: Decision) -> Dict[str, Any]: |
| 641 | + return { |
| 642 | + "name": decision.variant, |
| 643 | + "id": decision.feature_id, |
| 644 | + "version": str(decision.feature_version), |
| 645 | + "experimentName": decision.feature_name, |
| 646 | + } |
| 647 | + |
654 | 648 | def get_all_variants_for_identifier_without_expose( |
655 | 649 | self, identifier: str, identifier_type: Literal["user_id", "device_id", "canonical_url"] |
656 | 650 | ) -> List[Dict[str, Union[str, int]]]: |
@@ -691,48 +685,32 @@ def get_all_variants_for_identifier_without_expose( |
691 | 685 | ) |
692 | 686 | return [] |
693 | 687 |
|
694 | | - decider = self._get_decider() |
695 | | - if decider is None: |
696 | | - return [] |
697 | | - |
698 | | - ctx = self._get_ctx_with_set_identifier( |
699 | | - identifier=identifier, identifier_type=identifier_type |
700 | | - ) |
701 | | - ctx_err = ctx.err() |
702 | | - if ctx_err is not None: |
703 | | - logger.info(f"Encountered error in rust_decider.make_ctx(): {ctx_err}") |
| 688 | + if self._internal is None: |
| 689 | + logger.error("rs_decider is None--did not initialize.") |
704 | 690 | return [] |
705 | 691 |
|
706 | | - all_decisions_result = decider.choose_all(ctx=ctx, identifier_type=identifier_type) |
| 692 | + ctx = self._decider_context.to_dict() |
| 693 | + ctx[identifier_type] = identifier |
707 | 694 |
|
708 | | - error = all_decisions_result.err() |
709 | | - if error: |
710 | | - logger.info(f"Encountered error in decider.choose_all(): {error}") |
| 695 | + try: |
| 696 | + all_decisions = self._internal.choose_all( |
| 697 | + context=ctx, bucketing_field_filter=identifier_type |
| 698 | + ) |
| 699 | + except DeciderException as exc: |
| 700 | + logger.info(exc) |
711 | 701 | return [] |
712 | 702 |
|
713 | | - all_decisions = all_decisions_result.decisions() |
714 | 703 | parsed_choices = [] |
715 | 704 |
|
716 | 705 | event_context_fields = self._decider_context.to_event_dict() |
717 | 706 |
|
718 | | - for exp_name, decision in all_decisions.items(): |
719 | | - decision_error = decision.err() |
720 | | - if decision_error: |
721 | | - logger.info( |
722 | | - f"Encountered error for experiment: {exp_name} in decider.choose_all(): {decision_error}" |
723 | | - ) |
724 | | - continue |
725 | | - |
726 | | - decision_dict = decision.decision_dict() |
727 | | - |
728 | | - if decision_dict: |
729 | | - parsed_choices.append(self._format_decision(decision_dict)) |
| 707 | + for decision in all_decisions.values(): |
| 708 | + if decision.variant: |
| 709 | + parsed_choices.append(self._decision_to_dict(decision)) |
730 | 710 |
|
731 | 711 | # expose Holdout if the experiment is part of one |
732 | | - for event in decision.events(): |
733 | | - self._send_expose_if_holdout( |
734 | | - event=event, exposure_fields=event_context_fields, overwrite_identifier=True |
735 | | - ) |
| 712 | + for event in decision.events: |
| 713 | + self._send_expose_if_holdout(event=event, exposure_fields=event_context_fields) |
736 | 714 |
|
737 | 715 | return parsed_choices |
738 | 716 |
|
|
0 commit comments