Skip to content

Commit bc7d43a

Browse files
committed
WIP add methods set, create, setdefault
1 parent 669f652 commit bc7d43a

File tree

1 file changed

+112
-2
lines changed

1 file changed

+112
-2
lines changed

jsonpath_rw/jsonpath.py

+112-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,28 @@ def find(self, data):
2525
"""
2626
raise NotImplementedError()
2727

28+
def set(self, data, val, create_path=True):
29+
"""Sets `val` at the specified path in `data`.
30+
31+
Will create the necessary path if `create_path` is true and `create` is
32+
implemented.
33+
"""
34+
raise NotImplementedError()
35+
36+
def create(self, data):
37+
"""Creates the specified path in `data`."""
38+
raise NotImplementedError()
39+
40+
def setdefault(self, data, val, create_path=True):
41+
"""Equivalent to `set` if `find` does not return, else noop."""
42+
if not self.find(data):
43+
self.set(data, val, create_path)
44+
2845
def update(self, data, val):
2946
"""
3047
Returns `data` with the specified path replaced by `val`. Only updates
3148
if the specified path exists.
3249
"""
33-
3450
raise NotImplementedError()
3551

3652
def child(self, child):
@@ -178,6 +194,25 @@ def find(self, data):
178194
else:
179195
return Root().find(data.context)
180196

197+
def set(self, data, val, create_path=True):
198+
if not isinstance(data, DatumInContext):
199+
raise NotImplementedError(
200+
"Cannot set the root if not a `DatumInContext`."
201+
)
202+
data.value = val
203+
204+
def setdefault(self, data, val, create_path=True):
205+
if not isinstance(data, DatumInContext):
206+
raise NotImplementedError(
207+
"Cannot set the root if not a `DatumInContext`."
208+
)
209+
data.value = data.value or val
210+
211+
def create(self, data):
212+
raise NotImplementedError(
213+
"Cannot create a root path: it always exists."
214+
)
215+
181216
def update(self, data, val):
182217
return val
183218

@@ -198,6 +233,27 @@ class This(JSONPath):
198233
def find(self, datum):
199234
return [DatumInContext.wrap(datum)]
200235

236+
def set(self, data, val, create_path=True):
237+
if not isinstance(data, DatumInContext):
238+
raise NotImplementedError(
239+
"Cannot set %s if not a `DatumInContext`." % self
240+
)
241+
data.value = val
242+
243+
# NOTE: check how this updates the context and if we should worry
244+
245+
def setdefault(self, data, val, create_path=True):
246+
if not isinstance(data, DatumInContext):
247+
raise NotImplementedError(
248+
"Cannot set %s if not a `DatumInContext`." % self
249+
)
250+
data.value = data.value or val
251+
252+
def create(self, data):
253+
raise NotImplementedError(
254+
"Cannot create a '%r' path: it always exists." % self
255+
)
256+
201257
def update(self, data, val):
202258
return val
203259

@@ -231,6 +287,15 @@ def find(self, datum):
231287
if not isinstance(subdata, AutoIdForDatum)
232288
for submatch in self.right.find(subdata)]
233289

290+
def set(self, data, val, create_path=True):
291+
pass
292+
293+
def setdefault(self, data, val, create_path=True):
294+
pass
295+
296+
def create(self, data):
297+
pass
298+
234299
def update(self, data, val):
235300
for datum in self.left.find(data):
236301
self.right.update(datum.value, val)
@@ -283,6 +348,15 @@ def __init__(self, left, right):
283348
def find(self, data):
284349
return [subdata for subdata in self.left.find(data) if self.right.find(subdata)]
285350

351+
def set(self, data, val, create_path=True):
352+
pass
353+
354+
def setdefault(self, data, val, create_path=True):
355+
pass
356+
357+
def create(self, data):
358+
pass
359+
286360
def update(self, data, val):
287361
for datum in self.find(data):
288362
datum.path.update(data, val)
@@ -343,6 +417,15 @@ def match_recursively(datum):
343417
def is_singular():
344418
return False
345419

420+
def set(self, data, val, create_path=True):
421+
pass
422+
423+
def setdefault(self, data, val, create_path=True):
424+
pass
425+
426+
def create(self, data):
427+
pass
428+
346429
def update(self, data, val):
347430
# Get all left matches into a list
348431
left_matches = self.left.find(data)
@@ -420,7 +503,7 @@ def find(self, data):
420503
class Fields(JSONPath):
421504
"""
422505
JSONPath referring to some field of the current object.
423-
Concrete syntax ix comma-separated field names.
506+
Concrete syntax is a comma-separated list of field names.
424507
425508
WARNING: If '*' is any of the field names, then they will
426509
all be returned.
@@ -456,6 +539,15 @@ def find(self, datum):
456539
for field_datum in [self.get_field_datum(datum, field) for field in self.reified_fields(datum)]
457540
if field_datum is not None]
458541

542+
def set(self, data, val, create_path=True):
543+
pass
544+
545+
def setdefault(self, data, val, create_path=True):
546+
pass
547+
548+
def create(self, data):
549+
pass
550+
459551
def update(self, data, val):
460552
for field in self.reified_fields(DatumInContext.wrap(data)):
461553
if field in data:
@@ -492,6 +584,15 @@ def find(self, datum):
492584
else:
493585
return []
494586

587+
def set(self, data, val, create_path=True):
588+
pass
589+
590+
def setdefault(self, data, val, create_path=True):
591+
pass
592+
593+
def create(self, data):
594+
pass
595+
495596
def update(self, data, val):
496597
if len(data) > self.index:
497598
data[self.index] = val
@@ -547,6 +648,15 @@ def find(self, datum):
547648
else:
548649
return [DatumInContext(datum.value[i], path=Index(i), context=datum) for i in range(0, len(datum.value))[self.start:self.end:self.step]]
549650

651+
def set(self, data, val, create_path=True):
652+
pass
653+
654+
def setdefault(self, data, val, create_path=True):
655+
pass
656+
657+
def create(self, data):
658+
pass
659+
550660
def update(self, data, val):
551661
for datum in self.find(data):
552662
datum.path.update(data, val)

0 commit comments

Comments
 (0)