memorydb.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from rope.base.oi import objectdb
  2. class MemoryDB(objectdb.FileDict):
  3. def __init__(self, project, persist=None):
  4. self.project = project
  5. self._persist = persist
  6. self.files = self
  7. self._load_files()
  8. self.project.data_files.add_write_hook(self.write)
  9. def _load_files(self):
  10. self._files = {}
  11. if self.persist:
  12. result = self.project.data_files.read_data(
  13. 'objectdb', compress=self.compress, import_=True)
  14. if result is not None:
  15. self._files = result
  16. def keys(self):
  17. return self._files.keys()
  18. def __contains__(self, key):
  19. return key in self._files
  20. def __getitem__(self, key):
  21. return FileInfo(self._files[key])
  22. def create(self, path):
  23. self._files[path] = {}
  24. def rename(self, file, newfile):
  25. if file not in self._files:
  26. return
  27. self._files[newfile] = self._files[file]
  28. del self[file]
  29. def __delitem__(self, file):
  30. del self._files[file]
  31. def write(self):
  32. if self.persist:
  33. self.project.data_files.write_data('objectdb', self._files,
  34. self.compress)
  35. @property
  36. def compress(self):
  37. return self.project.prefs.get('compress_objectdb', False)
  38. @property
  39. def persist(self):
  40. if self._persist is not None:
  41. return self._persist
  42. else:
  43. return self.project.prefs.get('save_objectdb', False)
  44. class FileInfo(objectdb.FileInfo):
  45. def __init__(self, scopes):
  46. self.scopes = scopes
  47. def create_scope(self, key):
  48. self.scopes[key] = ScopeInfo()
  49. def keys(self):
  50. return self.scopes.keys()
  51. def __contains__(self, key):
  52. return key in self.scopes
  53. def __getitem__(self, key):
  54. return self.scopes[key]
  55. def __delitem__(self, key):
  56. del self.scopes[key]
  57. class ScopeInfo(objectdb.ScopeInfo):
  58. def __init__(self):
  59. self.call_info = {}
  60. self.per_name = {}
  61. def get_per_name(self, name):
  62. return self.per_name.get(name, None)
  63. def save_per_name(self, name, value):
  64. self.per_name[name] = value
  65. def get_returned(self, parameters):
  66. return self.call_info.get(parameters, None)
  67. def get_call_infos(self):
  68. for args, returned in self.call_info.items():
  69. yield objectdb.CallInfo(args, returned)
  70. def add_call(self, parameters, returned):
  71. self.call_info[parameters] = returned
  72. def __getstate__(self):
  73. return (self.call_info, self.per_name)
  74. def __setstate__(self, data):
  75. self.call_info, self.per_name = data