--- a/cwvreg.py Thu May 20 20:47:13 2010 +0200
+++ b/cwvreg.py Thu May 20 20:47:55 2010 +0200
@@ -82,7 +82,6 @@
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register_all
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register_and_replace
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register
-.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.register_if_interface_found
.. automethod:: cubicweb.cwvreg.CubicWebVRegistry.unregister
Examples:
@@ -192,6 +191,8 @@
__docformat__ = "restructuredtext en"
_ = unicode
+from warnings import warn
+
from logilab.common.decorators import cached, clear_cache
from logilab.common.deprecation import deprecated
from logilab.common.modutils import cleanup_sys_modules
@@ -211,23 +212,23 @@
def use_interfaces(obj):
"""return interfaces used by the given object by searching for implements
- selectors, with a bw compat fallback to accepts_interfaces attribute
+ selectors
"""
from cubicweb.selectors import implements
- try:
- # XXX deprecated
- return sorted(obj.accepts_interfaces)
- except AttributeError:
- try:
- impl = obj.__select__.search_selector(implements)
- if impl:
- return sorted(impl.expected_ifaces)
- except AttributeError:
- pass # old-style appobject classes with no accepts_interfaces
- except:
- print 'bad selector %s on %s' % (obj.__select__, obj)
- raise
- return ()
+ impl = obj.__select__.search_selector(implements)
+ if impl:
+ return sorted(impl.expected_ifaces)
+ return ()
+
+def require_appobject(obj):
+ """return interfaces used by the given object by searching for implements
+ selectors
+ """
+ from cubicweb.selectors import appobject_selectable
+ impl = obj.__select__.search_selector(appobject_selectable)
+ if impl:
+ return (impl.registry, impl.regids)
+ return None
class CWRegistry(Registry):
@@ -477,6 +478,7 @@
def reset(self):
super(CubicWebVRegistry, self).reset()
self._needs_iface = {}
+ self._needs_appobject = {}
# two special registries, propertydefs which care all the property
# definitions, and propertyvals which contains values for those
# properties
@@ -536,6 +538,7 @@
for obj in objects:
obj.schema = schema
+ @deprecated('[3.9] use .register instead')
def register_if_interface_found(self, obj, ifaces, **kwargs):
"""register `obj` but remove it if no entity class implements one of
the given `ifaces` interfaces at the end of the registration process.
@@ -561,7 +564,15 @@
# XXX bw compat
ifaces = use_interfaces(obj)
if ifaces:
+ if not obj.__name__.endswith('Adapter') and \
+ any(iface for iface in ifaces if not isinstance(iface, basestring)):
+ warn('[3.9] %s: interfaces in implements selector are '
+ 'deprecated in favor of adapters / appobject_selectable '
+ 'selector' % obj.__name__, DeprecationWarning)
self._needs_iface[obj] = ifaces
+ depends_on = require_appobject(obj)
+ if depends_on is not None:
+ self._needs_appobject[obj] = depends_on
def register_objects(self, path, force_reload=False):
"""overriden to remove objects requiring a missing interface"""
@@ -578,13 +589,18 @@
# we may want to keep interface dependent objects (e.g.for i18n
# catalog generation)
if self.config.cleanup_interface_sobjects:
- # remove appobjects that don't support any available interface
+ # XXX deprecated with cw 3.9: remove appobjects that don't support
+ # any available interface
implemented_interfaces = set()
if 'Any' in self.get('etypes', ()):
for etype in self.schema.entities():
if etype.final:
continue
cls = self['etypes'].etype_class(etype)
+ if cls.__implements__:
+ warn('[3.9] %s: using __implements__/interfaces are '
+ 'deprecated in favor of adapters' % cls.__name__,
+ DeprecationWarning)
for iface in cls.__implements__:
implemented_interfaces.update(iface.__mro__)
implemented_interfaces.update(cls.__mro__)
@@ -598,9 +614,17 @@
self.debug('kicking appobject %s (no implemented '
'interface among %s)', obj, ifaces)
self.unregister(obj)
- # clear needs_iface so we don't try to remove some not-anymore-in
- # objects on automatic reloading
- self._needs_iface.clear()
+ # since 3.9: remove appobjects which depending on other, unexistant
+ # appobjects
+ for obj, (regname, regids) in self._needs_appobject.items():
+ registry = self[regname]
+ for regid in regids:
+ if registry.get(regid):
+ break
+ else:
+ self.debug('kicking %s (no %s object in registry %s)',
+ obj, ' or '.join(regids), registry)
+ self.unregister(obj)
super(CubicWebVRegistry, self).initialization_completed()
for rtag in RTAGS:
# don't check rtags if we don't want to cleanup_interface_sobjects