new class for using filesystem as backend for boolean properties

Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
Steven Armstrong 2011-10-10 14:37:33 +02:00
parent 6de7bd3377
commit 44a722042a
1 changed files with 47 additions and 0 deletions

View File

@ -165,3 +165,50 @@ class DirectoryDictProperty(DirectoryDict):
def __delete__(self, obj):
raise AttributeError("can't delete attribute")
class FileBooleanProperty(object):
def __init__(self, path):
"""
:param path: string or callable
Usage:
class Foo(object):
changed = FileBoolean(lambda obj: os.path.join(obj.absolute_path, 'changed'))
other_boolean = FileBoolean('/tmp/other_boolean')
def __init__(self):
self.absolute_path = '/tmp/foo_boolean'
"""
self._path = path
def _get_path(self, *args, **kwargs):
path = self._path
if callable(path):
return path(*args, **kwargs)
if not os.path.isabs(path):
raise AbsolutePathRequiredError(path)
return path
# Descriptor Protocol
def __get__(self, obj, objtype=None):
if obj is None:
return self.__class__
path = self._get_path(obj)
return os.path.isfile(path)
def __set__(self, obj, value):
path = self._get_path(obj)
if value:
open(path, "w").close()
else:
try:
os.remove(path)
except EnvironmentError:
# ignore
pass
def __delete__(self, obj):
raise AttributeError("can't delete attribute")