jsonpointer 3.1.1__py3-none-any.whl → 3.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,104 @@
1
+ #!python
2
+
3
+
4
+ import argparse
5
+ import json
6
+ import sys
7
+
8
+ import jsonpointer
9
+
10
+ parser = argparse.ArgumentParser(
11
+ description='Resolve a JSON pointer on JSON files')
12
+
13
+ # Accept pointer as option, as file or as first positional argument
14
+ ptr_group = parser.add_mutually_exclusive_group()
15
+
16
+ ptr_group.add_argument('-f', '--pointer-file', type=argparse.FileType('r'),
17
+ help='File containing a JSON pointer expression')
18
+
19
+ ptr_group.add_argument('-p', '--pointer', type=str,
20
+ help='A JSON pointer expression')
21
+
22
+ parser.add_argument('POINTER', type=str, nargs='?',
23
+ help='A JSON pointer expression (if neither -f nor -p '
24
+ 'is given)')
25
+
26
+ parser.add_argument('FILE', type=str, nargs='+',
27
+ help='Files for which the pointer should be resolved')
28
+ parser.add_argument('--indent', type=int, default=None,
29
+ help='Indent output by n spaces')
30
+ parser.add_argument('-v', '--version', action='version',
31
+ version='%(prog)s ' + jsonpointer.__version__)
32
+
33
+
34
+ def main():
35
+ try:
36
+ ok = resolve_files()
37
+ except KeyboardInterrupt:
38
+ sys.exit(1)
39
+
40
+ if not ok:
41
+ sys.exit(1)
42
+
43
+
44
+ def parse_pointer(args):
45
+ """ Return the pointer and the list of files to resolve it on
46
+
47
+ If the pointer is given via -f or -p, a POINTER positional argument is
48
+ actually the first file. """
49
+ files = args.FILE
50
+
51
+ if args.pointer is not None or args.pointer_file is not None:
52
+ if args.POINTER is not None:
53
+ files = [args.POINTER] + files
54
+
55
+ if args.pointer is not None:
56
+ ptr = args.pointer
57
+ else:
58
+ ptr = args.pointer_file.read().strip()
59
+
60
+ elif args.POINTER is not None:
61
+ ptr = args.POINTER
62
+
63
+ else:
64
+ parser.error('a JSON pointer is required (POINTER, -p or -f)')
65
+
66
+ # Catches e.g. `jsonpointer a.json b.json`, where the pointer was omitted
67
+ # and the first file would otherwise be used as the pointer
68
+ try:
69
+ jsonpointer.JsonPointer(ptr)
70
+ except jsonpointer.JsonPointerException as e:
71
+ parser.error('invalid JSON pointer %r: %s' % (ptr, e))
72
+
73
+ return ptr, files
74
+
75
+
76
+ def resolve_files():
77
+ """ Resolve a JSON pointer on JSON files
78
+
79
+ Returns False if the pointer could not be resolved on at least one
80
+ file. """
81
+ args = parser.parse_args()
82
+
83
+ ptr, files = parse_pointer(args)
84
+ ok = True
85
+
86
+ for name in files:
87
+ try:
88
+ f = argparse.FileType('r')(name)
89
+ except argparse.ArgumentTypeError as e:
90
+ parser.error(str(e))
91
+
92
+ doc = json.load(f)
93
+ try:
94
+ result = jsonpointer.resolve_pointer(doc, ptr)
95
+ print(json.dumps(result, indent=args.indent))
96
+ except jsonpointer.JsonPointerException as e:
97
+ print('Could not resolve pointer: %s' % str(e), file=sys.stderr)
98
+ ok = False
99
+
100
+ return ok
101
+
102
+
103
+ if __name__ == "__main__":
104
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jsonpointer
3
- Version: 3.1.1
3
+ Version: 3.2.0
4
4
  Summary: Identify specific nodes in a JSON document (RFC 6901)
5
5
  Home-page: https://github.com/stefankoegl/python-json-pointer
6
6
  Author: Stefan Kögl
@@ -0,0 +1,8 @@
1
+ jsonpointer.py,sha256=80Ru4-pIHwq5TveZVxIJqp_oqoH3l4qtBabY95AtQJc,11409
2
+ jsonpointer-3.2.0.data/scripts/jsonpointer,sha256=tXI8Sl-uL_RDnd7mVTa3HzabsesBybpV2gDcAfpXI0g,2946
3
+ jsonpointer-3.2.0.dist-info/licenses/AUTHORS,sha256=TVgxnQ9ZyHvvWwez_k2w8ZwtfVVFsDTGv3tXyJu-9X8,113
4
+ jsonpointer-3.2.0.dist-info/licenses/LICENSE.txt,sha256=2LJPFdRyiF94ii1umFhQ8mRie4YBKhe7JCyD8xDZB-U,1413
5
+ jsonpointer-3.2.0.dist-info/METADATA,sha256=suE0BGiuliMr42SMgsqVgdGNXYSJCF44D5m3NlZENGM,2418
6
+ jsonpointer-3.2.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
7
+ jsonpointer-3.2.0.dist-info/top_level.txt,sha256=BsUcar_C0nZzPGV2ackrJ9CpVU8_0W_pHYKwpdnWddM,12
8
+ jsonpointer-3.2.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (82.0.1)
2
+ Generator: setuptools (84.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
jsonpointer.py CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  # Will be parsed by setup.py to determine package metadata
34
34
  __author__ = 'Stefan Kögl <stefan@skoegl.net>'
35
- __version__ = '3.1.1'
35
+ __version__ = '3.2.0'
36
36
  __website__ = 'https://github.com/stefankoegl/python-json-pointer'
37
37
  __license__ = 'Modified BSD License'
38
38
 
@@ -43,6 +43,10 @@ from itertools import tee, chain
43
43
 
44
44
  _nothing = object()
45
45
 
46
+ # If True, exceptions include the doc content in the error message.
47
+ # Set to False to suppress potentially large document content from exceptions.
48
+ VERBOSE_EXCEPTIONS = True
49
+
46
50
 
47
51
  def set_pointer(doc, pointer, value, inplace=True):
48
52
  """Resolves a pointer against doc and sets the value of the target within doc.
@@ -209,10 +213,15 @@ class JsonPointer:
209
213
 
210
214
  (parent, part) = self.to_last(doc)
211
215
 
212
- if isinstance(parent, Sequence) and part == '-':
216
+ if isinstance(parent, str):
217
+ raise JsonPointerException("Cannot set value in a string")
218
+ elif isinstance(parent, Sequence) and part == '-':
213
219
  parent.append(value)
214
220
  else:
215
- parent[part] = value
221
+ try:
222
+ parent[part] = value
223
+ except (TypeError, IndexError) as e:
224
+ raise JsonPointerException("Invalid assignment target: %s" % (e,))
216
225
 
217
226
  return doc
218
227
 
@@ -223,6 +232,9 @@ class JsonPointer:
223
232
  if isinstance(doc, Mapping):
224
233
  return part
225
234
 
235
+ elif isinstance(doc, str):
236
+ raise JsonPointerException("Cannot apply token '%s' to non-container type %s" % (part, type(doc)))
237
+
226
238
  elif isinstance(doc, Sequence):
227
239
 
228
240
  if part == '-':
@@ -231,7 +243,10 @@ class JsonPointer:
231
243
  if not JsonPointer._RE_ARRAY_INDEX.fullmatch(str(part)):
232
244
  raise JsonPointerException("'%s' is not a valid sequence index" % part)
233
245
 
234
- return int(part)
246
+ try:
247
+ return int(part)
248
+ except ValueError as e:
249
+ raise JsonPointerException("Invalid sequence index: %s" % (e,))
235
250
 
236
251
  elif hasattr(doc, '__getitem__'):
237
252
  # Allow indexing via ducktyping
@@ -269,7 +284,10 @@ class JsonPointer:
269
284
  return doc[part]
270
285
 
271
286
  except KeyError:
272
- raise JsonPointerException("member '%s' not found in %s" % (part, doc))
287
+ if VERBOSE_EXCEPTIONS:
288
+ raise JsonPointerException("member '%s' not found in %s" % (part, doc))
289
+ else:
290
+ raise JsonPointerException("member '%s' not found" % (part,))
273
291
 
274
292
  def contains(self, ptr):
275
293
  """ Returns True if self contains the given ptr """
@@ -288,7 +306,7 @@ class JsonPointer:
288
306
  else:
289
307
  suffix_parts = suffix
290
308
  try:
291
- return JsonPointer.from_parts(chain(self.parts, suffix_parts))
309
+ return self.__class__.from_parts(chain(self.parts, suffix_parts))
292
310
  except: # noqa E722
293
311
  raise JsonPointerException("Invalid suffix")
294
312
 
@@ -1,66 +0,0 @@
1
- #!python
2
-
3
-
4
- import argparse
5
- import json
6
- import sys
7
-
8
- import jsonpointer
9
-
10
- parser = argparse.ArgumentParser(
11
- description='Resolve a JSON pointer on JSON files')
12
-
13
- # Accept pointer as argument or as file
14
- ptr_group = parser.add_mutually_exclusive_group(required=True)
15
-
16
- ptr_group.add_argument('-f', '--pointer-file', type=argparse.FileType('r'),
17
- nargs='?',
18
- help='File containing a JSON pointer expression')
19
-
20
- ptr_group.add_argument('POINTER', type=str, nargs='?',
21
- help='A JSON pointer expression')
22
-
23
- parser.add_argument('FILE', type=argparse.FileType('r'), nargs='+',
24
- help='Files for which the pointer should be resolved')
25
- parser.add_argument('--indent', type=int, default=None,
26
- help='Indent output by n spaces')
27
- parser.add_argument('-v', '--version', action='version',
28
- version='%(prog)s ' + jsonpointer.__version__)
29
-
30
-
31
- def main():
32
- try:
33
- resolve_files()
34
- except KeyboardInterrupt:
35
- sys.exit(1)
36
-
37
-
38
- def parse_pointer(args):
39
- if args.POINTER:
40
- ptr = args.POINTER
41
- elif args.pointer_file:
42
- ptr = args.pointer_file.read().strip()
43
- else:
44
- parser.print_usage()
45
- sys.exit(1)
46
-
47
- return ptr
48
-
49
-
50
- def resolve_files():
51
- """ Resolve a JSON pointer on JSON files """
52
- args = parser.parse_args()
53
-
54
- ptr = parse_pointer(args)
55
-
56
- for f in args.FILE:
57
- doc = json.load(f)
58
- try:
59
- result = jsonpointer.resolve_pointer(doc, ptr)
60
- print(json.dumps(result, indent=args.indent))
61
- except jsonpointer.JsonPointerException as e:
62
- print('Could not resolve pointer: %s' % str(e), file=sys.stderr)
63
-
64
-
65
- if __name__ == "__main__":
66
- main()
@@ -1,8 +0,0 @@
1
- jsonpointer.py,sha256=j81llr7jMvEdAk44hFqYjnh-LA-uwuX-eR4VbRZcwnc,10551
2
- jsonpointer-3.1.1.data/scripts/jsonpointer,sha256=TJvaiCnkNs5scyGUQh9kUkBpW_ZHp16yEPFyViFfeyI,1749
3
- jsonpointer-3.1.1.dist-info/licenses/AUTHORS,sha256=TVgxnQ9ZyHvvWwez_k2w8ZwtfVVFsDTGv3tXyJu-9X8,113
4
- jsonpointer-3.1.1.dist-info/licenses/LICENSE.txt,sha256=2LJPFdRyiF94ii1umFhQ8mRie4YBKhe7JCyD8xDZB-U,1413
5
- jsonpointer-3.1.1.dist-info/METADATA,sha256=tGFCdFm3odWVWFugWp0EZrE0uEkgT03fvBse0gd1ul0,2418
6
- jsonpointer-3.1.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
7
- jsonpointer-3.1.1.dist-info/top_level.txt,sha256=BsUcar_C0nZzPGV2ackrJ9CpVU8_0W_pHYKwpdnWddM,12
8
- jsonpointer-3.1.1.dist-info/RECORD,,