first commit, working with tests.

new file:   .gitignore
	new file:   README.rst
	new file:   __init__.py
	new file:   nested_lookup.py
	new file:   setup.py
	new file:   test_nested_loopkup.py
This commit is contained in:
Russell Ballestrini 2015-11-06 23:30:53 -05:00
commit b530c0a586
6 changed files with 111 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
__pycache__*
*.pyc

22
README.rst Normal file
View file

@ -0,0 +1,22 @@
nested_lookup
#############
A small library for python which enables key lookups on deeply nested documents.
Documents may be built out of dictionaries (dicts) and/or lists.
:author: Russell Ballestrini
:license: Public Domain
quick start
===========
install
-------
tutorial
--------

0
__init__.py Normal file
View file

23
nested_lookup.py Normal file
View file

@ -0,0 +1,23 @@
def nested_lookup(key, document):
"""Lookup a key in a nested document, return a list of values"""
return list(_nested_lookup(key, document))
def _nested_lookup(key, document):
"""Lookup a key in a nested document, yield a value"""
if isinstance(document, list):
for d in document:
for result in _nested_lookup(key, d):
yield result
if isinstance(document, dict):
for k, v in document.iteritems():
if k == key:
yield v
elif isinstance(v, dict):
for result in _nested_lookup(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in _nested_lookup(key, d):
yield result

26
setup.py Normal file
View file

@ -0,0 +1,26 @@
# installation: pip install nested-lookup
from setuptools import setup
setup(
name = 'nested-lookup',
version = '0.0.1',
description = 'lookup a key in a deeply nested document of dicts and lists',
keywords = 'nested document dictionary dict list lookup schema json xml',
long_description = open('README.rst').read(),
author = 'Russell Ballestrini',
author_email = 'russell@ballestrini.net',
url = 'https://github.com/russellballestrini/nested-lookup',
platforms = ['All'],
license = 'Public Domain',
py_modules = ['nested_lookup'],
include_package_data = True,
)
# setup keyword args: http://peak.telecommunity.com/DevCenter/setuptools
# built and uploaded to pypi with this:
# python setup.py sdist bdist_egg register upload

38
test_nested_loopkup.py Normal file
View file

@ -0,0 +1,38 @@
from unittest import TestCase
from nested_lookup import nested_lookup
class TestNestedLookup(TestCase):
def setUp(self):
self.subject_dict = {'a':1,'b':{'d':100},'c':{'d':200}}
def test_nested_lookup(self):
results = nested_lookup('d', self.subject_dict)
self.assertEqual(2, len(results))
self.assertIn(100, results)
self.assertIn(200, results)
self.assertSetEqual({100,200}, set(results))
def test_nested_lookup_wrapped_in_list(self):
results = nested_lookup('d', [{}, self.subject_dict, {}])
self.assertEqual(2, len(results))
self.assertIn(100, results)
self.assertIn(200, results)
self.assertSetEqual({100,200}, set(results))
def test_nested_lookup_wrapped_in_list_in_dict_in_list(self):
results = nested_lookup('d', [{}, {'H' : [self.subject_dict]} ])
self.assertEqual(2, len(results))
self.assertIn(100, results)
self.assertIn(200, results)
self.assertSetEqual({100,200}, set(results))
def test_nested_lookup_wrapped_in_list_in_list(self):
results = nested_lookup('d', [ {}, [self.subject_dict, {}] ])
self.assertEqual(2, len(results))
self.assertIn(100, results)
self.assertIn(200, results)
self.assertSetEqual({100,200}, set(results))