From d21182fdf877af50e12d2f8938c097a240a8cb38 Mon Sep 17 00:00:00 2001 From: Arunprasad Rajkumar Date: Wed, 11 Mar 2020 20:47:25 +0530 Subject: [PATCH] fix: Unable to access nested list property --- flask_restplus/fields.py | 9 +++++++++ tests/test_fields.py | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/flask_restplus/fields.py b/flask_restplus/fields.py index 6b7fdc36..b52b32ed 100644 --- a/flask_restplus/fields.py +++ b/flask_restplus/fields.py @@ -42,6 +42,10 @@ def is_indexable_but_not_string(obj): return not hasattr(obj, "strip") and hasattr(obj, "__iter__") +def is_integer_indexable(obj): + return isinstance(obj, list) or isinstance(obj, tuple) + + def get_value(key, obj, default=None): '''Helper for pulling a keyed value off various types of objects''' if isinstance(key, int): @@ -66,6 +70,11 @@ def _get_value_for_key(key, obj, default): return obj[key] except (IndexError, TypeError, KeyError): pass + if is_integer_indexable(obj): + try: + return obj[int(key)] + except (IndexError, TypeError, ValueError): + pass return getattr(obj, key, default) diff --git a/tests/test_fields.py b/tests/test_fields.py index 837e607d..3c487b5c 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1379,3 +1379,21 @@ def __getitem__(self, n): obj = Test('hi') assert fields.get_value('value', obj) == 'hi' + + def test_get_value_int_indexable_list(self): + assert fields.get_value('bar.0', {'bar': [42]}) == 42 + + def test_get_value_int_indexable_list_with_str(self): + assert fields.get_value('bar.abc', {'bar': [42]}) == None + + def test_get_value_int_indexable_nested_list(self): + assert fields.get_value('bar.0.val', {'bar': [{'val': 42}]}) == 42 + + def test_get_value_int_indexable_tuple_with_str(self): + assert fields.get_value('bar.abc', {'bar': (42, 43)}) == None + + def test_get_value_int_indexable_tuple(self): + assert fields.get_value('bar.0', {'bar': (42, 43)}) == 42 + + def test_get_value_int_indexable_nested_tuple(self): + assert fields.get_value('bar.0.val', {'bar': [{'val': 42}]}) == 42