summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYaakov M. Nemoy <loupgaroublond@gmail.com>2009-01-15 18:08:22 -0500
committerYaakov M. Nemoy <loupgaroublond@gmail.com>2009-01-15 18:08:22 -0500
commit401c14d76893579ce2af6e7018ec4140a3541cf1 (patch)
treec957fd77ac4ef2dbc80c2a90e3a2600c8f7b74bb
parent6f22d71cf8218abff64773545456fa6084ed2096 (diff)
downloadfedora-devshell-401c14d76893579ce2af6e7018ec4140a3541cf1.tar.gz
fedora-devshell-401c14d76893579ce2af6e7018ec4140a3541cf1.tar.xz
fedora-devshell-401c14d76893579ce2af6e7018ec4140a3541cf1.zip
Convert Directory to a metaclassed object to handle registration with dirfactory and other administrative details
-rw-r--r--base/dirfactory.py (renamed from modules/dirfactory.py)29
-rw-r--r--modules/directory.py11
2 files changed, 21 insertions, 19 deletions
diff --git a/modules/dirfactory.py b/base/dirfactory.py
index 1c2e5a2..e099197 100644
--- a/modules/dirfactory.py
+++ b/base/dirfactory.py
@@ -19,27 +19,19 @@
from __future__ import with_statement
from configobj import ConfigObj
-from inspect import isclass
from os import getcwd
from os.path import abspath, exists
from base.util import pwd, log
-from base.module import Module
-from modules.package import Package
-from modules.directory import Directory
-from modules.revisioncontrol import RevisionControl
-from modules.sourceball import SourceBall
-from modules.darcs import Darcs
+from base.exceptions import ExecutionException
-# TODO: i'm jumping through bureaucrautic hoops right now.
-# Don't program at 3am kids, it's harmful to your sanity
-foo = []
-for x,y in globals().copy().iteritems():
- foo.append([x,y])
-foo = dict(foo)
-dirs = dict([[key.lower(), val] for key, val in foo.iteritems() if isclass(val) and issubclass(val, Directory)])
+directory_type = dict()
-class DirFactory(Module):
+def register(cls, name):
+ global directory_type
+ directory_type[name] = cls
+
+class DirFactory(object):
'''creates a new object of type defined by a directory's .devshell file'''
def __new__(cls, name=None):
if not name:
@@ -53,7 +45,10 @@ class DirFactory(Module):
type = 'directory'
else:
type = whatis_sysdir(dir)
- new_cls = dirs[type]
+ try:
+ new_cls = directory_type[type]
+ except KeyError, e:
+ raise ExecutionException(e, 'the directory type %s is not supported by this installation of fedora-deveshell' % type.capitalize())
foo = new_cls.__new__(new_cls, name)
foo.__init__(name)
return foo
@@ -69,4 +64,4 @@ def whatis_sysdir(dir):
except KeyError, e:
return 'directory'
-__all__ = ['DirFactory']
+__all__ = ['DirFactory', 'register']
diff --git a/modules/directory.py b/modules/directory.py
index 22cdec5..31c864c 100644
--- a/modules/directory.py
+++ b/modules/directory.py
@@ -19,6 +19,8 @@
from __future__ import with_statement
+import base.dirfactory as dirfactory
+
from configobj import ConfigObj
from os import makedirs, getcwd, listdir
from os.path import abspath, join, split, splitext, basename, exists, dirname
@@ -27,12 +29,17 @@ from base.base import log
from base.module import Module
from base.util import pwd, copytree
-from modules.dirfactory import DirFactory
+class MetaDirectory(type):
+ def __init__(cls, name, bases, attrs):
+ t = name.lower()
+ cls._type = t
+ dirfactory.register(cls, t)
+
class Directory(Module):
'''a generic base class for any module that has to maintain state
on the file system in a directory
'''
- _type = 'directory'
+ __metaclass__ = MetaDirectory
def __init__(self, name=None):
''' initializer