"""
Interface utilities bridging Python ABCs and Zope interfaces.
This module provides experimental utilities for working with interfaces
that bridge Python's Abstract Base Classes (ABCs) with Zope interfaces.
Note
----
This module is experimental and may change in future versions.
"""
from abc import ABCMeta
from zope.interface import Interface as _ZInterface
class _InterfaceBase(ABCMeta):
def __new__(mcs, name, bases, attrs, *, __zope_interface__=None):
if __zope_interface__ is not None:
rv = super().__new__(mcs, name, bases, attrs)
rv.__zope_interface__ = __zope_interface__
return rv
return InterfaceImplementor(name, bases, attrs)
def __init__(cls, name, bases, attrs, *, __zope_interface__=None):
print(type(cls))
print(cls.__name__, cls.__qualname__, cls.__module__)
super().__init__(name, bases, attrs)
@property
def zope_interface(cls):
return cls.__zope_interface__
[docs]
class InterfaceImplementor(_InterfaceBase):
def __new__(mcs, name, bases, attrs, *, is_interface=False):
attrs['__interface__'] = None
return ABCMeta.__new__(mcs, name, bases, attrs)
@property
def zope_interface(cls):
raise AttributeError('{} is not a SimpleInterface, and '
'therefore has no Zope Interface'.format(cls))
[docs]
def SimpleInterface(name, bases, attrs):
modname = attrs.get('__module__')
if modname:
modname += '.autogenerated_interfaces'
namespace = {'__module__': modname,
'__qualname__': attrs.get('qualname')}
zinterface = _ZInterface.__class__(name, (_ZInterface,), namespace)
# TODO: actually do the interface description here
created = _InterfaceBase(name, bases, attrs, __zope_interface__=zinterface)
return created