From 3873aefcf55ed2c0953b164e14ef46546bd912b5 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 7 Oct 2011 00:46:59 +0200 Subject: [PATCH 1/4] cleanup, add sort method Signed-off-by: Steven Armstrong --- lib/cdist/core/property.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/cdist/core/property.py b/lib/cdist/core/property.py index 790ff802..359cf32c 100644 --- a/lib/cdist/core/property.py +++ b/lib/cdist/core/property.py @@ -32,6 +32,8 @@ class FileList(collections.MutableSequence): def __init__(self, path, initial=None): self._path = path if initial: + # delete existing file + os.unlink(self._path) for i in initial: self.append(i) @@ -40,7 +42,7 @@ class FileList(collections.MutableSequence): try: with open(self._path) as fd: for line in fd: - lines.append(line.strip()) + lines.append(line.rstrip('\n')) except EnvironmentError as e: # error ignored pass @@ -50,7 +52,7 @@ class FileList(collections.MutableSequence): try: with open(self._path, 'w') as fd: for line in lines: - fd.write(line + '\n') + fd.write(str(line) + '\n') except EnvironmentError as e: # error ignored raise @@ -80,6 +82,10 @@ class FileList(collections.MutableSequence): lines.insert(index, value) self.__write(lines) + def sort(self): + lines = sorted(self) + self.__write(lines) + class DirectoryDict(collections.MutableMapping): """A dict that stores it's state in a directory. @@ -98,13 +104,13 @@ class DirectoryDict(collections.MutableMapping): def __getitem__(self, key): try: with open(os.path.join(self._path, key), "r") as fd: - return fd.read() + return fd.read().rstrip('\n') except EnvironmentError: raise KeyError(key) def __setitem__(self, key, value): with open(os.path.join(self._path, key), "w") as fd: - fd.write(value) + fd.write(str(value)) def __delitem__(self, key): os.remove(os.path.join(self._path, key)) From 7bbecb25868a8bc798dfbc7f96c9efa0649a0de6 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 7 Oct 2011 00:48:06 +0200 Subject: [PATCH 2/4] implement descriptor protocol for FileList and DirectoryDict Signed-off-by: Steven Armstrong --- lib/cdist/core/property.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/cdist/core/property.py b/lib/cdist/core/property.py index 359cf32c..30887547 100644 --- a/lib/cdist/core/property.py +++ b/lib/cdist/core/property.py @@ -87,6 +87,22 @@ class FileList(collections.MutableSequence): self.__write(lines) +class FileListProperty(FileList): + # Descriptor Protocol + def __get__(self, obj, objtype=None): + if obj is None: + return self.__class__ + return self + + def __set__(self, obj, value): + os.unlink(self._path) + for item in value: + self.append(item) + + def __delete__(self, obj): + raise AttributeError("can't delete attribute") + + class DirectoryDict(collections.MutableMapping): """A dict that stores it's state in a directory. @@ -120,3 +136,20 @@ class DirectoryDict(collections.MutableMapping): def __len__(self): return len(os.listdir(self._path)) + + +class DirectoryDictProperty(DirectoryDict): + # Descriptor Protocol + def __get__(self, obj, objtype=None): + if obj is None: + return self.__class__ + return self + + def __set__(self, obj, value): + for name in self.keys(): + del self[name] + if value is not None: + self.update(value) + + def __delete__(self, obj): + raise AttributeError("can't delete attribute") From 9473a3a19e24a9bde1bc6de9ec8875af3930c7f1 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 7 Oct 2011 12:49:30 +0200 Subject: [PATCH 3/4] Type: implement explorer_dir, remote_explorer_dir Signed-off-by: Steven Armstrong --- lib/cdist/core/type.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/cdist/core/type.py b/lib/cdist/core/type.py index 7492659e..7856c92f 100644 --- a/lib/cdist/core/type.py +++ b/lib/cdist/core/type.py @@ -25,6 +25,8 @@ import os import cdist +# FIXME: i should not have to care about prefix directory, local, remote and such. +# I know what my internals look like, the outside is none of my business. class Type(object): """Represents a cdist type. @@ -51,6 +53,28 @@ class Type(object): except KeyError as e: raise cdist.MissingEnvironmentVariableError(e.args[0]) + @staticmethod + def remote_base_dir(): + """Return the absolute path to the top level directory where types + are kept on the remote/target host. + + Requires the environment variable '__cdist_remote_base_dir' to be set. + + """ + try: + return os.path.join( + os.environ['__cdist_remote_base_dir'], + 'conf', + 'type' + ) + except KeyError as e: + raise cdist.MissingEnvironmentVariableError(e.args[0]) + + # FIXME: probably wrong place for this + @property + def remote_explorer_dir(self): + return os.path.join(self.remote_path, "explorer") + @classmethod def list_types(cls): """Return a list of type instances""" @@ -80,6 +104,13 @@ class Type(object): self.base_dir(), self.name ) + # FIXME: prefix directory should not leak into me + @property + def remote_path(self): + return os.path.join( + self.remote_base_dir(), + self.name + ) @property def is_singleton(self): From 9a8e1681687b7eca7f9c04dc595fb593697195ce Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Fri, 7 Oct 2011 12:50:00 +0200 Subject: [PATCH 4/4] --todo Signed-off-by: Steven Armstrong --- doc/dev/todo/steven | 7 ------- 1 file changed, 7 deletions(-) diff --git a/doc/dev/todo/steven b/doc/dev/todo/steven index 41306a66..37945166 100644 --- a/doc/dev/todo/steven +++ b/doc/dev/todo/steven @@ -6,13 +6,6 @@ Object: path_remote -Type: - explorer_dir - remote_explorer_dir - - explorer_remote_dir - - GlobalExplorer: out_path: local path into which the output is written