# HG changeset patch # User Thierry Florac # Date 1527230372 -7200 # Node ID 71a6c885b33648bc19da8e84e0eb1548b0baac25 # Parent 17f98772891ecd3ec6ab21a404e930032e9d116b Updated "factory_config" decorator to be able to register factories by name diff -r 17f98772891e -r 71a6c885b336 src/pyams_utils/factory.py --- a/src/pyams_utils/factory.py Fri May 25 08:08:14 2018 +0200 +++ b/src/pyams_utils/factory.py Fri May 25 08:39:32 2018 +0200 @@ -47,16 +47,18 @@ return iface.__module__ + '.' + iface.__name__ -def register_factory(interface, klass, registry=None): +def register_factory(interface, klass, registry=None, name=''): """Register factory for a given interface""" class Temp(ObjectFactoryAdapter): factory = klass - name = get_interface_name(interface) + if_name = get_interface_name(interface) + if name: + if_name = '{0}::{1}'.format(if_name, name) if registry is None: registry = get_global_registry() - registry.registerAdapter(Temp, name=name) + registry.registerAdapter(Temp, name=if_name) class factory_config(object): @@ -72,16 +74,22 @@ depth = settings.pop('_depth', 0) def callback(context, name, ob): - provides = settings.get('provided') - if not provides: + name = settings.get('name', '') + provided = settings.get('provided') + if not provided: raise TypeError("No provided interface(s) was given for registered factory %r" % ob) - if not isinstance(provides, tuple): - provides = (provides,) + if not isinstance(provided, tuple): + provided = (provided,) config = context.config.with_package(info.module) - for provided in provides: - logger.debug("Registering factory {0} for interface {1}".format(str(ob), str(provided))) - register_factory(provided, ob, config.registry) + for interface in provided: + if name: + logger.debug("Registering factory {0} for interface {1} with name {2}".format(str(ob), + str(interface), + name)) + else: + logger.debug("Registering default factory {0} for interface {1}".format(str(ob), str(interface))) + register_factory(interface, ob, config.registry, name) info = self.venusian.attach(wrapped, callback, category='pyams_factory', depth=depth + 1) if info.scope == 'class': @@ -95,9 +103,11 @@ return wrapped -def get_object_factory(interface, registry=None): +def get_object_factory(interface, registry=None, name=''): """Get registered factory for given interface""" - name = get_interface_name(interface) + if_name = get_interface_name(interface) + if name: + if_name = '{0}::{1}'.format(if_name, name) if registry is None: registry = get_global_registry() - return registry.queryAdapter(interface, IObjectFactory, name=name) + return registry.queryAdapter(interface, IObjectFactory, name=if_name)