Skip to content

Commit bf48da8

Browse files
authored
Merge pull request #498 from splitio/async-flagsets-api
updated api commons, split and telemetry classes
2 parents f8d382b + b17c75d commit bf48da8

File tree

5 files changed

+26
-29
lines changed

5 files changed

+26
-29
lines changed

splitio/api/commons.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class FetchOptions(object):
77
"""Fetch Options object."""
88

9-
def __init__(self, cache_control_headers=False, change_number=None):
9+
def __init__(self, cache_control_headers=False, change_number=None, sets=None):
1010
"""
1111
Class constructor.
1212
@@ -15,9 +15,13 @@ def __init__(self, cache_control_headers=False, change_number=None):
1515
1616
:param change_number: ChangeNumber to use for bypassing CDN in request.
1717
:type change_number: int
18+
19+
:param sets: list of flag sets
20+
:type sets: list
1821
"""
1922
self._cache_control_headers = cache_control_headers
2023
self._change_number = change_number
24+
self._sets = sets
2125

2226
@property
2327
def cache_control_headers(self):
@@ -29,12 +33,19 @@ def change_number(self):
2933
"""Return change number."""
3034
return self._change_number
3135

36+
@property
37+
def sets(self):
38+
"""Return sets."""
39+
return self._sets
40+
3241
def __eq__(self, other):
3342
"""Match between other options."""
3443
if self._cache_control_headers != other._cache_control_headers:
3544
return False
3645
if self._change_number != other._change_number:
3746
return False
47+
if self._sets != other._sets:
48+
return False
3849
return True
3950

4051

@@ -62,4 +73,6 @@ def build_fetch(change_number, fetch_options, metadata):
6273
extra_headers[_CACHE_CONTROL] = _CACHE_CONTROL_NO_CACHE
6374
if fetch_options.change_number is not None:
6475
query['till'] = fetch_options.change_number
76+
if fetch_options.sets is not None:
77+
query['sets'] = fetch_options.sets
6578
return query, extra_headers

splitio/api/splits.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ def fetch_splits(self, change_number, fetch_options):
5757
if 200 <= response.status_code < 300:
5858
return json.loads(response.body)
5959
else:
60+
if response.status_code == 414:
61+
_LOGGER.error('Error fetching feature flags; the amount of flag sets provided are too big, causing uri length error.')
6062
raise APIException(response.body, response.status_code)
6163
except HttpClientException as exc:
6264
_LOGGER.error('Error fetching feature flags because an exception was raised by the HTTPClient')
@@ -109,6 +111,8 @@ async def fetch_splits(self, change_number, fetch_options):
109111
if 200 <= response.status_code < 300:
110112
return json.loads(response.body)
111113
else:
114+
if response.status_code == 414:
115+
_LOGGER.error('Error fetching feature flags; the amount of flag sets provided are too big, causing uri length error.')
112116
raise APIException(response.body, response.status_code)
113117
except HttpClientException as exc:
114118
_LOGGER.error('Error fetching feature flags because an exception was raised by the HTTPClient')

splitio/api/telemetry.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ def record_init(self, configs):
7171
'Error posting init config because an exception was raised by the HTTPClient'
7272
)
7373
_LOGGER.debug('Error: ', exc_info=True)
74-
raise APIException('Init config data not flushed properly.') from exc
7574

7675
def record_stats(self, stats):
7776
"""
@@ -162,7 +161,6 @@ async def record_init(self, configs):
162161
'Error posting init config because an exception was raised by the HTTPClient'
163162
)
164163
_LOGGER.debug('Error: ', exc_info=True)
165-
raise APIException('Init config data not flushed properly.') from exc
166164

167165
async def record_stats(self, stats):
168166
"""

tests/api/test_splits_api.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@ def test_fetch_split_changes(self, mocker):
1616
httpclient.get.return_value = client.HttpResponse(200, '{"prop1": "value1"}', {})
1717
split_api = splits.SplitsAPI(httpclient, 'some_api_key', SdkMetadata('1.0', 'some', '1.2.3.4'), mocker.Mock())
1818

19-
response = split_api.fetch_splits(123, FetchOptions())
19+
response = split_api.fetch_splits(123, FetchOptions(False, None, 'set1,set2'))
2020
assert response['prop1'] == 'value1'
2121
assert httpclient.get.mock_calls == [mocker.call('sdk', 'splitChanges', 'some_api_key',
2222
extra_headers={
2323
'SplitSDKVersion': '1.0',
2424
'SplitSDKMachineIP': '1.2.3.4',
2525
'SplitSDKMachineName': 'some'
2626
},
27-
query={'since': 123})]
27+
query={'since': 123, 'sets': 'set1,set2'})]
2828

2929
httpclient.reset_mock()
30-
response = split_api.fetch_splits(123, FetchOptions(True))
30+
response = split_api.fetch_splits(123, FetchOptions(True, 123, 'set3'))
3131
assert response['prop1'] == 'value1'
3232
assert httpclient.get.mock_calls == [mocker.call('sdk', 'splitChanges', 'some_api_key',
3333
extra_headers={
@@ -36,7 +36,7 @@ def test_fetch_split_changes(self, mocker):
3636
'SplitSDKMachineName': 'some',
3737
'Cache-Control': 'no-cache'
3838
},
39-
query={'since': 123})]
39+
query={'since': 123, 'till': 123, 'sets': 'set3'})]
4040

4141
httpclient.reset_mock()
4242
response = split_api.fetch_splits(123, FetchOptions(True, 123))
@@ -82,7 +82,7 @@ async def get(verb, url, key, query, extra_headers):
8282
return client.HttpResponse(200, '{"prop1": "value1"}', {})
8383
httpclient.get = get
8484

85-
response = await split_api.fetch_splits(123, FetchOptions())
85+
response = await split_api.fetch_splits(123, FetchOptions(False, None, 'set1,set2'))
8686
assert response['prop1'] == 'value1'
8787
assert self.verb == 'sdk'
8888
assert self.url == 'splitChanges'
@@ -92,10 +92,10 @@ async def get(verb, url, key, query, extra_headers):
9292
'SplitSDKMachineIP': '1.2.3.4',
9393
'SplitSDKMachineName': 'some'
9494
}
95-
assert self.query == {'since': 123}
95+
assert self.query == {'since': 123, 'sets': 'set1,set2'}
9696

9797
httpclient.reset_mock()
98-
response = await split_api.fetch_splits(123, FetchOptions(True))
98+
response = await split_api.fetch_splits(123, FetchOptions(True, 123, 'set3'))
9999
assert response['prop1'] == 'value1'
100100
assert self.verb == 'sdk'
101101
assert self.url == 'splitChanges'
@@ -106,7 +106,7 @@ async def get(verb, url, key, query, extra_headers):
106106
'SplitSDKMachineName': 'some',
107107
'Cache-Control': 'no-cache'
108108
}
109-
assert self.query == {'since': 123}
109+
assert self.query == {'since': 123, 'till': 123, 'sets': 'set3'}
110110

111111
httpclient.reset_mock()
112112
response = await split_api.fetch_splits(123, FetchOptions(True, 123))

tests/api/test_telemetry_api.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,6 @@ def test_record_init(self, mocker):
8282
# validate key-value args (body)
8383
assert call_made[2]['body'] == uniques
8484

85-
httpclient.reset_mock()
86-
def raise_exception(*args, **kwargs):
87-
raise client.HttpClientException('some_message')
88-
httpclient.post.side_effect = raise_exception
89-
with pytest.raises(APIException) as exc_info:
90-
response = telemetry_api.record_init(uniques)
91-
assert exc_info.type == APIException
92-
assert exc_info.value.message == 'some_message'
93-
9485
def test_record_stats(self, mocker):
9586
"""Test telemetry posting stats."""
9687
httpclient = mocker.Mock(spec=client.HttpClient)
@@ -224,15 +215,6 @@ async def post(verb, url, key, body, extra_headers):
224215
# validate key-value args (body)
225216
assert self.body == uniques
226217

227-
httpclient.reset_mock()
228-
def raise_exception(*args, **kwargs):
229-
raise client.HttpClientException('some_message')
230-
httpclient.post = raise_exception
231-
with pytest.raises(APIException) as exc_info:
232-
response = await telemetry_api.record_init(uniques)
233-
assert exc_info.type == APIException
234-
assert exc_info.value.message == 'some_message'
235-
236218
@pytest.mark.asyncio
237219
async def test_record_stats(self, mocker):
238220
"""Test telemetry posting unique keys."""

0 commit comments

Comments
 (0)