flatfilehandler.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import os.path
  2. from engine.log import debug
  3. class FlatFileHandler:
  4. def __init__(self, filename, directory='config/', base='/etc/hometv/'):
  5. self.filename = filename
  6. self.directory = directory
  7. self.base = base
  8. self.attributes = {}
  9. self.cache = {}
  10. if os.path.exists(self.base + self.directory + self.filename):
  11. content = self.read_file()
  12. debug('Loading config')
  13. self.parse_config(content)
  14. else:
  15. self.create_file()
  16. def handle(self, mode='r'):
  17. return open(self.base + self.directory + self.filename, mode)
  18. def is_empty(self):
  19. return len(self.attributes) == 0
  20. def create_file(self):
  21. self.handle(mode='x').close()
  22. def write_to_file(self):
  23. file = self.handle('w+')
  24. for attribute in self.attributes:
  25. file.write(str(self.attributes[attribute]) + '\n')
  26. def read_file(self):
  27. file = self.handle()
  28. content = None
  29. if file.mode == 'r':
  30. content = file.readlines()
  31. file.close()
  32. return content
  33. def parse_config(self, lines):
  34. debug('Parse settings. {} lines'.format(len(lines)))
  35. for line in lines:
  36. content = line.split('=')
  37. debug('{}=>{}'.format(content[0], content[1].strip()))
  38. self.cache[content[0]] = content[1]
  39. def set_attribute(self, name, _type=str, value=None, default=None, raw=None):
  40. self.attributes[name] = self.Attribute(name, _type=_type, value=value, default=default, raw=(self.cache[name] if name in self.cache else raw))
  41. def remove_attribute(self, name):
  42. self.attributes.pop(name)
  43. def get(self, key):
  44. debug(key)
  45. return self.attributes[key].get()
  46. class Attribute:
  47. def __init__(self, name, _type=str, value=None, default=None, raw=None):
  48. self.name = name
  49. self.value = value
  50. self.default = default
  51. self.type = _type
  52. self.raw = raw
  53. if raw and not value:
  54. self.set_from_raw(self.raw)
  55. def __str__(self):
  56. output = self.get()
  57. if self.type is list:
  58. output = ','.join(str(x) for x in output)
  59. return '{}={}'.format(self.name, output)
  60. def parse(self):
  61. if self.type is str:
  62. self.value = str(self.raw)
  63. if self.type is bool:
  64. self.value = self.raw.upper() in ['TRUE', 'YES', 'Y', 'T', '1']
  65. if self.type is int:
  66. self.value = int(self.raw)
  67. if self.type is float:
  68. self.value = float(self.raw)
  69. if self.type is list:
  70. self.value = self.raw.split(',')
  71. if self.type is dict:
  72. self.value = {}
  73. attributes = self.raw.split(',')
  74. for attribute in attributes:
  75. attr = attribute.split('>')
  76. self.value[attr[0]] = attr[1]
  77. def set_from_raw(self, raw):
  78. self.raw = raw.strip()
  79. self.parse()
  80. def set(self, value):
  81. if type(value) is self.type:
  82. self.value = value
  83. else:
  84. raise TypeError('{} expected but {} given'.format(self.type.__name__, type(value).__name__))
  85. def get(self):
  86. debug('Get value: {}'.format(self.value))
  87. return self.value if self.value else self.default