summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--setup.py3
-rw-r--r--src/zope/traversing/adapters.py4
-rw-r--r--src/zope/traversing/api.py3
-rw-r--r--src/zope/traversing/browser/absoluteurl.py21
-rw-r--r--src/zope/traversing/browser/tests.py2
-rw-r--r--src/zope/traversing/namespace.py17
-rw-r--r--src/zope/traversing/publicationtraverse.py4
-rw-r--r--src/zope/traversing/tests/test_dependencies.py4
-rw-r--r--src/zope/traversing/tests/test_lang.py8
-rw-r--r--src/zope/traversing/tests/test_namespacetrversal.py13
-rw-r--r--src/zope/traversing/tests/test_skin.py2
-rw-r--r--src/zope/traversing/tests/test_vh.py2
-rw-r--r--src/zope/traversing/tests/test_vhosting.py5
13 files changed, 56 insertions, 32 deletions
diff --git a/setup.py b/setup.py
index 5728acd..6a7d99d 100644
--- a/setup.py
+++ b/setup.py
@@ -67,7 +67,7 @@ setup(name='zope.traversing',
package_dir = {'': 'src'},
namespace_packages=['zope',],
extras_require = dict(test=[
- 'ZODB3',
+ 'ZODB',
'zope.annotation',
'zope.browserresource[zcml]>=3.12',
'zope.component[zcml]',
@@ -80,6 +80,7 @@ setup(name='zope.traversing',
]),
install_requires=[
'setuptools',
+ 'six',
'zope.browserpage',
'zope.component',
'zope.i18n',
diff --git a/src/zope/traversing/adapters.py b/src/zope/traversing/adapters.py
index 4ed8297..f1aeba0 100644
--- a/src/zope/traversing/adapters.py
+++ b/src/zope/traversing/adapters.py
@@ -13,8 +13,8 @@
##############################################################################
"""Adapters for the traversing mechanism
"""
-from types import StringTypes
+import six
import zope.interface
from zope.location.interfaces import ILocationInfo, LocationError
@@ -62,7 +62,7 @@ class Traverser(object):
if not path:
return self.context
- if isinstance(path, StringTypes):
+ if isinstance(path, six.string_types):
path = path.split('/')
if len(path) > 1 and not path[-1]:
# Remove trailing slash
diff --git a/src/zope/traversing/api.py b/src/zope/traversing/api.py
index cc00bd8..63b65d7 100644
--- a/src/zope/traversing/api.py
+++ b/src/zope/traversing/api.py
@@ -13,6 +13,7 @@
##############################################################################
"""Convenience functions for traversing the object tree.
"""
+import six
from zope.interface import moduleProvides
from zope.location.interfaces import ILocationInfo, IRoot
from zope.traversing.interfaces import ITraversalAPI, ITraverser
@@ -200,7 +201,7 @@ def canonicalPath(path_or_object):
Raises ValueError if a badly formed path is given.
"""
- if isinstance(path_or_object, (str, unicode)):
+ if isinstance(path_or_object, six.string_types):
path = path_or_object
if not path:
raise ValueError("path must be non-empty: %s" % path)
diff --git a/src/zope/traversing/browser/absoluteurl.py b/src/zope/traversing/browser/absoluteurl.py
index 2526410..a07f389 100644
--- a/src/zope/traversing/browser/absoluteurl.py
+++ b/src/zope/traversing/browser/absoluteurl.py
@@ -13,7 +13,12 @@
##############################################################################
"""Absolute URL View components
"""
-import urllib
+try:
+ from urllib import quote as quote, unquote
+except ImportError:
+ from urllib.parse import quote_from_bytes as quote
+ from urllib.parse import unquote_to_bytes as unquote
+
import zope.component
from zope.interface import implementer
from zope.location.interfaces import ILocation
@@ -38,7 +43,7 @@ def absoluteURL(ob, request):
class AbsoluteURL(BrowserView):
def __unicode__(self):
- return urllib.unquote(self.__str__()).decode('utf-8')
+ return unquote(self.__str__()).decode('utf-8')
def __str__(self):
context = self.context
@@ -75,7 +80,7 @@ class AbsoluteURL(BrowserView):
raise TypeError(_insufficientContext)
if name:
- url += '/' + urllib.quote(name.encode('utf-8'), _safe)
+ url += '/' + quote(name.encode('utf-8'), _safe)
return url
@@ -106,8 +111,7 @@ class AbsoluteURL(BrowserView):
if name:
base += ({'name': name,
'url': ("%s/%s" % (base[-1]['url'],
- urllib.quote(name.encode('utf-8'),
- _safe)))
+ quote(name.encode('utf-8'), _safe)))
}, )
return base
@@ -117,7 +121,7 @@ class AbsoluteURL(BrowserView):
class SiteAbsoluteURL(BrowserView):
def __unicode__(self):
- return urllib.unquote(self.__str__()).decode('utf-8')
+ return unquote(self.__str__()).decode('utf-8')
def __str__(self):
context = self.context
@@ -129,7 +133,7 @@ class SiteAbsoluteURL(BrowserView):
url = request.getApplicationURL()
name = getattr(context, '__name__', None)
if name:
- url += '/' + urllib.quote(name.encode('utf-8'), _safe)
+ url += '/' + quote(name.encode('utf-8'), _safe)
return url
@@ -149,8 +153,7 @@ class SiteAbsoluteURL(BrowserView):
if name:
base += ({'name': name,
'url': ("%s/%s" % (base[-1]['url'],
- urllib.quote(name.encode('utf-8'),
- _safe)))
+ quote(name.encode('utf-8'), _safe)))
}, )
return base
diff --git a/src/zope/traversing/browser/tests.py b/src/zope/traversing/browser/tests.py
index c88c86d..1688ea2 100644
--- a/src/zope/traversing/browser/tests.py
+++ b/src/zope/traversing/browser/tests.py
@@ -194,7 +194,7 @@ class TestAbsoluteURL(PlacelessSetup, TestCase):
'http://127.0.0.1/%D0%B9/%D1%82/%D0%B5/%D1%81')
self.assertEqual(view(),
'http://127.0.0.1/%D0%B9/%D1%82/%D0%B5/%D1%81')
- self.assertEqual(unicode(view),
+ self.assertEqual(view.__unicode__(),
u'http://127.0.0.1/\u0439/\u0442/\u0435/\u0441')
self.assertEqual(absoluteURL(content, request),
'http://127.0.0.1/%D0%B9/%D1%82/%D0%B5/%D1%81')
diff --git a/src/zope/traversing/namespace.py b/src/zope/traversing/namespace.py
index 5b4c53e..68b17cf 100644
--- a/src/zope/traversing/namespace.py
+++ b/src/zope/traversing/namespace.py
@@ -17,6 +17,7 @@ __docformat__ = 'restructuredtext'
import re
+import six
import zope.component
import zope.interface
from zope.i18n.interfaces import IModifiableUserPreferredLanguages
@@ -73,7 +74,7 @@ def namespaceLookup(ns, name, object, request=None):
>>> namespaceLookup('fiz', 'bar', C()) # doctest: +ELLIPSIS
Traceback (most recent call last):
- ...
+ ...
LocationError: (<zope.traversing.namespace.C object at 0x...>, '++fiz++bar')
We'll get the same thing if we provide a request:
@@ -82,7 +83,7 @@ def namespaceLookup(ns, name, object, request=None):
>>> request = TestRequest()
>>> namespaceLookup('foo', 'bar', C(), request) # doctest: +ELLIPSIS
Traceback (most recent call last):
- ...
+ ...
LocationError: (<zope.traversing.namespace.C object at 0x...>, '++foo++bar')
We need to provide a view:
@@ -279,7 +280,7 @@ class attr(SimpleHandler):
>>> ob = {'x': 1}
>>> adapter = attr(ob)
- >>> adapter.traverse('keys', ())()
+ >>> list(adapter.traverse('keys', ())())
['x']
"""
@@ -378,7 +379,11 @@ class vh(view):
traversal_stack = request.getTraversalStack()
app_names = []
- name = name.encode('utf8')
+ if not six.PY3:
+ # `name` comes in as unicode, we need to make it a string
+ # so absolute URLs don't all become unicode.
+ name = name.encode('utf-8')
+
if name:
try:
proto, host, port = name.split(":")
@@ -434,7 +439,7 @@ class adapter(SimpleHandler):
>>> try:
... adapter.traverse('bob', ())
... except LocationError:
- ... print 'no adapter'
+ ... print('no adapter')
no adapter
Clean up:
@@ -508,7 +513,7 @@ class debug(view):
>>> try:
... adapter.traverse('badflag', ())
... except ValueError:
- ... print 'unknown debugging flag'
+ ... print('unknown debugging flag')
unknown debugging flag
"""
diff --git a/src/zope/traversing/publicationtraverse.py b/src/zope/traversing/publicationtraverse.py
index a828c67..a030776 100644
--- a/src/zope/traversing/publicationtraverse.py
+++ b/src/zope/traversing/publicationtraverse.py
@@ -14,8 +14,8 @@
"""Publication Traverser
"""
__docformat__ = 'restructuredtext'
-from types import StringTypes
+import six
from zope.component import queryMultiAdapter
from zope.publisher.interfaces import NotFound
from zope.security.checker import ProxyFactory
@@ -77,7 +77,7 @@ class PublicationTraverser(object):
def traversePath(self, request, ob, path):
- if isinstance(path, StringTypes):
+ if isinstance(path, six.string_types):
path = path.split('/')
if len(path) > 1 and not path[-1]:
# Remove trailing slash
diff --git a/src/zope/traversing/tests/test_dependencies.py b/src/zope/traversing/tests/test_dependencies.py
index b378e48..7466181 100644
--- a/src/zope/traversing/tests/test_dependencies.py
+++ b/src/zope/traversing/tests/test_dependencies.py
@@ -17,8 +17,8 @@ class ZCMLDependencies(unittest.TestCase):
res = zope.component.getMultiAdapter(
(self, request), ITraversable, 'lang')
import zope.traversing.namespace
- self.failUnless(isinstance(res, zope.traversing.namespace.lang))
- self.failUnless(res.context is self)
+ self.assertTrue(isinstance(res, zope.traversing.namespace.lang))
+ self.assertTrue(res.context is self)
def test_suite():
diff --git a/src/zope/traversing/tests/test_lang.py b/src/zope/traversing/tests/test_lang.py
index ead0364..888091b 100644
--- a/src/zope/traversing/tests/test_lang.py
+++ b/src/zope/traversing/tests/test_lang.py
@@ -48,13 +48,13 @@ class Test(CleanUp, unittest.TestCase):
def test_adapter(self):
request = self.request
browser_languages = IModifiableUserPreferredLanguages(request)
- self.failUnlessEqual(["en"], browser_languages.getPreferredLanguages())
+ self.assertEqual(["en"], browser_languages.getPreferredLanguages())
ob = object()
ob2 = lang(ob, request).traverse('ru', ())
- self.failUnless(ob is ob2)
- self.failUnless(request.shifted)
- self.failUnlessEqual(["ru"], browser_languages.getPreferredLanguages())
+ self.assertTrue(ob is ob2)
+ self.assertTrue(request.shifted)
+ self.assertEqual(["ru"], browser_languages.getPreferredLanguages())
def test_suite():
diff --git a/src/zope/traversing/tests/test_namespacetrversal.py b/src/zope/traversing/tests/test_namespacetrversal.py
index feabbda..bde36c3 100644
--- a/src/zope/traversing/tests/test_namespacetrversal.py
+++ b/src/zope/traversing/tests/test_namespacetrversal.py
@@ -13,13 +13,24 @@
##############################################################################
"""Traversal Namespace Tests
"""
+import re
from unittest import main
from doctest import DocTestSuite
from zope.component.testing import setUp, tearDown
+from zope.testing.renormalizing import RENormalizing
+
+
def test_suite():
+ checker = RENormalizing([
+ # Python 3 includes module name in exceptions
+ (re.compile(r"zope.location.interfaces.LocationError"),
+ "LocationError"),
+ ])
+
return DocTestSuite('zope.traversing.namespace',
- setUp=setUp, tearDown=tearDown)
+ setUp=setUp, tearDown=tearDown,
+ checker=checker)
if __name__ == '__main__':
main(defaultTest='test_suite')
diff --git a/src/zope/traversing/tests/test_skin.py b/src/zope/traversing/tests/test_skin.py
index f477ad0..405bb23 100644
--- a/src/zope/traversing/tests/test_skin.py
+++ b/src/zope/traversing/tests/test_skin.py
@@ -42,7 +42,7 @@ class Test(CleanUp, TestCase):
ob = object()
ob2 = skin(ob, request).traverse('foo', ())
self.assertEqual(ob, ob2)
- self.assert_(IFoo.providedBy(request))
+ self.assertTrue(IFoo.providedBy(request))
self.assertEqual(request.shifted, 1)
def test_missing_skin(self):
diff --git a/src/zope/traversing/tests/test_vh.py b/src/zope/traversing/tests/test_vh.py
index dd3a367..7a0a809 100644
--- a/src/zope/traversing/tests/test_vh.py
+++ b/src/zope/traversing/tests/test_vh.py
@@ -83,7 +83,7 @@ class TestVHNamespace(unittest.TestCase):
ob = object()
result = vh(ob, request).traverse(u'http:www.fubarco.com:80', ())
- assert(isinstance(request._app_server, str))
+ self.assertTrue(isinstance(request._app_server, str), repr(request._app_server))
def test_suite():
diff --git a/src/zope/traversing/tests/test_vhosting.py b/src/zope/traversing/tests/test_vhosting.py
index ff6a0c6..39043ae 100644
--- a/src/zope/traversing/tests/test_vhosting.py
+++ b/src/zope/traversing/tests/test_vhosting.py
@@ -15,7 +15,10 @@
"""
import os
import unittest
-from StringIO import StringIO
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
import transaction