From 16a1f6efec264cec45bccf60cffacb0f108558ce Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Mon, 10 Jun 2019 15:50:54 +0200 Subject: [PATCH] Added get_list_item utlity method to ParseDict. --- benedict/dicts/parse.py | 15 +++++++++++++++ tests/test_dicts_benedict.py | 13 +++++++++++++ tests/test_dicts_parse_dict.py | 17 +++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/benedict/dicts/parse.py b/benedict/dicts/parse.py index 51e7eaf..bc80541 100644 --- a/benedict/dicts/parse.py +++ b/benedict/dicts/parse.py @@ -148,6 +148,21 @@ class ParseDict(dict): key, default or [], None, parse_util.parse_list, {'separator': separator}) + def get_list_item(self, key, index=0, default=None, separator=','): + """ + Get list by key or keypath and return value at the specified index. + If separator is specified and list value is a string it will be splitted. + """ + values = self.get_list(key, None, separator) + if values: + try: + value = values[index] + return value + except IndexError: + return default + else: + return default + def get_slug(self, key, default='', options=None): """ Get value by key or keypath trying to return it as slug. diff --git a/tests/test_dicts_benedict.py b/tests/test_dicts_benedict.py index ce888c1..e3c931a 100644 --- a/tests/test_dicts_benedict.py +++ b/tests/test_dicts_benedict.py @@ -124,6 +124,19 @@ class BenedictTestCase(unittest.TestCase): self.assertTrue(isinstance(b.get_dict('a'), benedict)) self.assertEqual(b.get('a.x'), 1) + def test_get_list_item(self): + d = { + 'a': { + 'b': { + 'c': 1, + } + }, + } + b = benedict(d) + self.assertTrue(isinstance(b.get_dict('a'), benedict)) + self.assertTrue(isinstance(b.get_dict('a.b'), benedict)) + self.assertEqual(b.get('a.b.c'), 1) + def test_get(self): d = { 'a': 1, diff --git a/tests/test_dicts_parse_dict.py b/tests/test_dicts_parse_dict.py index c96301c..5b374f5 100644 --- a/tests/test_dicts_parse_dict.py +++ b/tests/test_dicts_parse_dict.py @@ -300,6 +300,23 @@ class ParseDictTestCase(unittest.TestCase): self.assertEqual(b.get_list('d', separator=','), []) self.assertEqual(b.get_list('e', [0], separator=','), [0]) + def test_get_list_item(self): + d = { + 'a': (1, 2, 3, 4, 5, ), + 'b': [6, 7, 8, 9, 0], + 'c': {}, + } + b = ParseDict(d) + self.assertEqual(b.get_list_item('a'), 1) + self.assertEqual(b.get_list_item('a', index=1), 2) + self.assertEqual(b.get_list_item('a', index=-1), 5) + self.assertEqual(b.get_list_item('a', index=10), None) + self.assertEqual(b.get_list_item('b'), 6) + self.assertEqual(b.get_list_item('b', index=1), 7) + self.assertEqual(b.get_list_item('b', index=-1), 0) + self.assertEqual(b.get_list_item('b', index=10), None) + self.assertEqual(b.get_list_item('c', index=1), None) + def test_get_slug(self): d = { 'a': ' Hello World ',