can't register adapters for classes with metaclasses

Chris Withers <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <[email protected]>
Hi All,

This is particularly problematic when using the common case of 
SQLAlchemy declaratively mapped model classes.

The attached unit test when run will fail with:

Error in test test_provideAdapter (test_sa.TestAdapter)
Traceback (most recent call last):
   File "/usr/local/lib/python2.6/unittest.py", line 279, in run
     testMethod()
   File "test_sa.py", line 25, in test_provideAdapter
     provideAdapter(MyAdapter,Model)
   File 
"zope.component-3.10.0-py2.6.egg/zope/component/globalregistry.py", line 
72, in provideAdapter
     base.registerAdapter(factory, adapts, provides, name, event=False)
   File "zope.component-3.10.0-py2.6.egg/zope/component/registry.py", 
line 182, in registerAdapter
     required = _getAdapterRequired(factory, required)
   File "zope.component-3.10.0-py2.6.egg/zope/component/registry.py", 
line 414, in _getAdapterRequired
     for r in required:
TypeError: 'DeclarativeMeta' object is not iterable

Why is that and how should I register an adapter against such a class?

cheers,

Chris

-- 
Simplistix - Content Management, Batch Processing & Python Consulting
            - http://www.simplistix.co.uk

_______________________________________________
Zope-Dev maillist  -  [email protected]
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )
test_sa.py (text/plain, 650 B)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer
from unittest import TestCase
from zope.component import provideAdapter
from zope.interface import implements,Interface


class TestAdapter(TestCase):
    
    def test_provideAdapter(self):
        # setup
        Base = declarative_base()
        class Model(Base):
            __tablename__='model'
            id = Column('id', Integer, primary_key=True)

        class IMyInterface(Interface):
            pass

        class MyAdapter:
            implements(IMyInterface)

        provideAdapter(MyAdapter,Model)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.