Tres Seaver
2012-03-18 53987b9276f10ae080383c9001fe4c20408c741c
Moar centralized compat imports.

Plus, normalize handling of appiter-as-bytes.
3 files modified
68 ■■■■■ changed files
repoze/who/_compat.py 9 ●●●●● patch | view | raw | blame | history
repoze/who/plugins/redirector.py 13 ●●●● patch | view | raw | blame | history
repoze/who/plugins/tests/test_redirector.py 46 ●●●● patch | view | raw | blame | history
repoze/who/_compat.py
@@ -40,12 +40,21 @@
    from io import StringIO
try:
    from urllib import urlencode
    from urllib import quote as url_quote
    from urllib import unquote as url_unquote
except ImportError: #pragma NO COVER Python >= 3.0
    from urllib.parse import urlencode
    from urllib.parse import quote as url_quote
    from urllib.parse import unquote as url_unquote
try:
    from urlparse import urlparse
    from urlparse import urlunparse
except ImportError: #pragma NO COVER Python >= 3.0
    from urllib.parse import urlparse
    from urllib.parse import urlunparse
import wsgiref.util
import wsgiref.headers
repoze/who/plugins/redirector.py
@@ -1,7 +1,3 @@
try:
    import urlparse
except ImportError: #pragma NO COVER Python >= 3.0
    from urllib import parse as urlparse
import urllib
import cgi
@@ -11,6 +7,9 @@
from repoze.who.interfaces import IChallenger
from repoze.who._compat import construct_url
from repoze.who._compat import header_value
from repoze.who._compat import urlencode
from repoze.who._compat import urlparse
from repoze.who._compat import urlunparse
@implementer(IChallenger)
class RedirectorPlugin(object):
@@ -36,7 +35,7 @@
                "or neither one.")
        self.reason_param = reason_param
        self.reason_header = reason_header
        self._login_url_parts = list(urlparse.urlparse(login_url))
        self._login_url_parts = list(urlparse(login_url))
    # IChallenger
    def challenge(self, environ, status, app_headers, forget_headers):
@@ -50,8 +49,8 @@
                    query_elements[self.reason_param] = reason
            if self.came_from_param is not None:
                query_elements[self.came_from_param] = construct_url(environ)
            url_parts[4] = urllib.urlencode(query_elements, doseq=True)
            login_url = urlparse.urlunparse(url_parts)
            url_parts[4] = urlencode(query_elements, doseq=True)
            login_url = urlunparse(url_parts)
        else:
            login_url = self.login_url
        headers = [('Location', login_url)] + forget_headers
repoze/who/plugins/tests/test_redirector.py
@@ -20,7 +20,7 @@
    def _makeEnviron(self, login=None, password=None, came_from=None,
                         path_info='/', identifier=None, max_age=None):
        from StringIO import StringIO
        from repoze.who._compat import StringIO
        fields = []
        if login:
            fields.append(('login', login))
@@ -69,8 +69,8 @@
                                        reason_header='X-Reason')
    def test_challenge(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from',
                               reason_param='reason',
                               reason_header='X-Authorization-Failure-Reason',
@@ -79,13 +79,13 @@
        app = plugin.challenge(environ, '401 Unauthorized', [('app', '1')],
                               [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[0][0], 'forget')
        self.assertEqual(sr.headers[0][1], '1')
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 1)
        came_from_key, came_from_value = parts_qsl[0]
@@ -103,8 +103,8 @@
        self.assertEqual(sr.status, '302 Found')
    def test_challenge_with_reason_header(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from',
                               reason_param='reason',
                               reason_header='X-Authorization-Failure-Reason',
@@ -115,11 +115,11 @@
            [('X-Authorization-Failure-Reason', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 2)
        parts_qsl.sort()
@@ -135,8 +135,8 @@
        self.assertEqual(reason_value, 'you are ugly')
    def test_challenge_with_custom_reason_header(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from',
                               reason_param='reason',
                               reason_header='X-Custom-Auth-Failure',
@@ -148,11 +148,11 @@
            [('X-Authorization-Failure-Reason', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 1)
        came_from_key, came_from_value = parts_qsl[0]
@@ -164,8 +164,8 @@
        self.assertEqual(came_from_value, 'http://www.example.com/?default=1')
    def test_challenge_w_reason_no_reason_param_no_came_from_param(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne()
        environ = self._makeEnviron()
        app = plugin.challenge(
@@ -173,13 +173,13 @@
            [('X-Authorization-Failure-Reason', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[0][0], "forget")
        self.assertEqual(sr.headers[0][1], "1")
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 0)
        self.assertEqual(parts[0], 'http')
@@ -188,8 +188,8 @@
        self.assertEqual(parts[3], '')
    def test_challenge_w_reason_no_reason_param_w_came_from_param(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from',
                              )
        environ = self._makeEnviron()
@@ -199,11 +199,11 @@
            [('X-Authorization-Failure-Reason', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 1)
        came_from_key, came_from_value = parts_qsl[0]
@@ -215,8 +215,8 @@
        self.assertEqual(came_from_value, 'http://www.example.com/?default=1')
    def test_challenge_with_reason_and_custom_reason_param(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from',
                               reason_param='auth_failure',
                               reason_header='X-Custom-Auth-Failure',
@@ -228,11 +228,11 @@
             ('X-Custom-Auth-Failure', 'you are ugly')],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 2)
        parts_qsl.sort()
@@ -248,8 +248,8 @@
        self.assertEqual(reason_value, 'you are ugly')
    def test_challenge_wo_reason_w_came_from_param(self):
        import urlparse
        import cgi
        from repoze.who._compat import urlparse
        plugin = self._makeOne(came_from_param='came_from')
        environ = self._makeEnviron()
        app = plugin.challenge(
@@ -257,11 +257,11 @@
            [],
            [('forget', '1')])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[1][0], 'Location')
        url = sr.headers[1][1]
        parts = urlparse.urlparse(url)
        parts = urlparse(url)
        parts_qsl = cgi.parse_qsl(parts[4])
        self.assertEqual(len(parts_qsl), 1)
        came_from_key, came_from_value = parts_qsl[0]
@@ -284,7 +284,7 @@
            [('app', '1'), ('set-cookie','a'), ('set-cookie','b')],
            [])
        sr = DummyStartResponse()
        result = ''.join(app(environ, sr))
        result = b''.join(app(environ, sr)).decode('ascii')
        self.failUnless(result.startswith('302 Found'))
        self.assertEqual(sr.headers[0][0], 'set-cookie')
        self.assertEqual(sr.headers[0][1], 'a')