+ def save_all(self):
+ self.save()
+
+class Directory(object):
+ """A class for accessing files, or directories, in a directory as
+ attributes on an object."""
+
+ def __init__(self, path):
+ self._path = path
+ self._nodes = [f for f in os.listdir(path) if "." not in f] if os.path.exists(path) else []
+ self._opened_nodes = {}
+
+ def __iter__(self):
+ return self._opened_nodes.itervalues()
+
+ def __contains__(self, name):
+ return name in self._nodes
+
+ def __getitem__(self, name):
+ if name in self._nodes:
+ return getattr(self, name)
+ raise KeyError(name)
+
+ def __getattr__(self, name):
+ if name in self._nodes:
+ if name not in self._opened_nodes:
+ if os.path.isdir(self.path(name)): self._opened_nodes[name] = Directory(self.path(name))
+ else: self._opened_nodes[name] = File(self.path(name))
+ return self._opened_nodes[name]
+ return object.__getattribute__(self, name)
+
+ def __delattr__(self, name):
+ if name in self._nodes:
+ self._nodes.remove(name)
+ if name in self._opened_nodes:
+ self._opened_nodes.pop(name).delete()
+ else:
+ object.__delattr__(self, name)
+
+ def delete(self):
+ for n in self._nodes:
+ getattr(self, n).delete()
+ self._opened_nodes = {}
+ self._nodes = []
+ os.rmdir(self.path())
+
+ def save(self):
+ if not self.exists():
+ os.makedirs(self.path())
+
+ def save_all(self):
+ self.save()
+ for name, node in self._opened_nodes.items():
+ node.save_all()
+
+ def exists(self):
+ return os.path.exists(self.path())
+
+ def move(self, new_path):
+ if not self.exists() or os.path.exists(new_path):
+ return False
+ os.rename(self.path(), new_path)
+ self._path = new_path
+ return True
+
+ def path(self, *name):
+ return os.path.join(self._path, *name)
+
+ def add_dir(self, name):
+ if not os.path.exists(self.path(name)):
+ self._nodes.append(name)
+ self._opened_nodes[name] = Directory(self.path(name))
+ return getattr(self, name)
+
+ def add_file(self, name):
+ if not os.path.exists(self.path(name)):
+ self._nodes.append(name)
+ self._opened_nodes[name] = File(self.path(name))
+ return getattr(self, name)
+