diff -r 000000000000 -r b97547f5f1fa goa/goavreg.py --- /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')) + + +