objectdb.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import UserDict
  2. class ObjectDB(object):
  3. def __init__(self, db, validation):
  4. self.db = db
  5. self.validation = validation
  6. self.observers = []
  7. self.files = db.files
  8. def validate_files(self):
  9. for file in list(self.files):
  10. if not self.validation.is_file_valid(file):
  11. del self.files[file]
  12. self._file_removed(file)
  13. def validate_file(self, file):
  14. if file not in self.files:
  15. return
  16. for key in list(self.files[file]):
  17. if not self.validation.is_scope_valid(file, key):
  18. del self.files[file][key]
  19. def file_moved(self, file, newfile):
  20. if file not in self.files:
  21. return
  22. self.files.rename(file, newfile)
  23. self._file_removed(file)
  24. self._file_added(newfile)
  25. def get_files(self):
  26. return self.files.keys()
  27. def get_returned(self, path, key, args):
  28. scope_info = self._get_scope_info(path, key, readonly=True)
  29. result = scope_info.get_returned(args)
  30. if self.validation.is_value_valid(result):
  31. return result
  32. def get_pername(self, path, key, name):
  33. scope_info = self._get_scope_info(path, key, readonly=True)
  34. result = scope_info.get_per_name(name)
  35. if self.validation.is_value_valid(result):
  36. return result
  37. def get_callinfos(self, path, key):
  38. scope_info = self._get_scope_info(path, key, readonly=True)
  39. return scope_info.get_call_infos()
  40. def add_callinfo(self, path, key, args, returned):
  41. scope_info = self._get_scope_info(path, key, readonly=False)
  42. old_returned = scope_info.get_returned(args)
  43. if self.validation.is_more_valid(returned, old_returned):
  44. scope_info.add_call(args, returned)
  45. def add_pername(self, path, key, name, value):
  46. scope_info = self._get_scope_info(path, key, readonly=False)
  47. old_value = scope_info.get_per_name(name)
  48. if self.validation.is_more_valid(value, old_value):
  49. scope_info.save_per_name(name, value)
  50. def add_file_list_observer(self, observer):
  51. self.observers.append(observer)
  52. def write(self):
  53. self.db.write()
  54. def _get_scope_info(self, path, key, readonly=True):
  55. if path not in self.files:
  56. if readonly:
  57. return _NullScopeInfo()
  58. self.files.create(path)
  59. self._file_added(path)
  60. if key not in self.files[path]:
  61. if readonly:
  62. return _NullScopeInfo()
  63. self.files[path].create_scope(key)
  64. result = self.files[path][key]
  65. if isinstance(result, dict):
  66. print self.files, self.files[path], self.files[path][key]
  67. return result
  68. def _file_removed(self, path):
  69. for observer in self.observers:
  70. observer.removed(path)
  71. def _file_added(self, path):
  72. for observer in self.observers:
  73. observer.added(path)
  74. def __str__(self):
  75. scope_count = 0
  76. for file_dict in self.files.values():
  77. scope_count += len(file_dict)
  78. return 'ObjectDB holds %s file and %s scope infos' % \
  79. (len(self.files), scope_count)
  80. class _NullScopeInfo(object):
  81. def __init__(self, error_on_write=True):
  82. self.error_on_write = error_on_write
  83. def get_per_name(self, name):
  84. pass
  85. def save_per_name(self, name, value):
  86. if self.error_on_write:
  87. raise NotImplementedError()
  88. def get_returned(self, parameters):
  89. pass
  90. def get_call_infos(self):
  91. return []
  92. def add_call(self, parameters, returned):
  93. if self.error_on_write:
  94. raise NotImplementedError()
  95. class FileInfo(UserDict.DictMixin):
  96. def create_scope(self, key):
  97. pass
  98. class FileDict(UserDict.DictMixin):
  99. def create(self, key):
  100. pass
  101. def rename(self, key, new_key):
  102. pass
  103. class ScopeInfo(object):
  104. def get_per_name(self, name):
  105. pass
  106. def save_per_name(self, name, value):
  107. pass
  108. def get_returned(self, parameters):
  109. pass
  110. def get_call_infos(self):
  111. pass
  112. def add_call(self, parameters, returned):
  113. pass
  114. class CallInfo(object):
  115. def __init__(self, args, returned):
  116. self.args = args
  117. self.returned = returned
  118. def get_parameters(self):
  119. return self.args
  120. def get_returned(self):
  121. return self.returned
  122. class FileListObserver(object):
  123. def added(self, path):
  124. pass
  125. def removed(self, path):
  126. pass