Skip to content

Commit cd6e5e0

Browse files
committed
rename delete to exclude
1 parent 4cea752 commit cd6e5e0

File tree

3 files changed

+69
-45
lines changed

3 files changed

+69
-45
lines changed

README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ Then:
4242
>>> jsonpath_expr.update({'foo': [{'baz': 1}, {'baz': 2}]}, 3)
4343
{'foo': [{'baz': 3}, {'baz': 3}]}
4444
45-
# Delete values
46-
>>> jsonpath_expr.delete({'foo': [{'baz': 1}, {'baz': 2}]})
45+
# Exclude values
46+
>>> jsonpath_expr.exclude({'foo': [{'baz': 1}, {'baz': 2}]})
4747
{'foo': []}
4848
4949
# Matches remember where they came from

jsonpath_rw/jsonpath.py

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,18 @@ def child(self, child):
4646
else:
4747
return Child(self, child)
4848

49-
def delete(self, data):
49+
def exclude(self, data):
50+
"""
51+
Returns `data` without the specified path
52+
"""
53+
raise NotImplementedError()
54+
55+
def include(self, data):
56+
"""
57+
Returns `data` with the specified path
58+
:param data:
59+
:return:
60+
"""
5061
raise NotImplementedError()
5162

5263
def make_datum(self, value):
@@ -184,9 +195,12 @@ def find(self, data):
184195
def update(self, data, val):
185196
return val
186197

187-
def delete(self, data):
198+
def exclude(self, data):
188199
return None
189200

201+
def include(self, data):
202+
return data
203+
190204
def __str__(self):
191205
return '$'
192206

@@ -207,9 +221,12 @@ def find(self, datum):
207221
def update(self, data, val):
208222
return val
209223

210-
def delete(self, data):
224+
def exclude(self, data):
211225
return None
212226

227+
def include(self, data):
228+
return data
229+
213230
def __str__(self):
214231
return '`this`'
215232

@@ -245,9 +262,9 @@ def update(self, data, val):
245262
self.right.update(datum.value, val)
246263
return data
247264

248-
def delete(self, data):
265+
def exclude(self, data):
249266
for datum in self.left.find(data):
250-
self.right.delete(datum.value)
267+
self.right.exclude(datum.value)
251268
return data
252269

253270
def __eq__(self, other):
@@ -302,9 +319,9 @@ def update(self, data, val):
302319
datum.path.update(data, val)
303320
return data
304321

305-
def delete(self, data):
322+
def exclude(self, data):
306323
for path in reversed([datum.path for datum in self.find(data)]):
307-
path.delete(data)
324+
path.exclude(data)
308325

309326
return data
310327

@@ -363,7 +380,7 @@ def match_recursively(datum):
363380
def is_singular(self):
364381
return False
365382

366-
def _modify(self, data, val = None, delete = False):
383+
def _modify(self, data, val = None, exclude = False):
367384
# Get all left matches into a list
368385
left_matches = self.left.find(data)
369386
if not isinstance(left_matches, list):
@@ -374,8 +391,8 @@ def modify_recursively(data):
374391
if not (isinstance(data, list) or isinstance(data, dict)):
375392
return
376393

377-
if delete:
378-
self.right.delete(data)
394+
if exclude:
395+
self.right.exclude(data)
379396
else:
380397
self.right.update(data, val)
381398

@@ -394,10 +411,10 @@ def modify_recursively(data):
394411
return data
395412

396413
def update(self, data, val):
397-
return self._modify(data, val, delete = False)
414+
return self._modify(data, val, exclude = False)
398415

399-
def delete(self, data):
400-
return self._modify(data, None, delete = True)
416+
def exclude(self, data):
417+
return self._modify(data, None, exclude = True)
401418

402419
def __str__(self):
403420
return '%s..%s' % (self.left, self.right)
@@ -430,9 +447,9 @@ def update(self, data, val):
430447
self.right.update(data, val)
431448
return data
432449

433-
def delete(self, data):
434-
self.left.delete(data)
435-
self.right.delete(data)
450+
def exclude(self, data):
451+
self.left.exclude(data)
452+
self.right.exclude(data)
436453
return data
437454

438455
class Intersect(JSONPath):
@@ -501,7 +518,7 @@ def update(self, data, val):
501518
data[field] = val
502519
return data
503520

504-
def delete(self, data):
521+
def exclude(self, data):
505522
for field in self.reified_fields(DatumInContext.wrap(data)):
506523
if field in data:
507524
del data[field]
@@ -542,7 +559,7 @@ def update(self, data, val):
542559
data[self.index] = val
543560
return data
544561

545-
def delete(self, data):
562+
def exclude(self, data):
546563
if data is not None and len(data) > self.index:
547564
del data[self.index]
548565
return data
@@ -602,9 +619,9 @@ def update(self, data, val):
602619
datum.path.update(data, val)
603620
return data
604621

605-
def delete(self, data):
622+
def exclude(self, data):
606623
for path in reversed([datum.path for datum in self.find(data)]):
607-
path.delete(data)
624+
path.exclude(data)
608625

609626
return data
610627

tests/test_jsonpath.py

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -370,15 +370,15 @@ def test_update_slice(self):
370370
(['foo', 'bar', 'baz'], '[0:2]', 'test', ['test', 'test', 'baz'])
371371
])
372372

373-
def check_delete_cases(self, test_cases):
373+
def check_exclude_cases(self, test_cases):
374374
for original, string, expected in test_cases:
375-
logging.debug('parse("%s").delete(%s) =?= %s' % (string, original, expected))
376-
actual = parse(string).delete(original)
375+
logging.debug('parse("%s").exclude(%s) =?= %s' % (string, original, expected))
376+
actual = parse(string).exclude(original)
377377
assert actual == expected
378378

379-
def test_delete_fields(self):
379+
def test_exclude_fields(self):
380380
jsonpath.auto_id_field = None
381-
self.check_delete_cases([
381+
self.check_exclude_cases([
382382
({'foo': 'baz'}, 'foo', {}),
383383
({'foo': 1, 'baz': 2}, 'foo', {'baz': 2}),
384384
({'foo': 1, 'baz': 2}, 'foo,baz', {}),
@@ -387,13 +387,13 @@ def test_delete_fields(self):
387387
({'foo': 1, 'baz': 2}, '*', {})
388388
])
389389

390-
def test_delete_root(self):
391-
self.check_delete_cases([
390+
def test_exclude_root(self):
391+
self.check_exclude_cases([
392392
('foo', '$', None),
393393
])
394394

395-
def test_delete_this(self):
396-
self.check_delete_cases([
395+
def test_exclude_this(self):
396+
self.check_exclude_cases([
397397
('foo', '`this`', None),
398398
({}, '`this`', None),
399399
({'foo': 1}, '`this`', None),
@@ -403,47 +403,47 @@ def test_delete_this(self):
403403
({'foo': {'bar': 1, 'baz': 2}}, 'foo.`this`.bar', {'foo': {'baz': 2}})
404404
])
405405

406-
def test_delete_child(self):
407-
self.check_delete_cases([
406+
def test_exclude_child(self):
407+
self.check_exclude_cases([
408408
({'foo': 'bar'}, '$.foo', {}),
409409
({'foo': 'bar'}, 'foo', {}),
410410
({'foo': {'bar': 1}}, 'foo.bar', {'foo': {}}),
411411
({'foo': {'bar': 1}}, 'foo.$.foo.bar', {'foo': {}})
412412
])
413413

414-
def test_delete_where(self):
415-
self.check_delete_cases([
414+
def test_exclude_where(self):
415+
self.check_exclude_cases([
416416
({'foo': {'bar': {'baz': 1}}, 'bar': {'baz': 2}},
417417
'*.bar where none', {'foo': {'bar': {'baz': 1}}, 'bar': {'baz': 2}}),
418418

419419
({'foo': {'bar': {'baz': 1}}, 'bar': {'baz': 2}},
420420
'*.bar where baz', {'foo': {}, 'bar': {'baz': 2}})
421421
])
422422

423-
def test_delete_descendants(self):
424-
self.check_delete_cases([
423+
def test_exclude_descendants(self):
424+
self.check_exclude_cases([
425425
({'somefield': 1}, '$..somefield', {}),
426426
({'outer': {'nestedfield': 1}}, '$..nestedfield', {'outer': {}}),
427427
({'outs': {'bar': 1, 'ins': {'bar': 9}}, 'outs2': {'bar': 2}},
428428
'$..bar',
429429
{'outs': {'ins': {}}, 'outs2': {}})
430430
])
431431

432-
def test_delete_descendants_where(self):
433-
self.check_delete_cases([
432+
def test_exclude_descendants_where(self):
433+
self.check_exclude_cases([
434434
({'foo': {'bar': 1, 'flag': 1}, 'baz': {'bar': 2}},
435435
'(* where flag) .. bar',
436436
{'foo': {'flag': 1}, 'baz': {'bar': 2}})
437437
])
438438

439-
def test_delete_union(self):
440-
self.check_delete_cases([
439+
def test_exclude_union(self):
440+
self.check_exclude_cases([
441441
({'foo': 1, 'bar': 2}, 'foo | bar', {}),
442442
({'foo': 1, 'bar': 2, 'baz': 3}, 'foo | bar', {'baz': 3}),
443443
])
444444

445-
def test_delete_index(self):
446-
self.check_delete_cases([
445+
def test_exclude_index(self):
446+
self.check_exclude_cases([
447447
([42], '[0]', []),
448448
([42], '[5]', [42]),
449449
([34, 65, 29, 59], '[2]', [34, 65, 59]),
@@ -452,11 +452,18 @@ def test_delete_index(self):
452452
(['foo', 'bar', 'baz'], '[0]', ['bar', 'baz']),
453453
])
454454

455-
def test_delete_slice(self):
456-
self.check_delete_cases([
455+
def test_exclude_slice(self):
456+
self.check_exclude_cases([
457457
(['foo', 'bar', 'baz'], '[0:2]', ['baz']),
458458
(['foo', 'bar', 'baz'], '[0:1]', ['bar', 'baz']),
459459
(['foo', 'bar', 'baz'], '[0:]', []),
460460
(['foo', 'bar', 'baz'], '[:2]', ['baz']),
461461
(['foo', 'bar', 'baz'], '[:3]', [])
462462
])
463+
464+
def check_include_cases(self, test_cases):
465+
for original, string, expected in test_cases:
466+
logging.debug('parse("%s").exclude(%s) =?= %s' % (string, original, expected))
467+
actual = parse(string).include(original)
468+
assert actual == expected
469+

0 commit comments

Comments
 (0)