Skip to content

Commit 71c3183

Browse files
committed
fix reverse search
1 parent e9e84e1 commit 71c3183

File tree

1 file changed

+9
-28
lines changed

1 file changed

+9
-28
lines changed

featuremanagement/_featuremanagerbase.py

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@
2424
logger = logging.getLogger(__name__)
2525

2626

27-
def _get_feature_flag(configuration: Mapping[str, Any], feature_flag_name: str, reversed_feature_flags: Optional[List] = None) -> Optional[FeatureFlag]:
27+
def _get_feature_flag(configuration: Mapping[str, Any], feature_flag_name: str) -> Optional[FeatureFlag]:
2828
"""
2929
Gets the FeatureFlag json from the configuration, if it exists it gets converted to a FeatureFlag object.
3030
If multiple feature flags have the same id, the last one wins.
3131
3232
:param Mapping configuration: Configuration object.
3333
:param str feature_flag_name: Name of the feature flag.
34-
:param List reversed_feature_flags: Optional pre-reversed list of feature flags for performance.
3534
:return: FeatureFlag
3635
:rtype: FeatureFlag
3736
"""
@@ -41,21 +40,20 @@ def _get_feature_flag(configuration: Mapping[str, Any], feature_flag_name: str,
4140
feature_flags = feature_management.get(FEATURE_FLAG_KEY)
4241
if not feature_flags or not isinstance(feature_flags, list):
4342
return None
44-
45-
# Use pre-reversed list if available, otherwise reverse on demand
46-
flags_to_iterate = reversed_feature_flags if reversed_feature_flags is not None else reversed(feature_flags)
4743

48-
for feature_flag in flags_to_iterate:
49-
if feature_flag.get("id") == feature_flag_name:
50-
return FeatureFlag.convert_from_json(feature_flag)
44+
index = len(feature_flags) - 1
45+
46+
while index >= 0:
47+
if feature_flags[index].get("id") == feature_flag_name:
48+
return FeatureFlag.convert_from_json(feature_flags[index])
49+
index -= 1
5150

5251
return None
5352

5453

5554
def _list_feature_flag_names(configuration: Mapping[str, Any]) -> List[str]:
5655
"""
57-
List of all feature flag names. If there are duplicate names, only unique names are returned
58-
in order of first appearance.
56+
List of feature flag names, with duplicates removed.
5957
6058
:param Mapping configuration: Configuration object.
6159
:return: List of feature flag names.
@@ -67,7 +65,6 @@ def _list_feature_flag_names(configuration: Mapping[str, Any]) -> List[str]:
6765
if not feature_flags or not isinstance(feature_flags, list):
6866
return []
6967

70-
# Use dict.fromkeys() to preserve order while ensuring uniqueness
7168
flag_ids = [feature_flag.get("id") for feature_flag in feature_flags]
7269
return list(dict.fromkeys(flag_ids))
7370

@@ -83,25 +80,10 @@ def __init__(self, configuration: Mapping[str, Any], **kwargs: Any):
8380
self._configuration = configuration
8481
self._cache: Dict[str, Optional[FeatureFlag]] = {}
8582
self._copy = configuration.get(FEATURE_MANAGEMENT_KEY)
86-
self._reversed_feature_flags: Optional[List] = None
8783
self._on_feature_evaluated = kwargs.pop("on_feature_evaluated", None)
8884
self._targeting_context_accessor: Optional[Callable[[], TargetingContext]] = kwargs.pop(
8985
"targeting_context_accessor", None
9086
)
91-
self._update_reversed_feature_flags()
92-
93-
def _update_reversed_feature_flags(self) -> None:
94-
"""Update the cached reversed feature flags list when configuration changes."""
95-
feature_management = self._configuration.get(FEATURE_MANAGEMENT_KEY)
96-
if not feature_management or not isinstance(feature_management, Mapping):
97-
self._reversed_feature_flags = None
98-
return
99-
feature_flags = feature_management.get(FEATURE_FLAG_KEY)
100-
if not feature_flags or not isinstance(feature_flags, list):
101-
self._reversed_feature_flags = None
102-
return
103-
104-
self._reversed_feature_flags = list(reversed(feature_flags))
10587

10688
@staticmethod
10789
def _assign_default_disabled_variant(evaluation_event: EvaluationEvent) -> None:
@@ -289,10 +271,9 @@ def _check_feature_base(self, feature_flag_id: str) -> Tuple[EvaluationEvent, bo
289271
if self._copy is not self._configuration.get(FEATURE_MANAGEMENT_KEY):
290272
self._cache = {}
291273
self._copy = self._configuration.get(FEATURE_MANAGEMENT_KEY)
292-
self._update_reversed_feature_flags()
293274

294275
if not self._cache.get(feature_flag_id):
295-
feature_flag = _get_feature_flag(self._configuration, feature_flag_id, self._reversed_feature_flags)
276+
feature_flag = _get_feature_flag(self._configuration, feature_flag_id)
296277
self._cache[feature_flag_id] = feature_flag
297278
else:
298279
feature_flag = self._cache.get(feature_flag_id)

0 commit comments

Comments
 (0)