Advertisement
Uno-Dan

Untitled

Nov 7th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.27 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. ########################################################################################################################
  3. #    File: cache.py
  4. #  Author: Dan Huckson, https://github.com/unodan
  5. #    Date: 2018-10-29
  6. ########################################################################################################################
  7. from os import path
  8. from json import dump, load
  9. from logging import info, error
  10.  
  11.  
  12. class URICache:
  13.     def __init__(self, data=None, **kwargs):
  14.         if isinstance(data, dict):
  15.             self.data = data
  16.         elif isinstance(data, str) and path.isfile(data):
  17.             self.data = self.load(data)
  18.         else:
  19.             self.data = kwargs.get('data', {})
  20.  
  21.     @staticmethod
  22.     def sanitize_uri(uri=''):
  23.         if uri:
  24.             uri = uri.replace('\\', '/')
  25.  
  26.         return uri
  27.  
  28.     def set(self, data=None, uri=None):
  29.  
  30.         def deep_iterate(value, _uri):
  31.             _uri = self.sanitize_uri(_uri)
  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(data, dict):
  53.             def iterate(member, location=None):
  54.                 for key, item in member.items():
  55.                     if isinstance(item, dict):
  56.                         iterate(item, key)
  57.                     else:
  58.                         deep_iterate(item, location + '/' + key)
  59.  
  60.             iterate(data, uri)
  61.         else:
  62.             deep_iterate(data, uri)
  63.  
  64.     def get(self, uri=None, default=None):
  65.  
  66.         uri = self.sanitize_uri(uri)
  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.         uri = self.sanitize_uri(uri)
  123.  
  124.         def parse(segment, location):
  125.             parts = location.split('/', 1)
  126.             target = parts[0]
  127.  
  128.             if len(parts) > 1:
  129.                 return parse(segment[target], parts[1])
  130.             elif target in segment:
  131.                 del segment[target]
  132.  
  133.         if uri and '/' in uri:
  134.             return parse(self.data, uri)
  135.  
  136.     def update(self, update_data, uri=''):
  137.  
  138.         def updater(data, _uri):
  139.             for key, value in data.items():
  140.                 if isinstance(value, dict):
  141.                     updater(value, _uri + key + '/')
  142.                 else:
  143.                     self.set(value, _uri + key)
  144.  
  145.         updater(update_data, uri)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement