Merge pull request #5 from rameshrvr/master

Addition of new feature (get_all_keys)
This commit is contained in:
Russell Ballestrini 2018-09-25 10:27:46 -07:00 committed by GitHub
commit 7260463455
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 159 additions and 4 deletions

View file

@ -4,7 +4,9 @@ nested_lookup
.. image:: https://img.shields.io/badge/pypi-0.1.5-green.svg .. image:: https://img.shields.io/badge/pypi-0.1.5-green.svg
:target: https://pypi.python.org/pypi/nested-lookup :target: https://pypi.python.org/pypi/nested-lookup
A small Python library which enables key lookups on deeply nested documents. A small Python library which enables:
1. key lookups on deeply nested documents.
2. fetching all keys from a nested dictionary.
Documents may be built out of dictionaries (dicts) and/or lists. Documents may be built out of dictionaries (dicts) and/or lists.
@ -42,6 +44,11 @@ quick tutorial
>>> print(nested_lookup('taco', document)) >>> print(nested_lookup('taco', document))
[42, 69] [42, 69]
>>> from nested_lookup import get_all_keys
>>> get_all_keys(document)
['taco', 'salsa', 'burrito', 'taco']
longer tutorial longer tutorial
=============== ===============
@ -109,6 +116,36 @@ Additionally, if you also needed the matched key names, you could do this:
} }
Tutorial to get all keys from a nested dictionary
.. code-block:: python
sample_data = {
"hardware_details": {
"model_name": "MacBook Pro",
"processor_details": {
"processor_name": "Intel Core i7",
"processor_speed": "2.7 GHz",
"core_details": {
"total_numberof_cores": "4",
"l2_cache(per_core)": "256 KB"
}
},
"total_number_of_cores": "4",
"memory": "16 GB",
},
"os_details": {
"product_version": "10.13.6",
"build_version": "17G65"
},
"name": "Test",
"date": "YYYY-MM-DD HH:MM:SS"
}
result = get_all_keys(sample_data)
print(result)
misc misc
======== ========

View file

@ -1 +1 @@
from .nested_lookup import nested_lookup from .nested_lookup import nested_lookup, get_all_keys

View file

@ -32,3 +32,29 @@ def _nested_lookup(key, document, wild=False, with_keys=False):
for d in v: for d in v:
for result in _nested_lookup(key, d, wild=wild, with_keys=with_keys): for result in _nested_lookup(key, d, wild=wild, with_keys=with_keys):
yield result yield result
def get_all_keys(dictionary):
"""
Method to get all keys from a nested dictionary as a List
Args:
dictionary: Nested dictionary
Returns:
List of keys in the dictionary
"""
result_list = []
def recrusion(dictionary):
for key, value in iteritems(dictionary):
if isinstance(value, dict):
result_list.append(key)
recrusion(dictionary=value)
elif isinstance(value, list):
result_list.append(key)
for list_items in value:
recrusion(dictionary=list_items)
else:
result_list.append(key)
recrusion(dictionary=dictionary)
return result_list

View file

@ -13,7 +13,7 @@ with open('requirements.txt', 'r') as f:
setup( setup(
name = 'nested-lookup', name = 'nested-lookup',
version = '0.1.5', version = '0.1.6',
description = 'lookup a key in a deeply nested document of dicts and lists', description = 'lookup a key in a deeply nested document of dicts and lists',
keywords = 'nested document dictionary dict list lookup schema json xml yaml', keywords = 'nested document dictionary dict list lookup schema json xml yaml',
long_description = open('README.rst').read(), long_description = open('README.rst').read(),

View file

@ -1,6 +1,7 @@
from unittest import TestCase from unittest import TestCase
from nested_lookup import nested_lookup from nested_lookup import nested_lookup, get_all_keys
class TestNestedLookup(TestCase): class TestNestedLookup(TestCase):
@ -75,3 +76,94 @@ class TestNestedLookup(TestCase):
self.assertEqual(2, len(matches['d'])) self.assertEqual(2, len(matches['d']))
self.assertSetEqual({100,200}, set(matches['d'])) self.assertSetEqual({100,200}, set(matches['d']))
class TestGetAllKeys(TestCase):
def setUp(self):
self.sample1 = {
"hardware_details": {
"model_name": "MacBook Pro",
"processor_details": {
"processor_name": "Intel Core i7",
"processor_speed": "2.7 GHz",
"core_details": {
"total_numberof_cores": "4",
"l2_cache(per_core)": "256 KB"
}
},
"total_number_of_cores": "4",
"memory": "16 GB",
},
"os_details": {
"product_version": "10.13.6",
"build_version": "17G65"
},
"name": "Test",
"date": "YYYY-MM-DD HH:MM:SS"
}
self.sample2 = {
"hardware_details": {
"model_name": "MacBook Pro",
"processor_details": [{
"processor_name": "Intel Core i7",
"processor_speed": "2.7 GHz",
"core_details": {
"total_numberof_cores": "4",
"l2_cache(per_core)": "256 KB"
}
}],
"total_number_of_cores": "4",
"memory": "16 GB",
}
}
self.sample3 = {
"hardware_details": {
"model_name": "MacBook Pro",
"processor_details": [
{
"processor_name": "Intel Core i7",
"processor_speed": "2.7 GHz",
},
{
"total_numberof_cores": "4",
"l2_cache(per_core)": "256 KB"
}
],
"total_number_of_cores": "4",
"memory": "16 GB",
}
}
def test_sample_data1(self):
result = get_all_keys(self.sample1)
self.assertEqual(15, len(result))
keys_to_verify = [
'model_name', 'core_details', 'l2_cache(per_core)',
'build_version', 'date'
]
for key in keys_to_verify:
self.assertIn(key, result)
def test_sample_data2(self):
result = get_all_keys(self.sample2)
self.assertEqual(10, len(result))
keys_to_verify = [
'hardware_details', 'processor_speed',
'total_numberof_cores', 'memory'
]
for key in keys_to_verify:
self.assertIn(key, result)
def test_sample_data3(self):
result = get_all_keys(self.sample3)
self.assertEqual(9, len(result))
keys_to_verify = [
'processor_details', 'processor_name',
'l2_cache(per_core)', 'total_number_of_cores'
]
for key in keys_to_verify:
self.assertIn(key, result)
if __name__ == '__main__':
pass