From 48c357c88ac5f349e8f2257683126b1cf1ccdc47 Mon Sep 17 00:00:00 2001 From: Arunprasad Rajkumar Date: Tue, 17 Mar 2020 20:07:21 +0530 Subject: [PATCH 1/3] fix: Unable to access nested list property --- flask_restx/fields.py | 9 +++++++++ tests/test_fields.py | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/flask_restx/fields.py b/flask_restx/fields.py index a9da9b93..a8786d35 100644 --- a/flask_restx/fields.py +++ b/flask_restx/fields.py @@ -66,6 +66,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): @@ -91,6 +95,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 c154a972..4cf3e2ca 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1369,3 +1369,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 From b6e13ef24aca9b6bca6d05280e06bb566d59f349 Mon Sep 17 00:00:00 2001 From: Arunprasad Rajkumar Date: Mon, 1 Jun 2020 20:14:59 +0530 Subject: [PATCH 2/3] Update tests/test_fields.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Antonio Haro Peralta --- tests/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index 4cf3e2ca..a38c3a16 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1374,7 +1374,7 @@ 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 + assert fields.get_value('bar.abc', {'bar': [42]}) is None def test_get_value_int_indexable_nested_list(self): assert fields.get_value('bar.0.val', {'bar': [{'val': 42}]}) == 42 From d650d2fc3e733609d878b791e75a2d47743cda77 Mon Sep 17 00:00:00 2001 From: Arunprasad Rajkumar Date: Mon, 1 Jun 2020 20:15:07 +0530 Subject: [PATCH 3/3] Update tests/test_fields.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Antonio Haro Peralta --- tests/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index a38c3a16..0405256e 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1380,7 +1380,7 @@ 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 + assert fields.get_value('bar.abc', {'bar': (42, 43)}) is None def test_get_value_int_indexable_tuple(self): assert fields.get_value('bar.0', {'bar': (42, 43)}) == 42