Skip to content

Commit

Permalink
Get rid of zope.app.zapi. Fix tests, improve test coverage.
Browse files Browse the repository at this point in the history
  • Loading branch information
nadako committed Feb 2, 2009
1 parent 1741a17 commit 84e6538
Show file tree
Hide file tree
Showing 16 changed files with 115 additions and 28 deletions.
13 changes: 13 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@
CHANGES
=======

0.2.4 (unreleased)
------------------

- Make ``PluggableBrowserTraverser`` implement ``IBrowserPublisher``
interface.
- Fix tests and deprecation warnings.
- Improve test coverage.
- Get rid of zope.app.zapi dependency by replacing its uses with direct
calls.
- Change package's mailing list address to zope-dev at zope.org,
because zope3-dev at zope.org is now retired.
- Change "cheeseshop" to "pypi" in the package's url.

0.2.3 (2008-07-14)
------------------

Expand Down
13 changes: 12 additions & 1 deletion buildout.cfg
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
[buildout]
develop = .
parts = test
parts = test coverage-test coverage-report

[test]
recipe = zc.recipe.testrunner
defaults = ['--tests-pattern', '^f?tests$']
eggs = z3c.traverser [test]

[coverage-test]
recipe = zc.recipe.testrunner
eggs = z3c.traverser [test]
defaults = ['--coverage', '../../coverage', '--tests-pattern', '^f?tests$']

[coverage-report]
recipe = zc.recipe.egg
eggs = z3c.coverage
scripts = coverage=coverage-report
arguments = ('coverage', 'coverage/report')
8 changes: 4 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

setup(name='z3c.traverser',
version = '0.2.3',
version = '0.2.4dev',
author='Zope Corporation and Contributors',
author_email='zope3-dev@zope.org',
author_email='zope-dev@zope.org',
description='Pluggable Traverser API',
long_description=(
read('README.txt')
+ '\n\n' +
'Detailed Dcoumentation\n' +
'Detailed Documentation\n' +
'======================\n'
+ '\n\n' +
read('src', 'z3c', 'traverser', 'README.txt')
Expand Down Expand Up @@ -57,7 +57,7 @@ def read(*rnames):
'Operating System :: OS Independent',
'Topic :: Internet :: WWW/HTTP',
'Framework :: Zope3'],
url='http://cheeseshop.python.org/pypi/z3c.traverser',
url='http://pypi.python.org/pypi/z3c.traverser',
license='ZPL 2.1',
packages=find_packages('src'),
package_dir = {'': 'src'},
Expand Down
1 change: 0 additions & 1 deletion src/z3c/traverser/DEPENDENCIES.cfg

This file was deleted.

33 changes: 32 additions & 1 deletion src/z3c/traverser/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,18 @@ So here is the result:
>>> traverser.publishTraverse(request, 'some')
<SomeAdapter object at ...>

If the object is not adaptable, we'll get NotFound. Let's register a
plugin that tries to query a named adapter for ISomeAdapter. The third
argument for AdapterTraverserPlugin is used to specify the adapter name.

>>> provideSubscriptionAdapter(
... AdapterTraverserPlugin('badadapter', ISomeAdapter, 'other'),
... (IMyContainer, IPublisherRequest))

>>> traverser.publishTraverse(request, 'badadapter')
Traceback (most recent call last):
...
NotFound: Object: <MyContainer object at ...>, name: 'badadapter'

Traverser Plugins
-----------------
Expand All @@ -203,7 +215,7 @@ the the `NullTraverserPlugin`, which always just returns the object itself:
NotFound: Object: <Content object at ...>, name: 'something else'

All of the above traversers with exception of the `ContainerTraverserPlugin`
are realizations of the abstract `NameTraverserPlugin` class. Name traversers
are implementation of the abstract `NameTraverserPlugin` class. Name traversers
are traversers that can resolve one particular name. By using the abstract
`NameTraverserPlugin` class, all of the traverser boilerplate can be
avoided. Here is a simple example that always returns a specific value for a
Expand Down Expand Up @@ -249,3 +261,22 @@ accessible attributes of an object:
...
NotFound: Object: <MyContainer object at ...>, name: 'some'


Browser traverser
-----------------

There's also a special subclass of the PluggableTraverser that
implements the ``IBrowserPublisher`` interface, thus providing the
``browserDefault`` method that returns a default object and a view
name to traverse and use if there's no more steps to traverse.

Let's provide a view name registered as an IDefaultView adapter. This
is usually done by zope.app.publisher's browser:defaultView directive.

>>> from zope.component.interfaces import IDefaultViewName
>>> provideAdapter('view.html', (IContent, Interface), IDefaultViewName)

>>> from z3c.traverser.browser import PluggableBrowserTraverser
>>> traverser = PluggableBrowserTraverser(content, request)
>>> traverser.browserDefault(request)
(<Content object at 0x...>, ('@@view.html',))
20 changes: 17 additions & 3 deletions src/z3c/traverser/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,28 @@
$Id$
"""
__docformat__ = "reStructuredText"
from zope.app import zapi
from zope.component import getSiteManager
from zope.component.interfaces import ComponentLookupError, IDefaultViewName
from zope.interface import implements, providedBy
from zope.publisher.interfaces.browser import IBrowserPublisher

from z3c.traverser.traverser import PluggableTraverser

# copy the function from zope.app.publisher not to depend on it
def getDefaultViewName(object, request):
name = getSiteManager().adapters.lookup(
(providedBy(object), providedBy(request)), IDefaultViewName)
if name is not None:
return name
raise ComponentLookupError("Couldn't find default view name",
object, request)

class PluggableBrowserTraverser(PluggableTraverser):

implements(IBrowserPublisher)

def browserDefault(self, request):
"""See zope.publisher.browser.interfaces.IBrowserPublisher"""
view_name = zapi.getDefaultViewName(self.context, request)
view_uri = "@@%s" %view_name
view_name = getDefaultViewName(self.context, request)
view_uri = "@@%s" % view_name
return self.context, (view_uri,)
15 changes: 15 additions & 0 deletions src/z3c/traverser/stackinfo/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,18 @@ Or only the object below.
'http://127.0.0.1/content'
>>> traversing.unconsumedURL(under, request)
'http://127.0.0.1/content/under/kv/key2/value2'

The unconsumedURL function is also available as a view, named
``unconsumed_url``, similar to ``absolute_url`` one.

>>> from zope.component import getMultiAdapter
>>> url = getMultiAdapter((under, request), name='unconsumed_url')

>>> str(url)
'http://127.0.0.1/content/under/kv/key2/value2'

>>> unicode(url)
u'http://127.0.0.1/content/under/kv/key2/value2'

>>> url()
'http://127.0.0.1/content/under/kv/key2/value2'
3 changes: 0 additions & 3 deletions src/z3c/traverser/stackinfo/SETUP.cfg

This file was deleted.

2 changes: 1 addition & 1 deletion src/z3c/traverser/stackinfo/ftesting.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy" />

<include package="zope.app.securitypolicy" />
<include package="zope.app.session" />
<include package="zope.session" />

<include package="z3c.traverser.stackinfo"/>
<include package="z3c.traverser.stackinfo.testing"/>
Expand Down
4 changes: 2 additions & 2 deletions src/z3c/traverser/stackinfo/testing/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
i18n_domain="zope">

<browser:page
for="zope.app.component.interfaces.ISite"
for="zope.location.interfaces.ISite"
name="stackinfo.html"
permission="zope.Public"
class=".views.StackInfoView"/>

<subscriber
for="zope.app.component.interfaces.ISite
for="zope.location.interfaces.ISite
zope.app.publication.interfaces.IBeforeTraverseEvent"
handler="z3c.traverser.stackinfo.applyStackConsumersHandler"
/>
Expand Down
2 changes: 1 addition & 1 deletion src/z3c/traverser/stackinfo/testing/consumer.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from z3c.traverser.stackinfo.consumer import BaseConsumer
from z3c.traverser.stackinfo import interfaces
from zope import interface, component
from zope.app.component.interfaces import ISite
from zope.location.interfaces import ISite
from zope.publisher.interfaces.browser import IBrowserRequest

class KeyValueConsumer(BaseConsumer):
Expand Down
7 changes: 7 additions & 0 deletions src/z3c/traverser/stackinfo/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@
import unittest
from zope.testing.doctestunit import DocFileSuite, DocFileSuite
from zope.app.testing import setup
from zope.component import provideAdapter
from zope.interface import Interface
from zope.publisher.interfaces.http import IHTTPRequest
import zope.traversing.testing

from z3c.traverser.stackinfo.traversing import UnconsumedURL

def setUp(test):
root = setup.placefulSetUp(True)
zope.traversing.testing.setUp()
test.globs['root'] = root
provideAdapter(UnconsumedURL, (Interface, IHTTPRequest), Interface,
name='unconsumed_url')

def tearDown(test):
setup.placefulTearDown()
Expand Down
14 changes: 8 additions & 6 deletions src/z3c/traverser/stackinfo/traversing.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import urllib

from zope import component
import interfaces
from zope.proxy import sameProxiedObjects
from zope.publisher.browser import BrowserView
from zope.publisher.interfaces import NotFound
from zope.traversing.browser.absoluteurl import absoluteURL
import urllib
from zope.publisher.browser import BrowserView

import interfaces

CONSUMERS_ANNOTATION_KEY='z3c.traverser.consumers'
CONSUMED_ANNOTATION_KEY='z3c.traverser.consumed'
Expand Down Expand Up @@ -38,7 +41,7 @@ def applyStackConsumers(context, request):
request.annotations[CONSUMERS_ANNOTATION_KEY] = []
else:
for obj, consumed in request.annotations[CONSUMED_ANNOTATION_KEY]:
if obj == context:
if sameProxiedObjects(obj, context):
return
orgStack = request.getTraversalStack()
cons = [cons for name, cons in getStackConsumers(
Expand Down Expand Up @@ -89,7 +92,7 @@ def unconsumedURL(context, request):
return url

class UnconsumedURL(BrowserView):
# XXX test this

def __unicode__(self):
return urllib.unquote(self.__str__()).decode('utf-8')

Expand All @@ -98,7 +101,6 @@ def __str__(self):

__call__ = __str__


class VHStack:
"""Helper class to work around the special case with virtual hosts"""

Expand Down

This file was deleted.

6 changes: 3 additions & 3 deletions src/z3c/traverser/viewlet/ftesting.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
/>

<browser:viewlet
for="zope.app.component.interfaces.ISite"
for="zope.location.interfaces.ISite"
name="OuterViewlet"
manager=".app.IOuterManager"
class=".app.OuterViewlet"
Expand All @@ -117,7 +117,7 @@
/>

<browser:viewlet
for="zope.app.component.interfaces.ISite"
for="zope.location.interfaces.ISite"
name="InnerViewlet"
manager=".app.IInnerManager"
class=".app.InnerViewlet"
Expand All @@ -130,7 +130,7 @@
/>

<browser:viewlet
for="zope.app.component.interfaces.ISite"
for="zope.location.interfaces.ISite"
name="MostInnerViewlet"
manager=".app.IMostInnerManager"
class=".app.MostInnerViewlet"
Expand Down

This file was deleted.

0 comments on commit 84e6538

Please sign in to comment.