Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add public api for deserializing models #236

Merged
merged 2 commits into from
Dec 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion nipyapi/nifi/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,9 @@ def sanitize_for_serialization(self, obj):
elif isinstance(obj, list):
return [self.sanitize_for_serialization(sub_obj)
for sub_obj in obj]
elif isinstance(obj, set):
return {self.sanitize_for_serialization(sub_obj)
for sub_obj in obj}
elif isinstance(obj, tuple):
return tuple(self.sanitize_for_serialization(sub_obj)
for sub_obj in obj)
Expand Down Expand Up @@ -253,6 +256,9 @@ def __deserialize(self, data, klass):
if type(klass) == str:
if klass.startswith('list['):
sub_kls = re.match('list\[(.*)\]', klass).group(1)
if isinstance(data, dict):
# ok, we got a single instance when we may have gotten a list
return self.__deserialize(data, sub_kls)
return [self.__deserialize(sub_data, sub_kls)
for sub_data in data]

Expand Down Expand Up @@ -609,6 +615,16 @@ def __deserialize_datatime(self, string):
)
)

def deserialize_model(self, data, klass):
"""
Deserializes list or dict to model.

:param data: dict, list.
:param klass: class literal.
:return: model object.
"""
return self.__deserialize_model(data, klass)

def __deserialize_model(self, data, klass):
"""
Deserializes list or dict to model.
Expand All @@ -626,7 +642,21 @@ def __deserialize_model(self, data, klass):
and klass.attribute_map[attr] in data \
and isinstance(data, (list, dict)):
value = data[klass.attribute_map[attr]]
kwargs[attr] = self.__deserialize(value, attr_type)
if attr_type.startswith('list['):
# if this is a list, we may get back a single item
# or a list
# create the list object if it doesn't exist
# append the return
if not kwargs.get(attr):
kwargs[attr] = []
deserialized_value = self.__deserialize(value, attr_type)
if deserialized_value:
if isinstance(deserialized_value, list):
kwargs[attr].extend(deserialized_value)
else:
kwargs[attr].append(deserialized_value)
else:
kwargs[attr] = self.__deserialize(value, attr_type)

instance = klass(**kwargs)

Expand Down
14 changes: 11 additions & 3 deletions nipyapi/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,27 @@

def dump(obj, mode='json'):
"""
Dumps a native datatype object to json or yaml, defaults to json
Dumps a native datatype object or swagger entity to json or yaml, defaults to json

Args:
obj (varies): The native datatype object to serialise
obj (varies): The native datatype object or swagger type to serialise
mode (str): 'json' or 'yaml', the supported export modes

Returns (str): The serialised object

"""
assert mode in ['json', 'yaml']
unset = False
if nipyapi.config.nifi_config.api_client is None:
unset = True
nipyapi.config.nifi_config.api_client = nipyapi.nifi.ApiClient()

prepared_obj = nipyapi.config.nifi_config.api_client.sanitize_for_serialization(obj)
if unset:
nipyapi.config.nifi_config.api_client = None
try:
out = json.dumps(
obj=obj,
obj=prepared_obj,
sort_keys=True,
indent=4
# default=_json_default
Expand Down
34 changes: 32 additions & 2 deletions resources/client_gen/swagger_templates/api_client.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ class ApiClient(object):
elif isinstance(obj, list):
return [self.sanitize_for_serialization(sub_obj)
for sub_obj in obj]
elif isinstance(obj, set):
return {self.sanitize_for_serialization(sub_obj)
for sub_obj in obj}
elif isinstance(obj, tuple):
return tuple(self.sanitize_for_serialization(sub_obj)
for sub_obj in obj)
Expand Down Expand Up @@ -244,6 +247,9 @@ class ApiClient(object):
if type(klass) == str:
if klass.startswith('list['):
sub_kls = re.match('list\[(.*)\]', klass).group(1)
if isinstance(data, dict):
# ok, we got a single instance when we may have gotten a list
return self.__deserialize(data, sub_kls)
return [self.__deserialize(sub_data, sub_kls)
for sub_data in data]

Expand Down Expand Up @@ -600,6 +606,16 @@ class ApiClient(object):
)
)

def deserialize_model(self, data, klass):
"""
Deserializes list or dict to model.

:param data: dict, list.
:param klass: class literal.
:return: model object.
"""
return self.__deserialize_model(data, klass)

def __deserialize_model(self, data, klass):
"""
Deserializes list or dict to model.
Expand All @@ -617,8 +633,22 @@ class ApiClient(object):
and klass.attribute_map[attr] in data \
and isinstance(data, (list, dict)):
value = data[klass.attribute_map[attr]]
kwargs[attr] = self.__deserialize(value, attr_type)
if attr_type.startswith('list['):
# if this is a list, we may get back a single item
# or a list
# create the list object if it doesn't exist
# append the return
if not kwargs.get(attr):
kwargs[attr] = []
deserialized_value = self.__deserialize(value, attr_type)
if deserialized_value:
if isinstance(deserialized_value, list):
kwargs[attr].extend(deserialized_value)
else:
kwargs[attr].append(deserialized_value)
else:
kwargs[attr] = self.__deserialize(value, attr_type)

instance = klass(**kwargs)
instance = klass(**kwargs)

return instance
6 changes: 3 additions & 3 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
# Can't use skiptest with parametrize for Travis
# Mostly because loading up all the environments takes too long

default_nifi_endpoints = ['http://localhost:8080/nifi-api']
default_nifi_endpoints = ['http://' + test_host + ':8080/nifi-api']
regress_nifi_endpoints = [
'http://' + test_host + ':10112/nifi-api',
'http://' + test_host + ':10120/nifi-api',
Expand All @@ -60,9 +60,9 @@
]
secure_nifi_endpoints = ['https://' + test_host + ':8443/nifi-api']
default_registry_endpoints = [
('http://localhost:18080/nifi-registry-api',
('http://' + test_host + ':18080/nifi-registry-api',
'http://registry:18080',
'http://localhost:8080/nifi-api'
'http://' + test_host + ':8080/nifi-api'
)
]
regress_registry_endpoints = [
Expand Down
Loading