92 |
92 |
93 def register_if_interface_found(self, obj, ifaces, **kwargs): |
93 def register_if_interface_found(self, obj, ifaces, **kwargs): |
94 """register an object but remove it if no entity class implements one of |
94 """register an object but remove it if no entity class implements one of |
95 the given interfaces |
95 the given interfaces |
96 """ |
96 """ |
|
97 self.register(obj, **kwargs) |
97 if not isinstance(ifaces, (tuple, list)): |
98 if not isinstance(ifaces, (tuple, list)): |
98 self._needs_iface[obj] = frozenset((ifaces,)) |
99 self._needs_iface[obj] = (ifaces,) |
99 else: |
100 else: |
100 self._needs_iface[obj] = frozenset(ifaces) |
101 self._needs_iface[obj] = ifaces |
101 self.register(obj, **kwargs) |
|
102 |
102 |
103 def register(self, obj, **kwargs): |
103 def register(self, obj, **kwargs): |
104 if kwargs.get('registryname', obj.__registry__) == 'etypes': |
104 if kwargs.get('registryname', obj.__registry__) == 'etypes': |
105 kwargs['clear'] = True |
105 kwargs['clear'] = True |
106 super(CubicWebRegistry, self).register(obj, **kwargs) |
106 super(CubicWebRegistry, self).register(obj, **kwargs) |
107 # XXX bw compat |
107 # XXX bw compat |
108 ifaces = use_interfaces(obj) |
108 ifaces = use_interfaces(obj) |
109 if ifaces: |
109 if ifaces: |
110 self._needs_iface[obj] = frozenset(ifaces) |
110 self._needs_iface[obj] = ifaces |
111 |
111 |
112 def register_objects(self, path, force_reload=None): |
112 def register_objects(self, path, force_reload=None): |
113 """overriden to remove objects requiring a missing interface""" |
113 """overriden to remove objects requiring a missing interface""" |
114 if super(CubicWebRegistry, self).register_objects(path, force_reload): |
114 if super(CubicWebRegistry, self).register_objects(path, force_reload): |
115 # clear etype cache if you don't want to run into deep weirdness |
115 # clear etype cache if you don't want to run into deep weirdness |
122 interfaces = set() |
122 interfaces = set() |
123 for classes in self.get('etypes', {}).values(): |
123 for classes in self.get('etypes', {}).values(): |
124 for cls in classes: |
124 for cls in classes: |
125 for iface in cls.__implements__: |
125 for iface in cls.__implements__: |
126 interfaces.update(expand_parent_classes(iface)) |
126 interfaces.update(expand_parent_classes(iface)) |
|
127 interfaces.update(expand_parent_classes(cls)) |
127 for obj, ifaces in self._needs_iface.items(): |
128 for obj, ifaces in self._needs_iface.items(): |
|
129 ifaces = frozenset(isinstance(iface, basestring) and self.etype_class(iface) or iface |
|
130 for iface in ifaces) |
128 if not ifaces & interfaces: |
131 if not ifaces & interfaces: |
129 self.debug('kicking vobject %s (unsupported interface)', obj) |
132 self.debug('kicking vobject %s (unsupported interface)', obj) |
130 self.unregister(obj) |
133 self.unregister(obj) |
131 |
134 |
132 |
135 |