summary refs log tree commit diff stats
path: root/code/fsobject.py
diff options
context:
space:
mode:
Diffstat (limited to 'code/fsobject.py')
-rw-r--r--code/fsobject.py65
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
+