diff options
Diffstat (limited to 'code/fsobject.py')
-rw-r--r-- | code/fsobject.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/code/fsobject.py b/code/fsobject.py new file mode 100644 index 00000000..d1cd1410 --- /dev/null +++ b/code/fsobject.py @@ -0,0 +1,65 @@ +class FrozenException(Exception): pass +class NotLoadedYet(Exception): pass + +class FSObject(object): + def __init__(self, path): + self.path = path + self.exists = False + self.accessible = False + self.marked = False + self.tagged = False + self.frozen = False + self.loaded = False + self.stat = None + + def clone(self): + clone = type(self)(self.path) + for key in iter(self.__dict__): + clone.__dict__[key] = self.__dict__[key] + return clone + + def load(self): + self.stop_if_frozen() + self.loaded = True + + import os + try: + self.stat = os.stat(self.path) + self.exists = True + self.accessible = True + except OSError: + self.exists = False + self.accessible = False + + def load_once(self): + self.stop_if_frozen() + if not self.loaded: self.load() + + def load_if_outdated(self): + self.stop_if_frozen() + import os + + if not self.loaded: + self.load() + return True + + real_mtime = os.stat(self.path).st_mtime + cached_mtime = self.stat.st_mtime + + if real_mtime != cached_mtime: + self.load() + return True + + return False + + def frozen_clone(self): + self.stop_if_frozen() + return self.clone().freeze() + + def stop_if_frozen(self): + if self.frozen: raise FrozenException() + + def freeze(self): + self.frozen = True + return self + |