Skip to content

Commit 01e357f

Browse files
authored
Merge pull request #27 from splitio/add-key-counts-to-segment
Added a get_key_count() method to segment definitions
2 parents 98dfb3a + 67f5c4d commit 01e357f

File tree

7 files changed

+113
-2
lines changed

7 files changed

+113
-2
lines changed

CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,5 @@
4747
- fixed bug in updating rule based segments
4848
3.5.3 (Jul 10, 2025)
4949
- fixed bug in listing large segments
50+
3.5.4 (Aug 12, 2025)
51+
- added method to retrieve segment definition key counts for standard segments

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "splitapiclient"
7-
version = "3.5.3"
7+
version = "3.5.4"
88
description = "This Python Library provide full support for Split REST Admin API, allow creating, deleting and editing Environments, Splits, Split Definitions, Segments, Segment Keys, Users, Groups, API Keys, Change Requests, Attributes and Identities"
99
classifiers = [
1010
"Programming Language :: Python :: 3",

splitapiclient/microclients/segment_definition_microclient.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,26 @@ def get_keys(self, segment_name, environment_id):
133133
break
134134
return [item["key"] for item in final_list]
135135

136+
137+
138+
def get_key_count(self, segment_name, environment_id):
139+
'''
140+
Returns a count of keys
141+
142+
:returns: count of keys in Segment in environemnt objects
143+
:rtype: integer
144+
'''
145+
146+
response = self._http_client.make_request(
147+
self._endpoint['get_keys'],
148+
environmentId = environment_id,
149+
segmentName = segment_name,
150+
offset = 0
151+
)
152+
153+
return int(response['count'])
154+
155+
136156
def import_keys_from_json(self, segment_name, environment_id, replace_keys, data):
137157
'''
138158
import keys from csv file into segment

splitapiclient/resources/segment_definition.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ def tags(self):
5353
def creation_time(self):
5454
return None if self._creationTime==0 else self._creationTime
5555

56+
def get_key_count(self, apiclient=None):
57+
'''
58+
Get the key count for this segment definition in this environment
59+
60+
:returns: the key count for the segment definition
61+
:rtype: integer
62+
'''
63+
imc = require_client('SegmentDefinition', self._client, apiclient)
64+
return imc.get_key_count(self._name, self._environment['id'])
65+
5666

5767
def get_keys(self, apiclient=None):
5868
'''

splitapiclient/tests/microclients/segment_definition_microclient_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,39 @@ def test_list(self, mocker):
8484
assert object_to_stringified_dict(result[0]) == data[0]
8585

8686
assert object_to_stringified_dict(result[1]) == data[1]
87+
88+
def test_get_key_count(self, mocker):
89+
'''
90+
Test get_key_count method of SegmentDefinitionMicroClient
91+
'''
92+
# Mock the SyncHttpClient make_request method
93+
mocker.patch('splitapiclient.http_clients.sync_client.SyncHttpClient.make_request')
94+
95+
# Create client instances
96+
sc = SyncHttpClient('abc', 'abc')
97+
segment_client = SegmentDefinitionMicroClient(sc)
98+
99+
# Define mock response data
100+
mock_response = {
101+
'keys': [{'key': 'key1'}, {'key': 'key2'}, {'key': 'key3'}, {'key': 'key4'}, {'key': 'key5'}],
102+
'offset': 0,
103+
'count': 5, # This is the value we expect to be returned
104+
'limit': 100
105+
}
106+
107+
# Set the return value for the mocked method
108+
SyncHttpClient.make_request.return_value = mock_response
109+
110+
# Call the method being tested
111+
result = segment_client.get_key_count('test_segment', 'test_env_id')
112+
113+
# Verify the HTTP client was called with correct parameters
114+
SyncHttpClient.make_request.assert_called_once_with(
115+
SegmentDefinitionMicroClient._endpoint['get_keys'],
116+
environmentId='test_env_id',
117+
segmentName='test_segment',
118+
offset=0
119+
)
120+
121+
# Verify the result matches the expected count
122+
assert result == 5

splitapiclient/tests/resources/test_segment_definition.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,49 @@ def test_remove_keys(self, mocker):
175175
)
176176
assert attr == True
177177

178+
def test_get_key_count(self, mocker):
179+
'''
180+
Test get_key_count method of SegmentDefinition class
181+
'''
182+
# Mock response data with count
183+
data = {
184+
'keys': [{'key':'key1'}, {'key':'key2'}, {'key':'key3'}],
185+
'offset': 0,
186+
'count': 3,
187+
'limit': 100
188+
}
189+
190+
# Create mock HTTP client
191+
http_client_mock = mocker.Mock(spec=BaseHttpClient)
192+
http_client_mock.make_request.return_value = data
193+
194+
# Create segment definition with mock client
195+
seg = SegmentDefinition(
196+
{
197+
'name': 'test_segment',
198+
'environment': {
199+
'id': 'env_123',
200+
'name': 'test_env'
201+
},
202+
'trafficType': {},
203+
},
204+
http_client_mock
205+
)
206+
207+
# Call the method being tested
208+
key_count = seg.get_key_count()
209+
210+
# Verify the HTTP client was called with correct parameters
211+
http_client_mock.make_request.assert_called_once_with(
212+
SegmentDefinitionMicroClient._endpoint['get_keys'],
213+
environmentId = 'env_123',
214+
segmentName = 'test_segment',
215+
offset = 0
216+
)
217+
218+
# Verify the returned count matches expected value
219+
assert key_count == 3
220+
178221
def test_submit_change_request(self, mocker):
179222
'''
180223
'''

splitapiclient/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '3.5.3'
1+
__version__ = '3.5.4'

0 commit comments

Comments
 (0)