From 90eb252ae6f3116c31eb037fdcc9dfdb042ae5ea Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:30:44 -0600 Subject: [PATCH 1/7] fix: updated version number and minimum required version of python --- README.md | 2 +- setup.cfg | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2bdb494..f2ac295 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This SDK was developed independently using their existing C# SDK, their swagger ### Python -Requires use of Python 3.6.0 or later. +Requires use of Python 3.10.0 or later. ### Requests diff --git a/setup.cfg b/setup.cfg index 3297454..46187d5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = OnspringApiSdk -version = 1.0.1 +version = 2.0.0 author = StevanFreeborn author_email = stevan.freeborn@gmail.com description = A package for interacting with version 2 of the Onspring API. @@ -18,7 +18,7 @@ classifiers = package_dir = = src packages = find: -python_requires = >=3.6 +python_requires = >=3.10 install_requires = Requests [options.packages.find] From f343de2b6281dd9140a1fb6ec4805b3f1bd96e60 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 15:50:15 -0600 Subject: [PATCH 2/7] tests: add failing test for GetFieldsByIds --- setup.cfg | 4 +- .../Tests_OnspringClient.py | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/OnspringApiSDK.Tests/Tests_OnspringClient.py diff --git a/setup.cfg b/setup.cfg index 46187d5..b2f216a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -16,10 +16,10 @@ classifiers = [options] package_dir = - = src + = src/OnspringApiSdk packages = find: python_requires = >=3.10 install_requires = Requests [options.packages.find] -where = src \ No newline at end of file +where = src/OnspringApiSdk \ No newline at end of file diff --git a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py new file mode 100644 index 0000000..0330aed --- /dev/null +++ b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py @@ -0,0 +1,91 @@ +import sys + +import requests_mock + +sys.path.append('src') + +from OnspringApiSdk.OnspringClient import OnspringClient + + +@requests_mock.Mocker(kw='mock') +class TestOnspringClient(object): + test_url = 'https://test.com' + test_apiKey = 'apiKey' + client = OnspringClient(test_url, test_apiKey) + + def test_GetFieldsByIds_WhenFieldContainsListValues_ItShouldReturnThoseValues(self, **kwargs): + mockResponse = { + "count": 2, + "items": [ + { + "multiplicity": "SingleSelect", + "listId": 638, + "values": [ + { + "id": "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#008e8e" + }, + { + "id": "0421e502-7f76-480a-9311-363aca3560bc", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#a186be" + }, + { + "id": "285b91c1-5800-47cb-a030-8cf7cdd7cdf1", + "name": "updated_list_value_1676840661138}", + "sortOrder": 3, + "numericValue": 1, + "color": "#000000" + } + ], + "id": 4801, + "appId": 130, + "name": "single_select_list_field", + "type": "List", + "status": "Enabled", + "isRequired": True, + "isUnique": False + }, + { + "outputType": "ListValue", + "values": [ + { + "id": "b235afb2-b786-4c87-bce9-fbd700e246c1", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#6dcff6" + }, + { + "id": "5cd7cd55-d6a6-40e0-a560-8aa407c13210", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#8e468e" + } + ], + "id": 4815, + "appId": 130, + "name": "list_formula_field", + "type": "Formula", + "status": "Enabled", + "isRequired": False, + "isUnique": False + } + ] + } + + kwargs['mock'].post(self.test_url + '/Fields/batch-get', json=mockResponse) + + response = self.client.GetFieldsByIds([4801, 4815]) + + assert response.data.fields[0].id == 4801, "Field id should be 4801" + assert response.data.fields[1].id == 4815, "Field id should be 4815" + + for field in response.data.fields: + assert field.values is not None, "Field list values should not be None" \ No newline at end of file From 8f035f7308fb5d0c9c3140d4c522f4adc6632730 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:01:08 -0600 Subject: [PATCH 3/7] tests: add additional assertions to test --- .../Tests_OnspringClient.py | 144 ++++++++++-------- src/OnspringApiSdk/OnspringClient.py | 29 +++- 2 files changed, 111 insertions(+), 62 deletions(-) diff --git a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py index 0330aed..f7496a9 100644 --- a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py +++ b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py @@ -18,64 +18,64 @@ class TestOnspringClient(object): "count": 2, "items": [ { - "multiplicity": "SingleSelect", - "listId": 638, - "values": [ - { - "id": "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", - "name": "list_value_1", - "sortOrder": 1, - "numericValue": 1, - "color": "#008e8e" - }, - { - "id": "0421e502-7f76-480a-9311-363aca3560bc", - "name": "list_value_2", - "sortOrder": 2, - "numericValue": 2, - "color": "#a186be" - }, - { - "id": "285b91c1-5800-47cb-a030-8cf7cdd7cdf1", - "name": "updated_list_value_1676840661138}", - "sortOrder": 3, - "numericValue": 1, - "color": "#000000" - } - ], - "id": 4801, - "appId": 130, - "name": "single_select_list_field", - "type": "List", - "status": "Enabled", - "isRequired": True, - "isUnique": False + "multiplicity": "SingleSelect", + "listId": 638, + "values": [ + { + "id": "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#008e8e" + }, + { + "id": "0421e502-7f76-480a-9311-363aca3560bc", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#a186be" + }, + { + "id": "285b91c1-5800-47cb-a030-8cf7cdd7cdf1", + "name": "updated_list_value_1676840661138}", + "sortOrder": 3, + "numericValue": 1, + "color": "#000000" + } + ], + "id": 4801, + "appId": 130, + "name": "single_select_list_field", + "type": "List", + "status": "Enabled", + "isRequired": True, + "isUnique": False }, { - "outputType": "ListValue", - "values": [ - { - "id": "b235afb2-b786-4c87-bce9-fbd700e246c1", - "name": "list_value_1", - "sortOrder": 1, - "numericValue": 1, - "color": "#6dcff6" - }, - { - "id": "5cd7cd55-d6a6-40e0-a560-8aa407c13210", - "name": "list_value_2", - "sortOrder": 2, - "numericValue": 2, - "color": "#8e468e" - } - ], - "id": 4815, - "appId": 130, - "name": "list_formula_field", - "type": "Formula", - "status": "Enabled", - "isRequired": False, - "isUnique": False + "outputType": "ListValue", + "values": [ + { + "id": "b235afb2-b786-4c87-bce9-fbd700e246c1", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#6dcff6" + }, + { + "id": "5cd7cd55-d6a6-40e0-a560-8aa407c13210", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#8e468e" + } + ], + "id": 4815, + "appId": 130, + "name": "list_formula_field", + "type": "Formula", + "status": "Enabled", + "isRequired": False, + "isUnique": False } ] } @@ -84,8 +84,32 @@ class TestOnspringClient(object): response = self.client.GetFieldsByIds([4801, 4815]) - assert response.data.fields[0].id == 4801, "Field id should be 4801" - assert response.data.fields[1].id == 4815, "Field id should be 4815" + field_4801 = response.data.fields[0] + field_4815 = response.data.fields[1] + + assert field_4801.id == 4801, "Field id should be 4801" + assert field_4801.listId == 638, "Field list id should be 638" + assert field_4801.multiplicity == "SingleSelect", "Field multiplicity should be SingleSelect" + assert field_4801.values is not None, "Field list values should not be None" - for field in response.data.fields: - assert field.values is not None, "Field list values should not be None" \ No newline at end of file + field_4801_value = field_4801.values[0] + + assert field_4801_value.id == "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", "Field value id should be 2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84" + assert field_4801_value.name == "list_value_1", "Field value name should be list_value_1" + assert field_4801_value.sortOrder == 1, "Field value sort order should be 1" + assert field_4801_value.numericValue == 1, "Field value numeric value should be 1" + assert field_4801_value.color == "#008e8e", "Field value color should be #008e8e" + + assert field_4815.id == 4815, "Field id should be 4815" + assert field_4815.listId is None, "Field list id should be None" + assert field_4815.multiplicity is None, "Field multiplicity should be None" + assert field_4815.values is not None, "Field list values should not be None" + assert field_4815.outputType == 'ListValue', 'Field output type should be ListValue' + + field_4815_value = field_4815.values[0] + + assert field_4815_value.id == "b235afb2-b786-4c87-bce9-fbd700e246c1", "Field value id should be b235afb2-b786-4c87-bce9-fbd700e246c1" + assert field_4815_value.name == "list_value_1", "Field value name should be list_value_1" + assert field_4815_value.sortOrder == 1, "Field value sort order should be 1" + assert field_4815_value.numericValue == 1, "Field value numeric value should be 1" + assert field_4815_value.color == "#6dcff6", "Field value color should be #6dcff6" \ No newline at end of file diff --git a/src/OnspringApiSdk/OnspringClient.py b/src/OnspringApiSdk/OnspringClient.py index 5efb6a8..bcb086e 100644 --- a/src/OnspringApiSdk/OnspringClient.py +++ b/src/OnspringApiSdk/OnspringClient.py @@ -1,10 +1,12 @@ -import requests import json import re +import requests + from OnspringApiSdk.Endpoints import * from OnspringApiSdk.Models import * + class OnspringClient: """ A class that represents a client that can interact with the api. @@ -388,6 +390,25 @@ class OnspringClient: for item in responseJson.get('items'): item = dict(item) + + values = item.get('values') + + if values != None: + + listValues = [] + + for value in values: + + value = dict(value) + + value = ListValue( + value.get('id'), + value.get('name'), + value.get('sortOrder'), + value.get('numericValue'), + value.get('color')) + + listValues.append(value) field = Field( item.get('id'), @@ -396,7 +417,11 @@ class OnspringClient: item.get('type'), item.get('status'), item.get('isRequired'), - item.get('isUnique')) + item.get('isUnique'), + item.get("listId"), + listValues, + item.get('multiplicity'), + item.get('outputType')) fields.append(field) From 8135ccaf5d6cd6b8aafd7576844ea5c9e9236cad Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:11:49 -0600 Subject: [PATCH 4/7] tests: add failing test for GetFieldsByAppId --- .../Tests_OnspringClient.py | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py index f7496a9..a40676e 100644 --- a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py +++ b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py @@ -13,6 +13,110 @@ class TestOnspringClient(object): test_apiKey = 'apiKey' client = OnspringClient(test_url, test_apiKey) + def test_GetFieldsByAppId_WhenFieldContainsListValues_ItShouldReturnThoseValues(self, **kwargs): + mockResponse = { + "pageNumber": 1, + "pageSize": 2, + "totalPages": 1, + "totalRecords": 2, + "items": [ + { + "multiplicity": "SingleSelect", + "listId": 638, + "values": [ + { + "id": "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#008e8e" + }, + { + "id": "0421e502-7f76-480a-9311-363aca3560bc", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#a186be" + }, + { + "id": "285b91c1-5800-47cb-a030-8cf7cdd7cdf1", + "name": "updated_list_value_1676840661138}", + "sortOrder": 3, + "numericValue": 1, + "color": "#000000" + } + ], + "id": 4801, + "appId": 130, + "name": "single_select_list_field", + "type": "List", + "status": "Enabled", + "isRequired": True, + "isUnique": False + }, + { + "outputType": "ListValue", + "values": [ + { + "id": "b235afb2-b786-4c87-bce9-fbd700e246c1", + "name": "list_value_1", + "sortOrder": 1, + "numericValue": 1, + "color": "#6dcff6" + }, + { + "id": "5cd7cd55-d6a6-40e0-a560-8aa407c13210", + "name": "list_value_2", + "sortOrder": 2, + "numericValue": 2, + "color": "#8e468e" + } + ], + "id": 4815, + "appId": 130, + "name": "list_formula_field", + "type": "Formula", + "status": "Enabled", + "isRequired": False, + "isUnique": False + }, + ] + } + + kwargs['mock'].get(self.test_url + '/Fields/appId/1', json=mockResponse) + + response = self.client.GetFieldsByAppId(1) + + field_4801 = response.data.fields[0] + field_4815 = response.data.fields[1] + + assert field_4801.id == 4801, "Field id should be 4801" + assert field_4801.listId == 638, "Field list id should be 638" + assert field_4801.multiplicity == "SingleSelect", "Field multiplicity should be SingleSelect" + assert field_4801.values is not None, "Field list values should not be None" + + field_4801_value = field_4801.values[0] + + assert field_4801_value.id == "2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84", "Field value id should be 2c1af5b1-0f90-4378-b9a5-8b7e22f2bc84" + assert field_4801_value.name == "list_value_1", "Field value name should be list_value_1" + assert field_4801_value.sortOrder == 1, "Field value sort order should be 1" + assert field_4801_value.numericValue == 1, "Field value numeric value should be 1" + assert field_4801_value.color == "#008e8e", "Field value color should be #008e8e" + + assert field_4815.id == 4815, "Field id should be 4815" + assert field_4815.listId is None, "Field list id should be None" + assert field_4815.multiplicity is None, "Field multiplicity should be None" + assert field_4815.values is not None, "Field list values should not be None" + assert field_4815.outputType == 'ListValue', 'Field output type should be ListValue' + + field_4815_value = field_4815.values[0] + + assert field_4815_value.id == "b235afb2-b786-4c87-bce9-fbd700e246c1", "Field value id should be b235afb2-b786-4c87-bce9-fbd700e246c1" + assert field_4815_value.name == "list_value_1", "Field value name should be list_value_1" + assert field_4815_value.sortOrder == 1, "Field value sort order should be 1" + assert field_4815_value.numericValue == 1, "Field value numeric value should be 1" + assert field_4815_value.color == "#6dcff6", "Field value color should be #6dcff6" + def test_GetFieldsByIds_WhenFieldContainsListValues_ItShouldReturnThoseValues(self, **kwargs): mockResponse = { "count": 2, From b168b599dcd3773488e095f7fc21848a53ab56d6 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:12:37 -0600 Subject: [PATCH 5/7] fix: update GetFieldsByAppId method to return properly structured fields if field is list or formula type --- src/OnspringApiSdk/OnspringClient.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/OnspringApiSdk/OnspringClient.py b/src/OnspringApiSdk/OnspringClient.py index bcb086e..e6317d2 100644 --- a/src/OnspringApiSdk/OnspringClient.py +++ b/src/OnspringApiSdk/OnspringClient.py @@ -484,6 +484,25 @@ class OnspringClient: item = dict(item) + values = item.get('values') + + if values != None: + + listValues = [] + + for value in values: + + value = dict(value) + + value = ListValue( + value.get('id'), + value.get('name'), + value.get('sortOrder'), + value.get('numericValue'), + value.get('color')) + + listValues.append(value) + field = Field( item.get('id'), item.get('appId'), @@ -491,7 +510,11 @@ class OnspringClient: item.get('type'), item.get('status'), item.get('isRequired'), - item.get('isUnique')) + item.get('isUnique'), + item.get("listId"), + listValues, + item.get('multiplicity'), + item.get('outputType')) fields.append(field) From 355e19708a75c98eeb6f8ee17a0e681625d9fa97 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:24:44 -0600 Subject: [PATCH 6/7] fix: correct listValues possibly being unbound --- src/OnspringApiSdk/OnspringClient.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OnspringApiSdk/OnspringClient.py b/src/OnspringApiSdk/OnspringClient.py index e6317d2..bdc1d37 100644 --- a/src/OnspringApiSdk/OnspringClient.py +++ b/src/OnspringApiSdk/OnspringClient.py @@ -485,11 +485,10 @@ class OnspringClient: item = dict(item) values = item.get('values') + listValues = [] if values != None: - listValues = [] - for value in values: value = dict(value) From 2c736be81a29fbe2b9a744dfdcc1a57c4b6f8a64 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 23 Jan 2024 16:25:23 -0600 Subject: [PATCH 7/7] chore: small formatting fix --- src/OnspringApiSDK.Tests/Tests_OnspringClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py index a40676e..a439df1 100644 --- a/src/OnspringApiSDK.Tests/Tests_OnspringClient.py +++ b/src/OnspringApiSDK.Tests/Tests_OnspringClient.py @@ -20,7 +20,7 @@ class TestOnspringClient(object): "totalPages": 1, "totalRecords": 2, "items": [ - { + { "multiplicity": "SingleSelect", "listId": 638, "values": [