On 9 April 2012 15:41, Brian Sutherland <brian@vanguardistas.net> 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