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