def test_get_entity_order(self): data = {'id': 1, 'title': 'One', 'baz': {'id': 1}} norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('bar', 'baz') norm._get_entity_order('foo', data) self.assertEqual(norm.entity_order, ['bar'])
def test_base_data(self): norm = Normalize() norm.define_primary('foo') self.assertEqual(norm._base_data(), ('foo', 'id', { 'entities': { 'foo': {} }, 'results': [] }))
def test_process_remove(self): data = {'id': 1, 'title': 'One', 'baz': {'id': 1}} norm = Normalize() norm.define_primary('foo') norm.remove_flds('foo', 'title') norm.remove_flds('foo', 'asdf') self.assertEqual(norm._process_data_changes('foo', data), { 'baz': { 'id': 1 }, 'id': 1 })
def test_process_data_changes(self): data = {'id': 1, 'title': 'One', 'baz': {'id': 1}} norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('bar', 'baz') self.assertEqual(norm._process_data_changes('baz', data), data) norm.rename_flds('foo', 'title', 'heading') self.assertEqual(norm._process_data_changes('foo', data), { 'baz': { 'id': 1 }, 'id': 1, 'heading': 'One' })
def test_remove_flds(self): norm = Normalize() norm.define_primary('foo') norm.remove_flds('foo', 'title') self.assertEqual(norm.parse([{ 'id': 1, 'title': 'One' }]), { 'entities': { 'foo': { 1: { 'id': 1 } } }, 'results': [1] })
def test_new_key_failure(self): data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 2 }, { 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.add_one_to_many_key('asdf', 'qwer', 'foo', 'bar') try: norm.parse(data) self.assertTrue(False) except ValueError: self.assertTrue(True)
def test_swap_failure(self): data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 2 }, { 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.swap_primary('blah') try: norm.parse(data) self.assertTrue(False) except ValueError: self.assertTrue(True)
def test_define_nested_entity(self): norm = Normalize() try: norm.define_nested_entity('foo', 'bar') self.assertTrue(False) except ValueError: self.assertTrue(True) norm.define_primary('foo') norm.define_nested_entity('bar', 'foo') self.assertEqual(norm.entities, { 'foo': { 'entities': { 'bar': { 'id': 'id', 'key': 'foo' } }, 'id': 'id' } }) norm.define_nested_entity('name', 'key', 'id') self.assertEqual( norm.entities, { 'foo': { 'entities': { 'bar': { 'id': 'id', 'key': 'foo' }, 'name': { 'id': 'id', 'key': 'key' } }, 'id': 'id' } })
def test_define_primary(self): norm = Normalize() norm.define_primary('foo') self.assertEqual(norm.entities, {'foo': {'entities': {}, 'id': 'id'}}) norm = Normalize() norm.define_primary('foo', 'bar') self.assertEqual(norm.entities, {'foo': {'entities': {}, 'id': 'bar'}}) try: norm.define_primary('bar') self.assertTrue(False) except ValueError: self.assertTrue(True)
{'id': 6, 'street': '106 somewhere lane', 'city': 'somewhereville', 'state': 'Kansas'} ] } }, {'id': 3, 'title': 'Some Other Article', 'author': { 'id': 3, 'name': 'Ben' } }, {'id': 4, 'title': 'Some Other Article'} ] # init norm = Normalize() # set the top level name norm.define_primary('articles') # define an entity and key to flatten. Optionally pass the id field as the thrid # positional argument, or 'id' will be used instead. Multiple nested entities are # recursively searched for. norm.define_nested_entity('users', 'author') norm.define_nested_entity('addresses', 'address') # rename fields for a given entity name # norm.rename_flds('addresses', 'street', 'road') # remove fields for a given entity name # norm.remove_flds('addresses', 'city') # entities nested multiple times require the depth to be defined so there is no
def test_parse(self): norm = Normalize() norm.define_primary('test', 'ID') try: norm.parse([{'id': 1, 'title': 'Some Article'}]) self.assertTrue(False) except ValueError: self.assertTrue(True) norm = Normalize() norm.define_primary('test') self.assertEqual( norm.parse([{ 'id': 1, 'title': 'Some Article' }]), { 'entities': { 'test': { 1: { 'id': 1, 'title': 'Some Article' } } }, 'results': [1] }) norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('bar', 'baz') norm.define_nested_entity('asdf', 'qwer') self.assertEqual(norm.parse([]), None) self.assertEqual( norm.parse([{ 'id': 1, 'title': 'One', 'baz': { 'id': 1 } }, { 'id': 2, 'title': 'Two', 'baz': { 'id': 2 } }]), { 'entities': { 'foo': { 1: { 'baz': [1], 'id': 1, 'title': 'One' }, 2: { 'baz': [2], 'id': 2, 'title': 'Two' } }, 'asdf': {}, 'bar': { 1: { 'id': 1 }, 2: { 'id': 2 } } }, 'results': [1, 2] }) data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 2 }, { 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('test', 'baz') self.assertEqual( norm.parse(data), { 'entities': { 'test': { 1: { 'bar': { 'id': 1 }, 'id': 1 }, 2: { 'id': 2 } }, 'foo': { 1: { 'baz': [2, 1], 'id': 1, 'title': 'One' } } }, 'results': [1] }) data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 2 }, { 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('test', 'baz') norm.swap_primary('test') self.assertEqual( norm.parse(data), { 'entities': { 'test': { 1: { 'bar': { 'id': 1 }, 'id': 1 }, 2: { 'id': 2 } }, 'foo': { 1: { 'baz': [2, 1], 'id': 1, 'title': 'One' } } }, 'results': [1, 2] }) data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 2 }, { 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('test', 'baz') norm.swap_primary('test') norm.add_one_to_many_key('foo_ids', 'id', 'test', 'foo') self.assertEqual( norm.parse(data), { 'entities': { 'test': { 1: { 'foo_ids': [1], 'bar': { 'id': 1 }, 'id': 1 }, 2: { 'foo_ids': [], 'id': 2 } }, 'foo': { 1: { 'baz': [2, 1], 'id': 1, 'title': 'One' } } }, 'results': [1, 2] }) data = [{ 'id': 1, 'title': 'One', 'baz': [{ 'id': 1, 'bar': { 'id': 1 } }] }] norm = Normalize() norm.define_primary('foo') norm.define_nested_entity('test', 'baz') self.assertEqual( norm.parse(data), { 'entities': { 'test': { 1: { 'bar': { 'id': 1 }, 'id': 1 } }, 'foo': { 1: { 'baz': [1], 'id': 1, 'title': 'One' } } }, 'results': [1] })
'id': 3, 'title': 'Some Other Article', 'author': { 'id': 3, 'name': 'Ben' } }, { 'id': 4, 'title': 'Some Other Article' }] # init norm = Normalize() # set the top level name norm.define_primary('articles') # define an entity and key to flatten. Optionally pass the id field as the thrid # positional argument, or 'id' will be used instead. Multiple nested entities are # recursively searched for. norm.define_nested_entity('users', 'author') norm.define_nested_entity('addresses', 'address') # rename fields for a given entity name # norm.rename_flds('addresses', 'street', 'road') # remove fields for a given entity name # norm.remove_flds('addresses', 'city') # entities nested multiple times require the depth to be defined so there is no # data loss. If not set, the code will dynamically determine the depth, but only