Re: Adding broken/missing support to zope.interface? (was: experimental.broken - Graceful handling of broken interfaces and components in the ZODB)

Martin Aspeli <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <CAPN0AAT74-FGqdv+c=eMNTa4QcUUTz2385a8ReC8wD7FOYEQPA@mail.gmail.com>
On 9 April 2012 15:41, Brian Sutherland <[email protected]> wrote:

> On Sun, Apr 08, 2012 at 01:04:37PM -0700, Ross Patterson wrote:
> > experimental.broken is working well for me.  It greatly aided me in
> > getting through a particularly nasty upgrade allowing me to cleanup the
> > ZCA cruft left by poorly behaved add-ons.  I'd like to proceed with
> > adding the core of this to zope.interface and I need the
> > developers/maintainers to weigh in.
> >
> > The first and most fundamental matter is changing interface pickles such
> > that they can be unpickled into something that can fulfill the minimum
> > interface contract and don't break the ZCA.  To that end, I'd like to
> > add the following to zope.interface.interface:
> >
> >     ...
> >     try:
> >         from ZODB.broken import find_global
> >         from ZODB.broken import IBroken
> >         def find_interface(modulename, globalname,
> >                            Broken=IBroken, type=InterfaceClass):
> >             """
> >             Find a global interface, returning a broken interface if it
> can't be found.
> >             """
> >             return find_global(modulename, globalname,
> >                                Broken=IBroken, type=InterfaceClass)
> >     except ImportError:
> >         IBroken = Interface
> >         def find_interface(modulename, globalname,
> >                            Broken=IBroken, type=InterfaceClass):
> >             """
> >             Find a global interface, raising ImportError if it can't be
> found.
> >             """
> >             # From pickle.Unpickler.find_class
> >             __import__(module)
> >             mod = sys.modules[module]
> >             klass = getattr(mod, name)
> >             return klass
> >     ...
> >     class InterfaceClass(Element, InterfaceBase, Specification):
> >     ...
> >         def __reduce__(self):
> >             if self is IBroken:
> >                 return self.__name__
> >             return (find_interface, (modulename, globalname))
> >     ...
>
> -1
>
> For a number of reasons, but mainly because you add a test dependency on
> the ZODB from zope.interface. I think that zope.interface is such a
> fundamental package and the dependency is unacceptable.
>

It's a soft dependency only, looking at the code sample.


> There has lately been a LOT of work done reducing the dependency
> structure of zope.* packages. You need a VERY good reason to start
> reversing that.


 It doesn't add any more (required) dependencies.

This is a real issue that is breaking the sites of a lot of real users of
zope.interface in a way that is hard to debug and reverse.

Can you think of a better way to get around it? Other than "don't get into
the situation" which isn't a valid answer as long as the ZTK ecosystem
supports persistent local components.

Martin

_______________________________________________
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 )
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.