Skip to content

Commit 61ea2b9

Browse files
authored
Merge pull request #69 from apimatic/68-handle-typed-additional-properties-in-model
feat(additional-properties): handle typed additional properties in model
2 parents b3d0d28 + a751c05 commit 61ea2b9

4 files changed

Lines changed: 654 additions & 9 deletions

File tree

apimatic_core/utilities/api_helper.py

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,38 @@ def json_deserialize(json, unboxing_function=None, as_dict=False):
123123
return {k: unboxing_function(v) for k, v in decoded.items()}
124124
elif isinstance(decoded, list):
125125
return [unboxing_function(element) for element in decoded]
126-
else:
127-
return unboxing_function(decoded)
126+
127+
return unboxing_function(decoded)
128+
129+
@staticmethod
130+
def apply_unboxing_function(value, unboxing_function, is_array=False, is_dict=False, is_array_of_map=False,
131+
is_map_of_array=False, dimension_count=1):
132+
if is_dict:
133+
if is_map_of_array:
134+
return {k: ApiHelper.apply_unboxing_function(v,
135+
unboxing_function,
136+
is_array=True,
137+
dimension_count=dimension_count)
138+
for k, v in value.items()}
139+
else:
140+
return {k: unboxing_function(v) for k, v in value.items()}
141+
elif is_array:
142+
if is_array_of_map:
143+
return [
144+
ApiHelper.apply_unboxing_function(element,
145+
unboxing_function,
146+
is_dict=True,
147+
dimension_count=dimension_count)
148+
for element in value]
149+
elif dimension_count > 1:
150+
return [ApiHelper.apply_unboxing_function(element, unboxing_function,
151+
is_array=True,
152+
dimension_count=dimension_count - 1)
153+
for element in value]
154+
else:
155+
return [unboxing_function(element) for element in value]
156+
157+
return unboxing_function(value)
128158

129159
@staticmethod
130160
def dynamic_deserialize(dynamic_response):
@@ -527,23 +557,27 @@ def to_dictionary(obj, should_ignore_null_values=False):
527557
# Loop through all additional properties in this model
528558
if hasattr(obj, "additional_properties"):
529559
for name in obj.additional_properties:
560+
561+
if name in dictionary.keys():
562+
raise ValueError(f'An additional property key, \'{name}\' conflicts with one of the model\'s properties')
563+
530564
value = obj.additional_properties.get(name)
531565
if isinstance(value, list):
532566
# Loop through each item
533567
dictionary[name] = list()
534568
for item in value:
535569
dictionary[name].append(
536-
ApiHelper.to_dictionary(item, should_ignore_null_values) if hasattr(item, "additional_properties") else item)
570+
ApiHelper.to_dictionary(item, should_ignore_null_values) if hasattr(item, "_names") else item)
537571
elif isinstance(value, dict):
538572
# Loop through each item
539573
dictionary[name] = dict()
540574
for key in value:
541575
dictionary[name][key] = ApiHelper.to_dictionary(value[key], should_ignore_null_values) if hasattr(value[key],
542-
"additional_properties") else \
576+
"_names") else \
543577
value[key]
544578
else:
545579
dictionary[name] = ApiHelper.to_dictionary(value, should_ignore_null_values) if hasattr(value,
546-
"additional_properties") else value
580+
"_names") else value
547581

548582
# Return the result
549583
return dictionary
@@ -668,6 +702,27 @@ def to_lower_case(list_of_string):
668702

669703
return list(map(lambda x: x.lower(), list_of_string))
670704

705+
@staticmethod
706+
def get_additional_properties(dictionary, unboxing_function):
707+
"""Extracts additional properties from the dictionary.
708+
709+
Args:
710+
dictionary (dict): The dictionary to extract additional properties from.
711+
unboxing_function (callable): The deserializer to apply to each item in the dictionary.
712+
713+
Returns:
714+
dict: A dictionary containing the additional properties and their values.
715+
"""
716+
additional_properties = {}
717+
for key, value in dictionary.items():
718+
try:
719+
additional_properties[key] = unboxing_function(value)
720+
except Exception:
721+
pass
722+
723+
return additional_properties
724+
725+
671726
class CustomDate(object):
672727

673728
""" A base class for wrapper classes of datetime.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
setup(
1414
name='apimatic-core',
15-
version='0.2.15',
15+
version='0.2.16',
1616
description='A library that contains core logic and utilities for '
1717
'consuming REST APIs using Python SDKs generated by APIMatic.',
1818
long_description=long_description,

0 commit comments

Comments
 (0)