Advertisement
Uno-Dan

Untitled

Oct 26th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.23 KB | None | 0 0
  1. ########################################################################################################################
  2. #    File: json.py
  3. #  Author: Dan Huckson, https://github.com/unodan
  4. #    Date: 2018-07-27
  5. ########################################################################################################################
  6. from os import path
  7. from json import dump, load
  8. from logging import info, error
  9.  
  10.  
  11. class Json:
  12.     def __init__(self, file=None, **kwargs):
  13.  
  14.         if isinstance(file, dict):
  15.             self.defaults = file
  16.         else:
  17.             if file and path.isfile(file):
  18.                 self.defaults = self.load(file)
  19.             else:
  20.                 self.defaults = kwargs.get('data', {})
  21.  
  22.         if self.defaults is None:
  23.             self.defaults = {}
  24.  
  25.         self.data = dict(self.defaults)
  26.  
  27.     def set(self, value=None, uri=None):
  28.  
  29.         def do(value, uri):
  30.             if uri:
  31.                 uri = uri.replace('\\', '/')
  32.  
  33.             def parse(segment, location):
  34.                 parts = location.split('/', 1)
  35.                 target = parts[0]
  36.  
  37.                 if len(parts) > 1:
  38.                     if target not in segment:
  39.                         segment[target] = {}
  40.  
  41.                     parse(segment[target], parts[1])
  42.                 else:
  43.                     segment[target] = value
  44.  
  45.             if uri and '/' in uri:
  46.                 parse(self.data, uri)
  47.             elif uri is None or uri == '.':
  48.                 self.data = value
  49.             else:
  50.                 self.data = {**self.data, **{uri: value}}
  51.  
  52.         if isinstance(value, dict):
  53.             def dig(va, uri=None):
  54.                 for k, v in va.items():
  55.                     if isinstance(v, dict):
  56.                         dig(v, k)
  57.                     else:
  58.                         do(v, uri + '/' + k)
  59.             dig(value, uri)
  60.         else:
  61.             do(value, uri)
  62.  
  63.     def get(self, uri=None, default=None):
  64.  
  65.         if uri:
  66.             uri = uri.replace('\\', '/')
  67.  
  68.         def parse(segment, location):
  69.             parts = location.split('/', 1)
  70.             target = parts[0]
  71.  
  72.             if len(parts) > 1:
  73.                 if target not in segment:
  74.                     return default
  75.                 else:
  76.                     return parse(segment[target], parts[1])
  77.  
  78.             elif target in segment:
  79.                 return segment[target]
  80.  
  81.             return default
  82.  
  83.         if uri and '/' in uri:
  84.             return parse(self.data, uri)
  85.         elif uri == '.' or uri is None:
  86.             return self.data
  87.         else:
  88.             data = None
  89.             if self.data:
  90.                 data = self.data.get(uri, default)
  91.  
  92.             if not data:
  93.                 data = default
  94.  
  95.             return data
  96.  
  97.     def load(self, file):
  98.         try:
  99.             with open(file, 'r') as f:
  100.                 self.data = load(f)
  101.                 info('json_read:Filename="' + file + '":Success')
  102.                 return self.data
  103.  
  104.         except OSError as e:
  105.             error('json_read:Filename="' + file + '":' + e.strerror + ":Failed")
  106.             return False
  107.  
  108.     def save(self, file):
  109.         try:
  110.             with open(file, 'w') as f:
  111.                 dump(self.data, f, indent=4)
  112.  
  113.                 info('json_write:Filename="' + file + '":Success')
  114.                 return False
  115.  
  116.         except OSError as e:
  117.             error('json_write:Filename="' + file + '"' + e.strerror)
  118.             return True
  119.  
  120.     def remove(self, uri):
  121.  
  122.         if uri:
  123.             uri = uri.replace('\\', '/')
  124.  
  125.         def parse(segment, location):
  126.             parts = location.split('/', 1)
  127.             target = parts[0]
  128.  
  129.             if len(parts) > 1:
  130.                 return parse(segment[target], parts[1])
  131.             elif target in segment:
  132.                 del segment[target]
  133.  
  134.         if uri and '/' in uri:
  135.             return parse(self.data, uri)
  136.  
  137.     def update(self, update_data, uri=''):
  138.  
  139.         def updater(data, _uri):
  140.             for key, value in data.items():
  141.                 if isinstance(value, dict):
  142.                     updater(value, _uri + key + '/')
  143.                 else:
  144.                     self.set(value, _uri + key)
  145.  
  146.         updater(update_data, uri)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement