summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelly <skelly@dimagi.com>2021-06-24 11:21:42 +0200
committerSimon Kelly <skelly@dimagi.com>2021-06-24 11:21:55 +0200
commit08231fb66f73b83a2b5a1acc2abef49ca3be3b4c (patch)
tree6c99504715ad60f36ea9edd3a926541cddfe7743
parent749d123ab37a0fa7593f50058a90f6fa477dcc51 (diff)
downloadjsonpath-rw-08231fb66f73b83a2b5a1acc2abef49ca3be3b4c.tar.gz
don't clobber IDs if they exist
If a field exists with the name of the `auto_id_field` it should be used as is without converting it to an AutoID. The auto ID functionality should only kick in if and ID field does not exist.
-rw-r--r--jsonpath_rw/jsonpath.py15
-rw-r--r--tests/test_jsonpath.py8
2 files changed, 11 insertions, 12 deletions
diff --git a/jsonpath_rw/jsonpath.py b/jsonpath_rw/jsonpath.py
index c47653e..1d4ac4c 100644
--- a/jsonpath_rw/jsonpath.py
+++ b/jsonpath_rw/jsonpath.py
@@ -430,14 +430,13 @@ class Fields(JSONPath):
self.fields = fields
def get_field_datum(self, datum, field):
- if field == auto_id_field:
- return AutoIdForDatum(datum)
- else:
- try:
- field_value = datum.value[field] # Do NOT use `val.get(field)` since that confuses None as a value and None due to `get`
- return DatumInContext(value=field_value, path=Fields(field), context=datum)
- except (TypeError, KeyError, AttributeError):
- return None
+ try:
+ field_value = datum.value[field] # Do NOT use `val.get(field)` since that confuses None as a value and None due to `get`
+ return DatumInContext(value=field_value, path=Fields(field), context=datum)
+ except (TypeError, KeyError, AttributeError):
+ if field == auto_id_field:
+ return AutoIdForDatum(datum)
+ return None
def reified_fields(self, datum):
if '*' not in self.fields:
diff --git a/tests/test_jsonpath.py b/tests/test_jsonpath.py
index 271e2bc..8f4ae3c 100644
--- a/tests/test_jsonpath.py
+++ b/tests/test_jsonpath.py
@@ -244,7 +244,7 @@ class TestJsonPath(unittest.TestCase):
('*.id',
{'foo':{'id': 1},
'baz': 2},
- set(['1', 'baz'])) ])
+ set([1, 'baz'])) ])
def test_root_auto_id(self):
jsonpath.auto_id_field = 'id'
@@ -276,8 +276,8 @@ class TestJsonPath(unittest.TestCase):
{'a': 'a1'}, {'a': 'a2', 'id': 'a2id'}
]
}
- self.check_cases([('m.[1].id', data, ['1.m.a2id']),
- ('m.[1].$.b.id', data, ['1.bid']),
+ self.check_cases([('m.[1].id', data, ['a2id']),
+ ('m.[1].$.b.id', data, ['bid']),
('m.[0].id', data, ['1.m.[0]'])])
def test_slice_auto_id(self):
@@ -290,7 +290,7 @@ class TestJsonPath(unittest.TestCase):
self.check_cases([('foo.baz.id', {'foo': {'baz': 3}}, ['foo.baz']),
('foo.baz.id', {'foo': {'baz': [3]}}, ['foo.baz']),
('foo.baz.id', {'foo': {'id': 'bizzle', 'baz': 3}}, ['bizzle.baz']),
- ('foo.baz.id', {'foo': {'baz': {'id': 'hi'}}}, ['foo.hi']),
+ ('foo.baz.id', {'foo': {'baz': {'id': 'hi'}}}, ['hi']),
('foo.baz.bizzle.id', {'foo': {'baz': {'bizzle': 5}}}, ['foo.baz.bizzle'])])
def test_descendants_auto_id(self):