@@ -25,12 +25,28 @@ def find(self, data):
25
25
"""
26
26
raise NotImplementedError ()
27
27
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
+
28
45
def update (self , data , val ):
29
46
"""
30
47
Returns `data` with the specified path replaced by `val`. Only updates
31
48
if the specified path exists.
32
49
"""
33
-
34
50
raise NotImplementedError ()
35
51
36
52
def child (self , child ):
@@ -178,6 +194,25 @@ def find(self, data):
178
194
else :
179
195
return Root ().find (data .context )
180
196
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
+
181
216
def update (self , data , val ):
182
217
return val
183
218
@@ -198,6 +233,27 @@ class This(JSONPath):
198
233
def find (self , datum ):
199
234
return [DatumInContext .wrap (datum )]
200
235
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
+
201
257
def update (self , data , val ):
202
258
return val
203
259
@@ -231,6 +287,15 @@ def find(self, datum):
231
287
if not isinstance (subdata , AutoIdForDatum )
232
288
for submatch in self .right .find (subdata )]
233
289
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
+
234
299
def update (self , data , val ):
235
300
for datum in self .left .find (data ):
236
301
self .right .update (datum .value , val )
@@ -283,6 +348,15 @@ def __init__(self, left, right):
283
348
def find (self , data ):
284
349
return [subdata for subdata in self .left .find (data ) if self .right .find (subdata )]
285
350
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
+
286
360
def update (self , data , val ):
287
361
for datum in self .find (data ):
288
362
datum .path .update (data , val )
@@ -343,6 +417,15 @@ def match_recursively(datum):
343
417
def is_singular ():
344
418
return False
345
419
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
+
346
429
def update (self , data , val ):
347
430
# Get all left matches into a list
348
431
left_matches = self .left .find (data )
@@ -420,7 +503,7 @@ def find(self, data):
420
503
class Fields (JSONPath ):
421
504
"""
422
505
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.
424
507
425
508
WARNING: If '*' is any of the field names, then they will
426
509
all be returned.
@@ -456,6 +539,15 @@ def find(self, datum):
456
539
for field_datum in [self .get_field_datum (datum , field ) for field in self .reified_fields (datum )]
457
540
if field_datum is not None ]
458
541
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
+
459
551
def update (self , data , val ):
460
552
for field in self .reified_fields (DatumInContext .wrap (data )):
461
553
if field in data :
@@ -492,6 +584,15 @@ def find(self, datum):
492
584
else :
493
585
return []
494
586
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
+
495
596
def update (self , data , val ):
496
597
if len (data ) > self .index :
497
598
data [self .index ] = val
@@ -547,6 +648,15 @@ def find(self, datum):
547
648
else :
548
649
return [DatumInContext (datum .value [i ], path = Index (i ), context = datum ) for i in range (0 , len (datum .value ))[self .start :self .end :self .step ]]
549
650
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
+
550
660
def update (self , data , val ):
551
661
for datum in self .find (data ):
552
662
datum .path .update (data , val )
0 commit comments