Advertisement
Uno-Dan

Untitled

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