1 """Modular processing of JSON data by trees and branches, pointers and patches.
2 """
3
4 import sys
5 import os
6
7 import filesysobjects.userdata
8 import filesysobjects.osdata
9
10 __author__ = 'Arno-Can Uestuensoez'
11 __maintainer__ = 'Arno-Can Uestuensoez'
12 __license__ = "Artistic-License-2.0 + Forced-Fairplay-Constraints"
13 __copyright__ = "Copyright (C) 2015-2016 Arno-Can Uestuensoez" \
14 " @Ingenieurbuero Arno-Can Uestuensoez"
15 __version__ = '0.2.21'
16 __uuid__ = '63b597d6-4ada-4880-9f99-f5e0961351fb'
17
18
19
20
21 appname = 'jsondata'
22
24 """ base Exception."""
25
27 """To be replaced by derived Exceptions.
28
29 Fetch standard parameters and forward message to base class 'Exception'.
30 """
31 self.fetch(*arg)
32 Exception.__init__(self, self.s)
33
35 """Fetch arguments.
36
37 Args:
38 *args:
39 The following order is expected:
40
41 0. Reason of exception.
42
43 1. Name of object that caused the exception.
44
45 2. Value of the object.
46
47 Returns:
48 None.
49
50 Raises:
51 None.
52 """
53 self.s = ""
54 for a in arg:
55 self.s += ":" + str(a)
56 self.s = self.s[1:]
57
59 """Cause: <reason>:<object>:<value>"""
60 return self.s
61
63 """Cause with additional header text."""
64 return "ERROR::" + self.s
65
66
67 _interactive = False
68
69
70 V3K = False
71 if sys.version_info[:2] > (3, 4,):
72 V3K = True
73 ISSTR = (str,)
74 """string and unicode"""
75
76 elif sys.version_info[:2] > (2, 6,) and sys.version_info[:2][0] < 3:
77 ISSTR = (str, unicode,)
78 """string and unicode"""
79
80 else:
81 raise JSONDataError(
82 "Requires Python 2.7+, or 3.5+:" +
83 str(sys.version_info[:2]))
84
85
86
87
88
89
91 """ Error on key."""
92
97
99 return "JSONDataIndexError:" + self.s
100
101
103 """ Error on key."""
104
109
111 return "JSONDataKeyError:" + self.s
112
113
115 """ Error on key."""
116
121
123 return "JSONDataPathError:" + self.s
124
125
127 """ Error on node, slightly different from key."""
128
130 return "JSONDataNodeError:" + self.s
131
132
134 """ Error on NodeTypes."""
135
137 return "JSONDataNodeTypeError:" + self.s
138
139
141 """ Erroneous parameters."""
142
144 return "JSONDataParameterError:" + self.s
145
146
148 """ Error on read of a source file."""
149
151 return "JSONDataSourceFileError:" + self.s
152
153
155 """ Type error of source file content."""
156
158 return "JSONDataModeError:" + self.s
159
160
162 """ Error on writing a file."""
163
165 return "JSONDataTargetFileError:" + self.s
166
167
169 """ Error on a value."""
170
172 return "JSONDataValueError:" + self.s
173
174
176 """ Error ambiguity of provided parameters."""
177
178 - def __init__(self, requested, *sources):
179 if _interactive:
180 self.s = "Ambiguious input for:\n " + str(requested)
181 for sx in sources:
182 self.s += "\n " + str(sx)
183 else:
184 self.s = "Ambiguious input for:" + str(requested)
185 for sx in sources:
186 self.s += ":" + str(sx)
187 Exception.__init__(self, self.s)
188
190 return "JSONDataAmbiguityError:" + self.s
191
192
194 """ Pointer error."""
195 pass
196
197
199 """ Pointer type error, the JSON pointer syntax does not represent a valid pointer."""
200 pass
201
202
204 """ Pointer error."""
205 pass
206
207
209 """Error in JSONDiff."""
210 pass
211
212
214 """Error in JSONSearch."""
215 pass
216
217
220
221
224
225
226
227
228
229 MJ_RFC4627 = 1
230 MJ_RFC7493 = 2
231 MJ_RFC7159 = 2
232 MJ_RFC8259 = 4
233 MJ_ECMA404 = 16
234 MJ_RFC6901 = 32
235 MJ_RELPOINTERD1 = 64
236 MJ_RFC6902 = 128
237 MJ_DEFAULT = MJ_RFC7159
238
239
240
241
242 MS_OFF = 40
243 MS_DRAFT3 = 43
244 MS_DRAFT4 = 44
245 MS_ON = MS_DRAFT4
246 MODE_SCHEMA_DEFAULT = MS_OFF
247
248 str2mj = {
249 "rfc4627": MJ_RFC4627,
250 "rfc7493": MJ_RFC7493,
251 "rfc7159": MJ_RFC7159,
252 "rfc8259": MJ_RFC8259,
253 "relpointerD1": MJ_RELPOINTERD1,
254 "ecma404": MJ_ECMA404,
255 "rfc6901": MJ_RFC6901,
256 "rfc6902": MJ_RFC6902,
257 "oss": MS_OFF,
258 str(MJ_RFC4627): MJ_RFC4627,
259 str(MJ_RFC7493): MJ_RFC7493,
260 str(MJ_RFC7159): MJ_RFC7159,
261 str(MJ_RFC8259): MJ_RFC8259,
262 str(MJ_ECMA404): MJ_ECMA404,
263 str(MJ_RFC6901): MJ_RFC6901,
264 str(MJ_RELPOINTERD1): MJ_RELPOINTERD1,
265 str(MJ_RFC6902): MJ_RFC6902,
266 str(MS_OFF): MS_OFF,
267 MJ_RFC4627: MJ_RFC4627,
268 MJ_RFC7493: MJ_RFC7493,
269 MJ_RFC7159: MJ_RFC7159,
270 MJ_ECMA404: MJ_ECMA404,
271 MJ_RFC6901: MJ_RFC6901,
272 MJ_RFC6902: MJ_RFC6902,
273 MS_OFF: MS_OFF,
274 }
275 mj2str = {
276 MJ_RFC4627: "rfc4627",
277 MJ_RFC7493: "rfc7493",
278 MJ_RFC7159: "rfc7159",
279 MJ_RFC8259: "rfc8259",
280 MJ_RELPOINTERD1: "relpointerD1",
281 MJ_ECMA404: "ecma404",
282 MJ_RFC6901: "rfc6901",
283 MJ_RFC6902: "rfc6902",
284 MS_OFF: "off",
285 }
286
287
288
289
290
291
292
293 MATCH_INSERT = 0
294 MATCH_NO = 1
295 MATCH_KEY = 2
296 MATCH_CHLDATTR = 3
297 MATCH_INDEX = 4
298 MATCH_MEM = 5
299 MATCH_NEW = 6
300 MATCH_PRESENT = 7
301
302
303
304
305
306
307 B_ALL = 0
308 B_AND = 1
309 B_OR = 2
310 B_XOR = 4
311
312 B_ADD = 8
313 B_MOD = 16
314 B_SUB = 32
315
316
317
318
319 C_REF = 0
320 C_DEEP = 1
321 C_SHALLOW = 2
322 C_DEFAULT = C_REF
323
324
325
326
327
328 SC_DATA = 0
329 SC_SCHEMA = 1
330 SC_JSON = 2
331 SC_OBJ = 3
332 SC_ALL = 4
333
334
335
336
337
338 SD_BOTH = 0
339 SD_INPUT = 1
340 SD_OUTPUT = 2
341
342
343
344
345
346 S_NONE = 0
347 S_SIMPLE = 1
348
349
350
351
352
353 R_OBJ = 0
354 R_DATA = 1
355 R_JDATA = 2
356
357
358
359
360 RT_STR = 1
361 RT_DICT = 2
362 RT_LST = 4
363 RT_JSONPOINTER = 8
364 RT_JSONPATCH= 16
365 RT_JSONDATA = 32
366 RT_DEFAULT = RT_JSONPOINTER
367 rtypes2num = {
368 'RT_DICT': RT_DICT,
369 'RT_JSONDATA': RT_JSONDATA,
370 'RT_JSONPATCH': RT_JSONPATCH,
371 'RT_JSONPOINTER': RT_JSONPOINTER,
372 'RT_LST': RT_LST,
373 'RT_STR': RT_STR,
374 'default': RT_DEFAULT,
375 'dict': RT_DICT,
376 'jdata': RT_JSONPATCH,
377 'jpatch': RT_JSONDATA,
378 'jpointer': RT_JSONPOINTER,
379 'list': RT_LST,
380 'str': RT_STR,
381 None: RT_DEFAULT,
382 RT_DEFAULT: RT_DEFAULT,
383 RT_DICT: RT_DICT,
384 RT_JSONDATA: RT_JSONDATA,
385 RT_JSONPATCH: RT_JSONPATCH,
386 RT_JSONPOINTER: RT_JSONPOINTER,
387 RT_LST: RT_LST,
388 RT_STR: RT_STR,
389 }
390
391
392
393
394 M_FIRST = 1
395 M_LAST = 2
396 M_ALL = 4
397
398
399
400
401
402 V_NONE = 1
403 V_FINAL = 2
404 V_STEPS = 4
405 V_DEFAULT = V_NONE
406 verify2num = {
407 'V_DEFAULT': V_DEFAULT,
408 'V_FINAL': V_FINAL,
409 'V_NONE': V_NONE,
410 'V_STEPS': V_STEPS,
411 'default': V_DEFAULT,
412 'final': V_FINAL,
413 'none': V_NONE,
414 'steps': V_STEPS,
415 None: V_DEFAULT,
416 V_DEFAULT: V_DEFAULT,
417 V_FINAL: V_FINAL,
418 V_NONE: V_NONE,
419 V_STEPS: V_STEPS,
420 }
421
422
423
424
425 DF_SUMUP = 0
426 DF_CSV = 1
427 DF_JSON = 3
428 DF_TABLE = 4
429 DF_REVIEW = 5
430 DF_REPR = 6
431 DF_STR = 7
432
433 str2df = {
434 'sumup': DF_SUMUP,
435 'csv': DF_CSV,
436 'json': DF_JSON,
437 'review': DF_REVIEW,
438 'repr': DF_REPR,
439 'str': DF_STR,
440 'tabble': DF_TABLE,
441 str(DF_SUMUP): DF_SUMUP,
442 str(DF_CSV): DF_CSV,
443 str(DF_JSON): DF_JSON,
444 str(DF_REVIEW): DF_REVIEW,
445 str(DF_REPR): DF_REPR,
446 str(DF_STR): DF_STR,
447 str(DF_TABLE): DF_TABLE,
448 DF_SUMUP: DF_SUMUP,
449 DF_CSV: DF_CSV,
450 DF_JSON: DF_JSON,
451 DF_REVIEW: DF_REVIEW,
452 DF_REPR: DF_REPR,
453 DF_STR: DF_STR,
454 DF_TABLE: DF_TABLE,
455 }
456 df2str = {
457 DF_SUMUP: 'sumup',
458 DF_CSV: 'csv',
459 DF_JSON: 'json',
460 DF_REVIEW: 'review',
461 DF_REPR: 'repr',
462 DF_STR: 'str',
463 DF_TABLE: 'tabble',
464 }
465
466
467
468
469 PJ_TREE = 0
470 PJ_FLAT = 1
471 PJ_PYTREE = 2
472 PJ_PYFLAT = 3
473 PJ_REPR = 4
474 PJ_STR = 5
475 str2pj = {
476 'tree': PJ_TREE,
477 'flat': PJ_FLAT,
478 'pytree': PJ_PYTREE,
479 'pyflat': PJ_PYFLAT,
480 'repr': PJ_REPR,
481 'str': PJ_STR,
482 str(PJ_TREE): PJ_TREE,
483 str(PJ_FLAT): PJ_FLAT,
484 str(PJ_PYTREE): PJ_PYTREE,
485 str(PJ_PYFLAT): PJ_PYFLAT,
486 str(PJ_REPR): PJ_REPR,
487 str(PJ_STR): PJ_STR,
488 PJ_TREE: PJ_TREE,
489 PJ_FLAT: PJ_FLAT,
490 PJ_PYTREE: PJ_PYTREE,
491 PJ_PYFLAT: PJ_PYFLAT,
492 PJ_REPR: PJ_REPR,
493 PJ_STR: PJ_STR,
494 }
495 pj2str = {
496 PJ_TREE: 'tree',
497 PJ_FLAT: 'flat',
498 PJ_PYTREE: 'pytree',
499 PJ_PYFLAT: 'pyflat',
500 PJ_REPR: 'repr',
501 PJ_STR: 'str',
502 }
503
504
505
506
507
508 NOTATION_NATIVE = 0
509 NOTATION_JSON = 1
510 NOTATION_JSON_REL = 2
511 NOTATION_HTTP_FRAGMENT = 3
512
513
514
515
516
517 CHARS_RAW = 0
518 CHARS_STR = 1
519 CHARS_UTF = 2
520
521
522
523
524
525 LINE_CUT = 0
526 LINE_WRAP = 1
527
528
529
530
531
532 SEARCH_FIRST = 0
533 SEARCH_ALL = 1
534
535
536
537
538
539 PT_PATH = 0
540 PT_RFC6901 = 1
541 PT_NODE = 2
542
543
544
545
546
547 JSYN_NATIVE = 1
548 JSYN_PYTHON = 2
549
550
551
552
553 match2match ={
554 'child_attr_list': MATCH_CHLDATTR,
555 'index': MATCH_INDEX,
556 'key': MATCH_KEY,
557 'mem': MATCH_MEM,
558 'new': MATCH_NEW,
559 'no': MATCH_NO,
560 'present': MATCH_PRESENT,
561 MATCH_CHLDATTR: MATCH_CHLDATTR,
562 MATCH_INDEX: MATCH_INDEX,
563 MATCH_KEY: MATCH_KEY,
564 MATCH_MEM: MATCH_MEM,
565 MATCH_NEW: MATCH_NEW,
566 MATCH_NO: MATCH_NO,
567 MATCH_PRESENT: MATCH_PRESENT,
568 }
569
570
571
572 mode2mj = {
573 'default': MJ_RFC7159,
574 'ecma404': MJ_RFC8259,
575 'rfc4627': MJ_RFC4627,
576 'rfc7159': MJ_RFC7159,
577 'rfc7493': MJ_RFC7493,
578 'rfc8259': MJ_RFC8259,
579 MJ_ECMA404: MJ_RFC8259,
580 MJ_RFC4627: MJ_RFC4627,
581 MJ_RFC7159: MJ_RFC7159,
582 MJ_RFC7493: MJ_RFC7493,
583 MJ_RFC8259: MJ_RFC8259,
584 }
585
586
587
588 validator2ms = {
589 'default': MS_DRAFT4,
590 'draft3': MS_DRAFT3,
591 'off': MS_OFF,
592 MS_DRAFT3: MS_DRAFT3,
593 MS_DRAFT4: MS_DRAFT4,
594 MS_OFF: MS_OFF,
595 }
596
597
598
599 copy2c = {
600 'deep': C_DEEP,
601 'default': C_REF,
602 'ref': C_REF,
603 'shallow': C_SHALLOW,
604 C_DEEP: C_DEEP,
605 C_REF: C_REF,
606 C_SHALLOW: C_SHALLOW,
607 }
608
609
610
611
612
613 consolewidth = 80
614
615
616
617
618 _verbose = 0
619 _debug = 0
620