goa/goavreg.py
changeset 0 b97547f5f1fa
child 9 1901fcf55ed4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/goa/goavreg.py	Wed Nov 05 15:52:50 2008 +0100
@@ -0,0 +1,75 @@
+"""goa specific registry
+
+:organization: Logilab
+:copyright: 2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
+"""
+__docformat__ = "restructuredtext en"
+
+from os import listdir
+from os.path import join, isdir
+
+from cubicweb import CW_SOFTWARE_ROOT
+from cubicweb.cwvreg import CubicWebRegistry
+
+
+def _pkg_name(cube, module):
+    if cube is None:
+        return module
+    return '%s.%s' % (cube, module)
+
+class GAERegistry(CubicWebRegistry):
+    
+    def set_schema(self, schema):
+        """disable reload hooks of cubicweb registry set_schema method"""
+        self.schema = schema
+
+    def load(self, applroot):
+        from cubicweb.goa import db
+        self.load_module(db) # AnyEntity class
+        # explicit loading, we don't want to load __init__.py
+        self.load_directory(join(CW_SOFTWARE_ROOT, 'entities'),
+                            'cubicweb.entities', skip=('__init__.py',))
+        self.load_directory(join(CW_SOFTWARE_ROOT, 'web', 'views'),
+                            'cubicweb.web.views')
+        self.load_directory(join(CW_SOFTWARE_ROOT, 'goa', 'appobjects'),
+                            'cubicweb.goa.appobjects')
+        for cube in reversed(self.config.cubes()):
+            self.load_cube(cube)
+        self.load_application(applroot)
+        
+    def load_directory(self, directory, cube, skip=()):
+        for filename in listdir(directory):
+            if filename[-3:] == '.py' and not filename in skip:
+                self._import('%s.%s' % (cube, filename[:-3]))
+
+    def load_cube(self, cube):
+        self._auto_load(self.config.cube_dir(cube),
+                        cube in self.config['included-cubes'],
+                        cube)
+
+    def load_application(self, applroot):
+        self._auto_load(applroot, self.config['schema-type'] == 'dbmodel')
+
+    def _import(self, modname):
+        obj = __import__(modname)
+        for attr in modname.split('.')[1:]:
+            obj = getattr(obj, attr)
+        self.load_module(obj)
+
+    def _auto_load(self, path, loadschema, cube=None):
+        vobjpath = self.config.cube_vobject_path
+        for filename in listdir(path):
+            if filename[-3:] == '.py' and filename[:-3] in vobjpath:
+                self._import(_pkg_name(cube, filename[:-3]))
+            else:
+                abspath = join(path, filename)
+                if isdir(abspath) and filename in vobjpath:
+                    self.load_directory(abspath, _pkg_name(cube, filename))
+        if loadschema:
+            # when using db.Model defined schema, the defined class is used as
+            # entity class as well and so have to be registered
+            self._import(_pkg_name(cube, 'schema'))
+
+
+