Re: [Zope] Re: Five: Adapter registry not working?

2007-06-04 Thread Peter Sabaini
FTR: I tracked this down again some more -- the culprit is not the adapter 
registry but a failing getUtility() call.

I really wish component lookup / adapation would be easier to debug; IMHO this 
is pretty opaque -- but then again I'm a newb at this.

peter.



On Wednesday 30 May 2007 18:51:18 Peter Sabaini wrote:
 On Wed 2007-05-30 17:14:13 Tres Seaver wrote:
  Peter Sabaini wrote:
   Hi list,
  
   I am clearly doing something wrong here.
  
   I try to use an Adapter from zope.app.session with an HTTPRequest
   object, but the Adapterregistry doesnt quite cooperate.
  
   Specifically, I try to adapt a HTTPRequest object to
   zope.app.session.interfaces.IClientId via the Adapter
   zope.app.session.session.ClientId
  
   A short demo:
  
   % ./zopectl debug
[ ... ]
  
   Import stuff:
from ZPublisher.HTTPRequest import *
from StringIO import StringIO
from zope.app.session.session import ClientId
from zope.app.session.interfaces import IClientId
from zope import component
from zope.interface import *
  
   Create ourselves a faux request object:
env = {'SERVER_NAME': '', 'SERVER_PORT' : ''}
request = HTTPRequest(StringIO(), env, None)
  
   ClientId implements IClientId:
list(implementedBy(ClientId))
  
   [InterfaceClass zope.app.session.interfaces.IClientId]
  
   It seems ClientId is an Adapter for IRequest:
component.adaptedBy(ClientId)
  
   (InterfaceClass zope.publisher.interfaces.IRequest,)
  
   request implements IBrowserRequest, which is a subclass of IRequest:
list(providedBy(request))
  
   [InterfaceClass
   zope.publisher.interfaces.browser.IBrowserRequest]
  
issubclass(list(providedBy(request))[0],
component.adaptedBy(ClientId)
  
   [0])
   True
  
   ...so I'd expect to get ClientId as an Adapter for IClientId(request),
   but I
  
   dont:
IClientId(request)
  
   Traceback (most recent call last):
 File stdin, line 1, in ?
   TypeError: ('Could not adapt', HTTPRequest, URL=http://:,
   InterfaceClass zope.app.session.interfaces.IClientId)
  
  
   Shouldnt this work? Obviously I am missing something here.
   This is on Zope 2.10.2 with the built-in Five, and Python 2.4.4
  
   Any help greatly appreciated!
 
  You have verified that 'ClientID' is a suitable candidate for adapting
  'IRequest' to 'IClientID', but not that it has been actually registered
  as the factory for that adaptaion.

 Ah, I see. I thought component.adaptedBy() checked the actual
 registration...

  Does adding the following help?
 
 from zope.component import provideAdapter
 provideAdapter(ClientID)

 Nope, I still get the Could not adapt ...  error.

 Besides, zope/app/session/configure.zcml has the following:

   adapter
   factory=.session.ClientId
   permission=zope.Public
   /

 and ClientId has:

 class ClientId(str):
 implements(IClientId)
 adapts(IRequest)

 Does that take care of registration?

 I wonder if I need to do some special Five incantation to make the global
 registration work?

 This, on the other hand, works quite well (lifted from some unit tests):
  from cStringIO import StringIO
  from zope.app.testing import ztapi, placelesssetup
  from zope.app.session.interfaces import IClientId, IClientIdManager
  from zope.app.session.session import ClientId
  from zope.app.session.http import CookieClientIdManager
  from zope.publisher.interfaces import IRequest
  from zope.publisher.http import HTTPRequest
 
  placelesssetup.setUp()
  ztapi.provideAdapter(IRequest, IClientId, ClientId)
  ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
  request = HTTPRequest(StringIO(), {}, None)
  IClientId(request)

 'WiKfis240zXEVZ0UWM6H6AsWc6kYwJyviHNXhGqd835xsnZhKlzfjc'

 The difference: zope.publisher.http.HTTPRequest is a new-style class (is
 that required?), and placelesssetup.setUp() is executed (what does it do?)

  Also, at the point where the lookup fails, you can try:
 import pdb; pdb.pm()
 
  and be in a postmortem traceback of the failed component tookup.

 I'm afraid I'm not sure what I should be looking for...

 Thanks a lot,
 peter.

  Tres.

 ___
 Zope maillist  -  Zope@zope.org
 http://mail.zope.org/mailman/listinfo/zope
 **   No cross posts or HTML encoding!  **
 (Related lists -
  http://mail.zope.org/mailman/listinfo/zope-announce
  http://mail.zope.org/mailman/listinfo/zope-dev )


___
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )


[Zope] Re: Five: Adapter registry not working?

2007-05-30 Thread Tres Seaver
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Peter Sabaini wrote:
 Hi list,
 
 I am clearly doing something wrong here.
 
 I try to use an Adapter from zope.app.session with an HTTPRequest object, but 
 the Adapterregistry doesnt quite cooperate.
 
 Specifically, I try to adapt a HTTPRequest object to 
 zope.app.session.interfaces.IClientId via the Adapter 
 zope.app.session.session.ClientId
 
 A short demo:
 
 % ./zopectl debug
  [ ... ]
 
 Import stuff:
 
  from ZPublisher.HTTPRequest import *
  from StringIO import StringIO
  from zope.app.session.session import ClientId
  from zope.app.session.interfaces import IClientId
  from zope import component
  from zope.interface import *
 
 Create ourselves a faux request object:
 
  env = {'SERVER_NAME': '', 'SERVER_PORT' : ''}
  request = HTTPRequest(StringIO(), env, None)
 
 ClientId implements IClientId:
 
  list(implementedBy(ClientId))
 [InterfaceClass zope.app.session.interfaces.IClientId]
 
 It seems ClientId is an Adapter for IRequest:
 
  component.adaptedBy(ClientId)
 (InterfaceClass zope.publisher.interfaces.IRequest,)
 
 request implements IBrowserRequest, which is a subclass of IRequest:
 
  list(providedBy(request))
 [InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest]
  issubclass(list(providedBy(request))[0], component.adaptedBy(ClientId)
 [0])
 True
 
 ...so I'd expect to get ClientId as an Adapter for IClientId(request), but I 
 dont:
 
  IClientId(request)
 Traceback (most recent call last):
   File stdin, line 1, in ?
 TypeError: ('Could not adapt', HTTPRequest, URL=http://:, 
 InterfaceClass zope.app.session.interfaces.IClientId)
 
 
 Shouldnt this work? Obviously I am missing something here.
 This is on Zope 2.10.2 with the built-in Five, and Python 2.4.4
 
 Any help greatly appreciated!

You have verified that 'ClientID' is a suitable candidate for adapting
'IRequest' to 'IClientID', but not that it has been actually registered
as the factory for that adaptaion.

Does adding the following help?

   from zope.component import provideAdapter
   provideAdapter(ClientID)

Also, at the point where the lookup fails, you can try:

   import pdb; pdb.pm()

and be in a postmortem traceback of the failed component tookup.


Tres.
- --
===
Tres Seaver  +1 540-429-0999  [EMAIL PROTECTED]
Palladion Software   Excellence by Designhttp://palladion.com
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGXZTF+gerLs4ltQ4RAvLzAJ0UR0/wFghBJK0YcgtGJjdodTBUzwCfdBG/
J0+AFzw3+yGrOgjSQVpzkyw=
=xa7i
-END PGP SIGNATURE-

___
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )


Re: [Zope] Re: Five: Adapter registry not working?

2007-05-30 Thread Peter Sabaini
On Wed 2007-05-30 17:14:13 Tres Seaver wrote:
 Peter Sabaini wrote:
  Hi list,
 
  I am clearly doing something wrong here.
 
  I try to use an Adapter from zope.app.session with an HTTPRequest object,
  but the Adapterregistry doesnt quite cooperate.
 
  Specifically, I try to adapt a HTTPRequest object to
  zope.app.session.interfaces.IClientId via the Adapter
  zope.app.session.session.ClientId
 
  A short demo:
 
  % ./zopectl debug
   [ ... ]
 
  Import stuff:
   from ZPublisher.HTTPRequest import *
   from StringIO import StringIO
   from zope.app.session.session import ClientId
   from zope.app.session.interfaces import IClientId
   from zope import component
   from zope.interface import *
 
  Create ourselves a faux request object:
   env = {'SERVER_NAME': '', 'SERVER_PORT' : ''}
   request = HTTPRequest(StringIO(), env, None)
 
  ClientId implements IClientId:
   list(implementedBy(ClientId))
 
  [InterfaceClass zope.app.session.interfaces.IClientId]
 
  It seems ClientId is an Adapter for IRequest:
   component.adaptedBy(ClientId)
 
  (InterfaceClass zope.publisher.interfaces.IRequest,)
 
  request implements IBrowserRequest, which is a subclass of IRequest:
   list(providedBy(request))
 
  [InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest]
 
   issubclass(list(providedBy(request))[0],
   component.adaptedBy(ClientId)
 
  [0])
  True
 
  ...so I'd expect to get ClientId as an Adapter for IClientId(request),
  but I
 
  dont:
   IClientId(request)
 
  Traceback (most recent call last):
File stdin, line 1, in ?
  TypeError: ('Could not adapt', HTTPRequest, URL=http://:,
  InterfaceClass zope.app.session.interfaces.IClientId)
 
 
  Shouldnt this work? Obviously I am missing something here.
  This is on Zope 2.10.2 with the built-in Five, and Python 2.4.4
 
  Any help greatly appreciated!

 You have verified that 'ClientID' is a suitable candidate for adapting
 'IRequest' to 'IClientID', but not that it has been actually registered
 as the factory for that adaptaion.

Ah, I see. I thought component.adaptedBy() checked the actual registration... 

 Does adding the following help?

from zope.component import provideAdapter
provideAdapter(ClientID)

Nope, I still get the Could not adapt ...  error.

Besides, zope/app/session/configure.zcml has the following:

  adapter
  factory=.session.ClientId
  permission=zope.Public 
  /

and ClientId has:

class ClientId(str):
implements(IClientId)
adapts(IRequest)

Does that take care of registration?

I wonder if I need to do some special Five incantation to make the global 
registration work?

This, on the other hand, works quite well (lifted from some unit tests):

 from cStringIO import StringIO
 from zope.app.testing import ztapi, placelesssetup
 from zope.app.session.interfaces import IClientId, IClientIdManager
 from zope.app.session.session import ClientId
 from zope.app.session.http import CookieClientIdManager
 from zope.publisher.interfaces import IRequest
 from zope.publisher.http import HTTPRequest

 placelesssetup.setUp()
 ztapi.provideAdapter(IRequest, IClientId, ClientId)
 ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
 request = HTTPRequest(StringIO(), {}, None)
 IClientId(request)
'WiKfis240zXEVZ0UWM6H6AsWc6kYwJyviHNXhGqd835xsnZhKlzfjc'

The difference: zope.publisher.http.HTTPRequest is a new-style class (is that 
required?), and placelesssetup.setUp() is executed (what does it do?)

 Also, at the point where the lookup fails, you can try:
import pdb; pdb.pm()

 and be in a postmortem traceback of the failed component tookup.

I'm afraid I'm not sure what I should be looking for...

Thanks a lot,
peter.


 Tres.


___
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )