Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/oi/objectdb.py
1419 views
import UserDict123class ObjectDB(object):45def __init__(self, db, validation):6self.db = db7self.validation = validation8self.observers = []9self.files = db.files1011def validate_files(self):12for file in list(self.files):13if not self.validation.is_file_valid(file):14del self.files[file]15self._file_removed(file)1617def validate_file(self, file):18if file not in self.files:19return20for key in list(self.files[file]):21if not self.validation.is_scope_valid(file, key):22del self.files[file][key]2324def file_moved(self, file, newfile):25if file not in self.files:26return27self.files.rename(file, newfile)28self._file_removed(file)29self._file_added(newfile)3031def get_files(self):32return self.files.keys()3334def get_returned(self, path, key, args):35scope_info = self._get_scope_info(path, key, readonly=True)36result = scope_info.get_returned(args)37if self.validation.is_value_valid(result):38return result3940def get_pername(self, path, key, name):41scope_info = self._get_scope_info(path, key, readonly=True)42result = scope_info.get_per_name(name)43if self.validation.is_value_valid(result):44return result4546def get_callinfos(self, path, key):47scope_info = self._get_scope_info(path, key, readonly=True)48return scope_info.get_call_infos()4950def add_callinfo(self, path, key, args, returned):51scope_info = self._get_scope_info(path, key, readonly=False)52old_returned = scope_info.get_returned(args)53if self.validation.is_more_valid(returned, old_returned):54scope_info.add_call(args, returned)5556def add_pername(self, path, key, name, value):57scope_info = self._get_scope_info(path, key, readonly=False)58old_value = scope_info.get_per_name(name)59if self.validation.is_more_valid(value, old_value):60scope_info.save_per_name(name, value)6162def add_file_list_observer(self, observer):63self.observers.append(observer)6465def write(self):66self.db.write()6768def _get_scope_info(self, path, key, readonly=True):69if path not in self.files:70if readonly:71return _NullScopeInfo()72self.files.create(path)73self._file_added(path)74if key not in self.files[path]:75if readonly:76return _NullScopeInfo()77self.files[path].create_scope(key)78result = self.files[path][key]79if isinstance(result, dict):80print self.files, self.files[path], self.files[path][key]81return result8283def _file_removed(self, path):84for observer in self.observers:85observer.removed(path)8687def _file_added(self, path):88for observer in self.observers:89observer.added(path)9091def __str__(self):92scope_count = 093for file_dict in self.files.values():94scope_count += len(file_dict)95return 'ObjectDB holds %s file and %s scope infos' % \96(len(self.files), scope_count)979899class _NullScopeInfo(object):100101def __init__(self, error_on_write=True):102self.error_on_write = error_on_write103104def get_per_name(self, name):105pass106107def save_per_name(self, name, value):108if self.error_on_write:109raise NotImplementedError()110111def get_returned(self, parameters):112pass113114def get_call_infos(self):115return []116117def add_call(self, parameters, returned):118if self.error_on_write:119raise NotImplementedError()120121122class FileInfo(UserDict.DictMixin):123124def create_scope(self, key):125pass126127128class FileDict(UserDict.DictMixin):129130def create(self, key):131pass132133def rename(self, key, new_key):134pass135136137class ScopeInfo(object):138139def get_per_name(self, name):140pass141142def save_per_name(self, name, value):143pass144145def get_returned(self, parameters):146pass147148def get_call_infos(self):149pass150151def add_call(self, parameters, returned):152pass153154155class CallInfo(object):156157def __init__(self, args, returned):158self.args = args159self.returned = returned160161def get_parameters(self):162return self.args163164def get_returned(self):165return self.returned166167168class FileListObserver(object):169170def added(self, path):171pass172173def removed(self, path):174pass175176177