Skip to content

Commit 5c0cd96

Browse files
authored
Merge pull request #34 from configcat/default-user
default user
2 parents cd03631 + 1d918b0 commit 5c0cd96

File tree

6 files changed

+130
-12
lines changed

6 files changed

+130
-12
lines changed

.github/workflows/python-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
runs-on: ubuntu-18.04
1818
strategy:
1919
matrix:
20-
python-versions: [2.7, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9]
20+
python-versions: ["2.7", "3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10"]
2121

2222
steps:
2323
- uses: actions/checkout@v2

configcatclient/__init__.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def create_client_with_auto_poll(sdk_key, poll_interval_seconds=60, max_init_wai
2020
on_configuration_changed_callback=None, config_cache_class=None,
2121
base_url=None, proxies=None, proxy_auth=None, connect_timeout=10, read_timeout=30,
2222
flag_overrides=None,
23-
data_governance=DataGovernance.Global):
23+
data_governance=DataGovernance.Global,
24+
default_user=None):
2425
"""
2526
Create an instance of ConfigCatClient and setup Auto Poll mode with custom options
2627
@@ -41,6 +42,8 @@ def create_client_with_auto_poll(sdk_key, poll_interval_seconds=60, max_init_wai
4142
Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard: \n
4243
https://app.configcat.com/organization/data-governance \n
4344
(Only Organization Admins have access)
45+
:param default_user: The default user, used as fallback when there's no user parameter is passed to the
46+
ConfigCatClient.get_value, ConfigCatClient.get_all_values, etc. methods.
4447
"""
4548

4649
if sdk_key is None:
@@ -64,13 +67,15 @@ def create_client_with_auto_poll(sdk_key, poll_interval_seconds=60, max_init_wai
6467
connect_timeout=connect_timeout,
6568
read_timeout=read_timeout,
6669
flag_overrides=flag_overrides,
67-
data_governance=data_governance)
70+
data_governance=data_governance,
71+
default_user=default_user)
6872

6973

7074
def create_client_with_lazy_load(sdk_key, cache_time_to_live_seconds=60, config_cache_class=None,
7175
base_url=None, proxies=None, proxy_auth=None, connect_timeout=10, read_timeout=30,
7276
flag_overrides=None,
73-
data_governance=DataGovernance.Global):
77+
data_governance=DataGovernance.Global,
78+
default_user=None):
7479
"""
7580
Create an instance of ConfigCatClient and setup Lazy Load mode with custom options
7681
@@ -89,6 +94,8 @@ def create_client_with_lazy_load(sdk_key, cache_time_to_live_seconds=60, config_
8994
Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard: \n
9095
https://app.configcat.com/organization/data-governance \n
9196
(Only Organization Admins have access)
97+
:param default_user: The default user, used as fallback when there's no user parameter is passed to the
98+
ConfigCatClient.get_value, ConfigCatClient.get_all_values, etc. methods.
9299
"""
93100

94101
if sdk_key is None:
@@ -109,13 +116,15 @@ def create_client_with_lazy_load(sdk_key, cache_time_to_live_seconds=60, config_
109116
connect_timeout=connect_timeout,
110117
read_timeout=read_timeout,
111118
flag_overrides=flag_overrides,
112-
data_governance=data_governance)
119+
data_governance=data_governance,
120+
default_user=default_user)
113121

114122

115123
def create_client_with_manual_poll(sdk_key, config_cache_class=None,
116124
base_url=None, proxies=None, proxy_auth=None, connect_timeout=10, read_timeout=30,
117125
flag_overrides=None,
118-
data_governance=DataGovernance.Global):
126+
data_governance=DataGovernance.Global,
127+
default_user=None):
119128
"""
120129
Create an instance of ConfigCatClient and setup Manual Poll mode with custom options
121130
@@ -133,6 +142,8 @@ def create_client_with_manual_poll(sdk_key, config_cache_class=None,
133142
Default: Global. Set this parameter to be in sync with the Data Governance preference on the Dashboard: \n
134143
https://app.configcat.com/organization/data-governance \n
135144
(Only Organization Admins have access)
145+
:param default_user: The default user, used as fallback when there's no user parameter is passed to the
146+
ConfigCatClient.get_value, ConfigCatClient.get_all_values, etc. methods.
136147
"""
137148

138149
if sdk_key is None:
@@ -150,4 +161,5 @@ def create_client_with_manual_poll(sdk_key, config_cache_class=None,
150161
connect_timeout=connect_timeout,
151162
read_timeout=read_timeout,
152163
flag_overrides=flag_overrides,
153-
data_governance=data_governance)
164+
data_governance=data_governance,
165+
default_user=default_user)

configcatclient/configcatclient.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ def __init__(self,
3535
connect_timeout=10,
3636
read_timeout=30,
3737
flag_overrides=None,
38-
data_governance=DataGovernance.Global):
38+
data_governance=DataGovernance.Global,
39+
default_user=None):
3940

4041
if sdk_key is None:
4142
raise ConfigCatClientException('SDK Key is required.')
@@ -48,6 +49,7 @@ def __init__(self,
4849
ConfigCatClient.sdk_keys.append(sdk_key)
4950

5051
self._sdk_key = sdk_key
52+
self._default_user = default_user
5153
self._override_data_source = flag_overrides
5254
self._rollout_evaluator = RolloutEvaluator()
5355

@@ -84,7 +86,7 @@ def get_value(self, key, default_value, user=None):
8486
(key, str(default_value)))
8587
return default_value
8688

87-
value, variation_id = self._rollout_evaluator.evaluate(key, user, default_value, None, config)
89+
value, variation_id = self._rollout_evaluator.evaluate(key, user if user is not None else self._default_user, default_value, None, config)
8890
return value
8991

9092
def get_all_keys(self):
@@ -106,7 +108,7 @@ def get_variation_id(self, key, default_variation_id, user=None):
106108
(key, str(default_variation_id)))
107109
return default_variation_id
108110

109-
value, variation_id = self._rollout_evaluator.evaluate(key, user, None, default_variation_id, config)
111+
value, variation_id = self._rollout_evaluator.evaluate(key, user if user is not None else self._default_user, None, default_variation_id, config)
110112
return variation_id
111113

112114
def get_all_variation_ids(self, user=None):
@@ -163,6 +165,12 @@ def force_refresh(self):
163165
if self._cache_policy:
164166
self._cache_policy.force_refresh()
165167

168+
def set_default_user(self, user):
169+
self._default_user = user
170+
171+
def clear_default_user(self):
172+
self._default_user = None
173+
166174
def stop(self):
167175
if self._cache_policy:
168176
self._cache_policy.stop()

configcatclienttests/mocks.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@
4141
'"testBoolKey": '
4242
'{"v": true, "t": 0, "p": [], "r": []},'
4343
'"testStringKey": '
44-
'{"v": "testValue", "t": 1, "p": [], "r": []},'
44+
'{"v": "testValue", "i": "id", "t": 1, "p": [], "r": ['
45+
' {"i":"id1","v":"fake1","a":"Identifier","t":2,"c":"@test1.com"},'
46+
' {"i":"id2","v":"fake2","a":"Identifier","t":2,"c":"@test2.com"}'
47+
']},'
4548
'"testIntKey": '
4649
'{"v": 1, "t": 2, "p": [], "r": []},'
4750
'"testDoubleKey": '

configcatclienttests/test_configcatclient.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from configcatclient import ConfigCatClientException
55
from configcatclient.configcatclient import ConfigCatClient
6+
from configcatclient.user import User
67
from configcatclienttests.mocks import ConfigCacheMock
78

89
logging.basicConfig(level=logging.INFO)
@@ -74,6 +75,99 @@ def test_cache_key(self):
7475
client1.stop()
7576
client2.stop()
7677

78+
def test_default_user_get_value(self):
79+
client = ConfigCatClient('test', 0, 0, None, 0, config_cache_class=ConfigCacheMock)
80+
user1 = User("[email protected]")
81+
user2 = User("[email protected]")
82+
83+
client.set_default_user(user1)
84+
self.assertEqual("fake1", client.get_value("testStringKey", ""))
85+
self.assertEqual("fake2", client.get_value("testStringKey", "", user2))
86+
87+
client.clear_default_user()
88+
self.assertEqual("testValue", client.get_value("testStringKey", ""))
89+
90+
client.stop()
91+
92+
def test_default_user_get_all_value(self):
93+
client = ConfigCatClient('test', 0, 0, None, 0, config_cache_class=ConfigCacheMock)
94+
user1 = User("[email protected]")
95+
user2 = User("[email protected]")
96+
97+
client.set_default_user(user1)
98+
all_values = client.get_all_values()
99+
# Two dictionary should have exactly the same elements, order doesn't matter.
100+
self.assertEqual(6, len(all_values))
101+
self.assertEqual(True, all_values['testBoolKey'])
102+
self.assertEqual('fake1', all_values['testStringKey'])
103+
self.assertEqual(1, all_values['testIntKey'])
104+
self.assertEqual(1.1, all_values['testDoubleKey'])
105+
self.assertTrue(all_values['key1'])
106+
self.assertFalse(all_values['key2'])
107+
108+
all_values = client.get_all_values(user2)
109+
# Two dictionary should have exactly the same elements, order doesn't matter.
110+
self.assertEqual(6, len(all_values))
111+
self.assertEqual(True, all_values['testBoolKey'])
112+
self.assertEqual('fake2', all_values['testStringKey'])
113+
self.assertEqual(1, all_values['testIntKey'])
114+
self.assertEqual(1.1, all_values['testDoubleKey'])
115+
self.assertTrue(all_values['key1'])
116+
self.assertFalse(all_values['key2'])
117+
118+
client.clear_default_user()
119+
all_values = client.get_all_values()
120+
self.assertEqual(6, len(all_values))
121+
self.assertEqual(True, all_values['testBoolKey'])
122+
self.assertEqual('testValue', all_values['testStringKey'])
123+
self.assertEqual(1, all_values['testIntKey'])
124+
self.assertEqual(1.1, all_values['testDoubleKey'])
125+
self.assertTrue(all_values['key1'])
126+
self.assertFalse(all_values['key2'])
127+
128+
client.stop()
129+
130+
def test_default_user_get_variation_id(self):
131+
client = ConfigCatClient('test', 0, 0, None, 0, config_cache_class=ConfigCacheMock)
132+
user1 = User("[email protected]")
133+
user2 = User("[email protected]")
134+
135+
client.set_default_user(user1)
136+
self.assertEqual("id1", client.get_variation_id("testStringKey", ""))
137+
self.assertEqual("id2", client.get_variation_id("testStringKey", "", user2))
138+
139+
client.clear_default_user()
140+
self.assertEqual("id", client.get_variation_id("testStringKey", ""))
141+
142+
client.stop()
143+
144+
def test_default_user_get_all_variation_ids(self):
145+
client = ConfigCatClient('test', 0, 0, None, 0, config_cache_class=ConfigCacheMock)
146+
user1 = User("[email protected]")
147+
user2 = User("[email protected]")
148+
149+
client.set_default_user(user1)
150+
result = client.get_all_variation_ids()
151+
self.assertEqual(3, len(result))
152+
self.assertTrue('id1' in result)
153+
self.assertTrue('fakeId1' in result)
154+
self.assertTrue('fakeId2' in result)
155+
156+
result = client.get_all_variation_ids(user2)
157+
self.assertEqual(3, len(result))
158+
self.assertTrue('id2' in result)
159+
self.assertTrue('fakeId1' in result)
160+
self.assertTrue('fakeId2' in result)
161+
162+
client.clear_default_user()
163+
result = client.get_all_variation_ids()
164+
self.assertEqual(3, len(result))
165+
self.assertTrue('id' in result)
166+
self.assertTrue('fakeId1' in result)
167+
self.assertTrue('fakeId2' in result)
168+
169+
client.stop()
170+
77171

78172
if __name__ == '__main__':
79173
unittest.main()

configcatclienttests/test_variation_id.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def test_get_variation_id_empty_config(self):
2828
def test_get_all_variation_ids(self):
2929
client = ConfigCatClient('test', 0, 0, None, 0, config_cache_class=ConfigCacheMock)
3030
result = client.get_all_variation_ids()
31-
self.assertEqual(2, len(result))
31+
self.assertEqual(3, len(result))
32+
self.assertTrue('id' in result)
3233
self.assertTrue('fakeId1' in result)
3334
self.assertTrue('fakeId2' in result)
3435
client.stop()

0 commit comments

Comments
 (0)