diff options
-rw-r--r-- | setup.py | 3 | ||||
-rw-r--r-- | src/zope/traversing/adapters.py | 4 | ||||
-rw-r--r-- | src/zope/traversing/api.py | 3 | ||||
-rw-r--r-- | src/zope/traversing/browser/absoluteurl.py | 21 | ||||
-rw-r--r-- | src/zope/traversing/browser/tests.py | 2 | ||||
-rw-r--r-- | src/zope/traversing/namespace.py | 17 | ||||
-rw-r--r-- | src/zope/traversing/publicationtraverse.py | 4 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_dependencies.py | 4 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_lang.py | 8 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_namespacetrversal.py | 13 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_skin.py | 2 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_vh.py | 2 | ||||
-rw-r--r-- | src/zope/traversing/tests/test_vhosting.py | 5 |
13 files changed, 56 insertions, 32 deletions
@@ -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 |