1+ """Storage Helper."""
2+ import logging
3+
4+ from splitio .models import splits
5+
6+ _LOGGER = logging .getLogger (__name__ )
7+
8+ def update_feature_flag_storage (feature_flag_storage , feature_flags , change_number ):
9+ """
10+ Update feature flag storage from given list of feature flags while checking the flag set logic
11+
12+ :param feature_flag_storage: Feature flag storage instance
13+ :type feature_flag_storage: splitio.storage.inmemory.InMemorySplitStorage
14+ :param feature_flag: Feature flag instance to validate.
15+ :type feature_flag: splitio.models.splits.Split
16+ :param: last change number
17+ :type: int
18+
19+ :return: segments list from feature flags list
20+ :rtype: list(str)
21+ """
22+ segment_list = set ()
23+ to_add = []
24+ to_delete = []
25+ for feature_flag in feature_flags :
26+ if feature_flag_storage .flag_set_filter .intersect (feature_flag .sets ) and feature_flag .status == splits .Status .ACTIVE :
27+ to_add .append (feature_flag )
28+ segment_list .update (set (feature_flag .get_segment_names ()))
29+ else :
30+ if feature_flag_storage .get (feature_flag .name ) is not None :
31+ to_delete .append (feature_flag .name )
32+
33+ feature_flag_storage .update (to_add , to_delete , change_number )
34+ return segment_list
35+
36+ async def update_feature_flag_storage_async (feature_flag_storage , feature_flags , change_number ):
37+ """
38+ Update feature flag storage from given list of feature flags while checking the flag set logic
39+
40+ :param feature_flag_storage: Feature flag storage instance
41+ :type feature_flag_storage: splitio.storage.inmemory.InMemorySplitStorage
42+ :param feature_flag: Feature flag instance to validate.
43+ :type feature_flag: splitio.models.splits.Split
44+ :param: last change number
45+ :type: int
46+
47+ :return: segments list from feature flags list
48+ :rtype: list(str)
49+ """
50+ segment_list = set ()
51+ to_add = []
52+ to_delete = []
53+ for feature_flag in feature_flags :
54+ if feature_flag_storage .flag_set_filter .intersect (feature_flag .sets ) and feature_flag .status == splits .Status .ACTIVE :
55+ to_add .append (feature_flag )
56+ segment_list .update (set (feature_flag .get_segment_names ()))
57+ else :
58+ if await feature_flag_storage .get (feature_flag .name ) is not None :
59+ to_delete .append (feature_flag .name )
60+
61+ await feature_flag_storage .update (to_add , to_delete , change_number )
62+ return segment_list
63+
64+ def get_valid_flag_sets (flag_sets , flag_set_filter ):
65+ """
66+ Check each flag set in given array, return it if exist in a given config flag set array, if config array is empty return all
67+
68+ :param flag_sets: Flag sets array
69+ :type flag_sets: list(str)
70+ :param config_flag_sets: Config flag sets array
71+ :type config_flag_sets: list(str)
72+
73+ :return: array of flag sets
74+ :rtype: list(str)
75+ """
76+ sets_to_fetch = []
77+ for flag_set in flag_sets :
78+ if not flag_set_filter .set_exist (flag_set ) and flag_set_filter .should_filter :
79+ _LOGGER .warning ("Flag set %s is not part of the configured flag set list, ignoring the request." % (flag_set ))
80+ continue
81+ sets_to_fetch .append (flag_set )
82+
83+ return sets_to_fetch
84+
85+ def combine_valid_flag_sets (result_sets ):
86+ """
87+ Check each flag set in given array of sets, combine all flag sets in one unique set
88+
89+ :param result_sets: Flag sets set
90+ :type flag_sets: list(set)
91+
92+ :return: flag sets set
93+ :rtype: set
94+ """
95+ to_return = set ()
96+ for result_set in result_sets :
97+ if isinstance (result_set , set ) and len (result_set ) > 0 :
98+ to_return .update (result_set )
99+ return to_return
0 commit comments