From 2595b8ca6b2c7848908af77dbf301488860fd88a Mon Sep 17 00:00:00 2001 From: Josh Klein Date: Tue, 12 Aug 2025 09:16:18 -0400 Subject: [PATCH 1/2] Added a get_key_count() method to segment definitions --- CHANGES.txt | 2 + .../segment_definition_microclient.py | 20 +++++++++ .../resources/segment_definition.py | 10 +++++ .../segment_definition_microclient_test.py | 36 ++++++++++++++++ .../resources/test_segment_definition.py | 43 +++++++++++++++++++ splitapiclient/version.py | 2 +- 6 files changed, 112 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 289b983..ef8ff63 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -47,3 +47,5 @@ - fixed bug in updating rule based segments 3.5.3 (Jul 10, 2025) - fixed bug in listing large segments +3.5.4 (Aug 12, 2025) +- added method to retrieve segment definition key counts for standard segments \ No newline at end of file diff --git a/splitapiclient/microclients/segment_definition_microclient.py b/splitapiclient/microclients/segment_definition_microclient.py index e12a5c7..bf14ee3 100644 --- a/splitapiclient/microclients/segment_definition_microclient.py +++ b/splitapiclient/microclients/segment_definition_microclient.py @@ -133,6 +133,26 @@ def get_keys(self, segment_name, environment_id): break return [item["key"] for item in final_list] + + + def get_key_count(self, segment_name, environment_id): + ''' + Returns a count of keys + + :returns: count of keys in Segment in environemnt objects + :rtype: integer + ''' + + response = self._http_client.make_request( + self._endpoint['get_keys'], + environmentId = environment_id, + segmentName = segment_name, + offset = 0 + ) + + return int(response['count']) + + def import_keys_from_json(self, segment_name, environment_id, replace_keys, data): ''' import keys from csv file into segment diff --git a/splitapiclient/resources/segment_definition.py b/splitapiclient/resources/segment_definition.py index 2a5f538..ed705ac 100644 --- a/splitapiclient/resources/segment_definition.py +++ b/splitapiclient/resources/segment_definition.py @@ -53,6 +53,16 @@ def tags(self): def creation_time(self): return None if self._creationTime==0 else self._creationTime + def get_key_count(self, apiclient=None): + ''' + Get the key count for this segment definition in this environment + + :returns: the key count for the segment definition + :rtype: integer + ''' + imc = require_client('SegmentDefinition', self._client, apiclient) + return imc.get_key_count(self._name, self._environment['id']) + def get_keys(self, apiclient=None): ''' diff --git a/splitapiclient/tests/microclients/segment_definition_microclient_test.py b/splitapiclient/tests/microclients/segment_definition_microclient_test.py index 597303d..14acd58 100644 --- a/splitapiclient/tests/microclients/segment_definition_microclient_test.py +++ b/splitapiclient/tests/microclients/segment_definition_microclient_test.py @@ -84,3 +84,39 @@ def test_list(self, mocker): assert object_to_stringified_dict(result[0]) == data[0] assert object_to_stringified_dict(result[1]) == data[1] + + def test_get_key_count(self, mocker): + ''' + Test get_key_count method of SegmentDefinitionMicroClient + ''' + # Mock the SyncHttpClient make_request method + mocker.patch('splitapiclient.http_clients.sync_client.SyncHttpClient.make_request') + + # Create client instances + sc = SyncHttpClient('abc', 'abc') + segment_client = SegmentDefinitionMicroClient(sc) + + # Define mock response data + mock_response = { + 'keys': [{'key': 'key1'}, {'key': 'key2'}, {'key': 'key3'}, {'key': 'key4'}, {'key': 'key5'}], + 'offset': 0, + 'count': 5, # This is the value we expect to be returned + 'limit': 100 + } + + # Set the return value for the mocked method + SyncHttpClient.make_request.return_value = mock_response + + # Call the method being tested + result = segment_client.get_key_count('test_segment', 'test_env_id') + + # Verify the HTTP client was called with correct parameters + SyncHttpClient.make_request.assert_called_once_with( + SegmentDefinitionMicroClient._endpoint['get_keys'], + environmentId='test_env_id', + segmentName='test_segment', + offset=0 + ) + + # Verify the result matches the expected count + assert result == 5 diff --git a/splitapiclient/tests/resources/test_segment_definition.py b/splitapiclient/tests/resources/test_segment_definition.py index 8fc00cf..53578bf 100644 --- a/splitapiclient/tests/resources/test_segment_definition.py +++ b/splitapiclient/tests/resources/test_segment_definition.py @@ -175,6 +175,49 @@ def test_remove_keys(self, mocker): ) assert attr == True + def test_get_key_count(self, mocker): + ''' + Test get_key_count method of SegmentDefinition class + ''' + # Mock response data with count + data = { + 'keys': [{'key':'key1'}, {'key':'key2'}, {'key':'key3'}], + 'offset': 0, + 'count': 3, + 'limit': 100 + } + + # Create mock HTTP client + http_client_mock = mocker.Mock(spec=BaseHttpClient) + http_client_mock.make_request.return_value = data + + # Create segment definition with mock client + seg = SegmentDefinition( + { + 'name': 'test_segment', + 'environment': { + 'id': 'env_123', + 'name': 'test_env' + }, + 'trafficType': {}, + }, + http_client_mock + ) + + # Call the method being tested + key_count = seg.get_key_count() + + # Verify the HTTP client was called with correct parameters + http_client_mock.make_request.assert_called_once_with( + SegmentDefinitionMicroClient._endpoint['get_keys'], + environmentId = 'env_123', + segmentName = 'test_segment', + offset = 0 + ) + + # Verify the returned count matches expected value + assert key_count == 3 + def test_submit_change_request(self, mocker): ''' ''' diff --git a/splitapiclient/version.py b/splitapiclient/version.py index 455727c..17553bb 100644 --- a/splitapiclient/version.py +++ b/splitapiclient/version.py @@ -1 +1 @@ -__version__ = '3.5.3' +__version__ = '3.5.4' From 67f5c4dca455e9ddb9235052c0704e8ae5fbe9ea Mon Sep 17 00:00:00 2001 From: Josh Klein Date: Tue, 12 Aug 2025 09:33:33 -0400 Subject: [PATCH 2/2] updated pyproject.toml to correct version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0af8a08..a31ee63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "splitapiclient" -version = "3.5.3" +version = "3.5.4" 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" classifiers = [ "Programming Language :: Python :: 3",