{
    "file_diffs": [
        {
            "old_file_content": "import unittest\nfrom zope.interface import implementer\n\nfrom pyramid import testing\nfrom pyramid.exceptions import ConfigurationError\nfrom pyramid.interfaces import (\n    IResponse,\n    IRequest,\n    )\n\nclass TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n\nclass TestDerivationOrder(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_right_order_user_sorted(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2', 'decorated_view', 'deriv1')\n        self.config.add_view_deriver(None, 'deriv3', 'deriv2', 'deriv1')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv2',\n            'deriv3',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_implicit(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_under_rendered_view(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\n    def test_right_order_under_rendered_view_others(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\nclass TestAddDeriver(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_add_single_deriver(self):\n        response = DummyResponse()\n        response.deriv = False\n        view = lambda *arg: response\n\n        def deriv(view, info):\n            self.assertFalse(response.deriv)\n            response.deriv = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(response.deriv)\n        self.config.add_view_deriver(deriv, 'test_deriv')\n\n        result = self.config._derive_view(view)\n        self.assertTrue(response.deriv)\n\n    def test_override_deriver(self):\n        flags = {}\n\n        class AView:\n            def __init__(self):\n                self.response = DummyResponse()\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        def deriv2(view, info):\n            flags['deriv2'] = True\n            return view\n\n        view1 = AView()\n        self.config.add_view_deriver(deriv1, 'test_deriv')\n        result = self.config._derive_view(view1)\n        self.assertTrue(flags.get('deriv1'))\n        self.assertFalse(flags.get('deriv2'))\n\n        flags.clear()\n        view2 = AView()\n        self.config.add_view_deriver(deriv2, 'test_deriv')\n        result = self.config._derive_view(view2)\n        self.assertFalse(flags.get('deriv1'))\n        self.assertTrue(flags.get('deriv2'))\n\n    def test_override_mapped_view(self):\n        from pyramid.viewderivers import VIEW\n        response = DummyResponse()\n        view = lambda *arg: response\n        flags = {}\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(flags.get('deriv1'))\n\n        flags.clear()\n        self.config.add_view_deriver(\n            deriv1, name='mapped_view', under='rendered_view', over=VIEW)\n        result = self.config._derive_view(view)\n        self.assertTrue(flags.get('deriv1'))\n\n    def test_add_multi_derivers_ordered(self):\n        from pyramid.viewderivers import INGRESS\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append('deriv1')\n            return view\n\n        def deriv2(view, info):\n            response.deriv.append('deriv2')\n            return view\n\n        def deriv3(view, info):\n            response.deriv.append('deriv3')\n            return view\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2', INGRESS, 'deriv1')\n        self.config.add_view_deriver(deriv3, 'deriv3', 'deriv2', 'deriv1')\n        result = self.config._derive_view(view)\n        self.assertEqual(response.deriv, ['deriv1', 'deriv3', 'deriv2'])\n\n    def test_add_deriver_without_name(self):\n        from pyramid.interfaces import IViewDerivers\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1)\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        self.assertTrue('deriv1' in derivers.names)\n\n    def test_add_deriver_reserves_ingress(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        self.assertRaises(\n            ConfigurationError, self.config.add_view_deriver, deriv1, INGRESS)\n\n    def test_add_deriver_enforces_ingress_is_first(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, over=INGRESS)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be over INGRESS' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import VIEW\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, under=VIEW)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under VIEW' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_mapped_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, 'deriv1', under='mapped_view')\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under \"mapped_view\"' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n\nclass TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IExceptionViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))\n\n@implementer(IResponse)\nclass DummyResponse(object):\n    content_type = None\n    default_content_type = None\n    body = None\n\nclass DummyRequest:\n    subpath = ()\n    matchdict = None\n    request_iface  = IRequest\n\n    def __init__(self, environ=None):\n        if environ is None:\n            environ = {}\n        self.environ = environ\n        self.params = {}\n        self.cookies = {}\n        self.headers = {}\n        self.response = DummyResponse()\n\nclass DummyLogger:\n    def __init__(self):\n        self.messages = []\n    def info(self, msg):\n        self.messages.append(msg)\n    warn = info\n    debug = info\n\nclass DummySecurityPolicy:\n    def __init__(self, permitted=True):\n        self.permitted = permitted\n\n    def effective_principals(self, request):\n        return []\n\n    def permits(self, context, principals, permission):\n        return self.permitted\n\nclass DummySession(dict):\n    def get_csrf_token(self):\n        return self['csrf_token']\n\ndef parse_httpdate(s):\n    import datetime\n    # cannot use %Z, must use literal GMT; Jython honors timezone\n    # but CPython does not\n    return datetime.datetime.strptime(s, \"%a, %d %b %Y %H:%M:%S GMT\")\n\ndef assert_similar_datetime(one, two):\n    for attr in ('year', 'month', 'day', 'hour', 'minute'):\n        one_attr = getattr(one, attr)\n        two_attr = getattr(two, attr)\n        if not one_attr == two_attr: # pragma: no cover\n            raise AssertionError('%r != %r in %s' % (one_attr, two_attr, attr))\n",
            "new_file_content": "import unittest\nfrom zope.interface import implementer\n\nfrom pyramid import testing\nfrom pyramid.exceptions import ConfigurationError\nfrom pyramid.interfaces import (\n    IResponse,\n    IRequest,\n    )\n\nclass TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n\nclass TestDerivationOrder(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_right_order_user_sorted(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2', 'decorated_view', 'deriv1')\n        self.config.add_view_deriver(None, 'deriv3', 'deriv2', 'deriv1')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv2',\n            'deriv3',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_implicit(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_under_rendered_view(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\n    def test_right_order_under_rendered_view_others(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\nclass TestAddDeriver(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_add_single_deriver(self):\n        response = DummyResponse()\n        response.deriv = False\n        view = lambda *arg: response\n\n        def deriv(view, info):\n            self.assertFalse(response.deriv)\n            response.deriv = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(response.deriv)\n        self.config.add_view_deriver(deriv, 'test_deriv')\n\n        result = self.config._derive_view(view)\n        self.assertTrue(response.deriv)\n\n    def test_override_deriver(self):\n        flags = {}\n\n        class AView:\n            def __init__(self):\n                self.response = DummyResponse()\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        def deriv2(view, info):\n            flags['deriv2'] = True\n            return view\n\n        view1 = AView()\n        self.config.add_view_deriver(deriv1, 'test_deriv')\n        result = self.config._derive_view(view1)\n        self.assertTrue(flags.get('deriv1'))\n        self.assertFalse(flags.get('deriv2'))\n\n        flags.clear()\n        view2 = AView()\n        self.config.add_view_deriver(deriv2, 'test_deriv')\n        result = self.config._derive_view(view2)\n        self.assertFalse(flags.get('deriv1'))\n        self.assertTrue(flags.get('deriv2'))\n\n    def test_override_mapped_view(self):\n        from pyramid.viewderivers import VIEW\n        response = DummyResponse()\n        view = lambda *arg: response\n        flags = {}\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(flags.get('deriv1'))\n\n        flags.clear()\n        self.config.add_view_deriver(\n            deriv1, name='mapped_view', under='rendered_view', over=VIEW)\n        result = self.config._derive_view(view)\n        self.assertTrue(flags.get('deriv1'))\n\n    def test_add_multi_derivers_ordered(self):\n        from pyramid.viewderivers import INGRESS\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append('deriv1')\n            return view\n\n        def deriv2(view, info):\n            response.deriv.append('deriv2')\n            return view\n\n        def deriv3(view, info):\n            response.deriv.append('deriv3')\n            return view\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2', INGRESS, 'deriv1')\n        self.config.add_view_deriver(deriv3, 'deriv3', 'deriv2', 'deriv1')\n        result = self.config._derive_view(view)\n        self.assertEqual(response.deriv, ['deriv1', 'deriv3', 'deriv2'])\n\n    def test_add_deriver_without_name(self):\n        from pyramid.interfaces import IViewDerivers\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1)\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        self.assertTrue('deriv1' in derivers.names)\n\n    def test_add_deriver_reserves_ingress(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        self.assertRaises(\n            ConfigurationError, self.config.add_view_deriver, deriv1, INGRESS)\n\n    def test_add_deriver_enforces_ingress_is_first(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, over=INGRESS)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be over INGRESS' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import VIEW\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, under=VIEW)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under VIEW' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_mapped_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, 'deriv1', under='mapped_view')\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under \"mapped_view\"' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n\nclass TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))\n\n@implementer(IResponse)\nclass DummyResponse(object):\n    content_type = None\n    default_content_type = None\n    body = None\n\nclass DummyRequest:\n    subpath = ()\n    matchdict = None\n    request_iface  = IRequest\n\n    def __init__(self, environ=None):\n        if environ is None:\n            environ = {}\n        self.environ = environ\n        self.params = {}\n        self.cookies = {}\n        self.headers = {}\n        self.response = DummyResponse()\n\nclass DummyLogger:\n    def __init__(self):\n        self.messages = []\n    def info(self, msg):\n        self.messages.append(msg)\n    warn = info\n    debug = info\n\nclass DummySecurityPolicy:\n    def __init__(self, permitted=True):\n        self.permitted = permitted\n\n    def effective_principals(self, request):\n        return []\n\n    def permits(self, context, principals, permission):\n        return self.permitted\n\nclass DummySession(dict):\n    def get_csrf_token(self):\n        return self['csrf_token']\n\ndef parse_httpdate(s):\n    import datetime\n    # cannot use %Z, must use literal GMT; Jython honors timezone\n    # but CPython does not\n    return datetime.datetime.strptime(s, \"%a, %d %b %Y %H:%M:%S GMT\")\n\ndef assert_similar_datetime(one, two):\n    for attr in ('year', 'month', 'day', 'hour', 'minute'):\n        one_attr = getattr(one, attr)\n        two_attr = getattr(two, attr)\n        if not one_attr == two_attr: # pragma: no cover\n            raise AssertionError('%r != %r in %s' % (one_attr, two_attr, attr))\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_viewderivers.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "4767da580",
                "new_commit_hash": "4a7a04197",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/tests/test_viewderivers.py"
            },
            "plus_file": {
                "path": "b/pyramid/tests/test_viewderivers.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1297,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1297,
                            "length": 64
                        },
                        "section": "class TestDeriveView(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        result = view(None, request)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertTrue(result is response)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_csrf_view_skipped_by_default_on_exception_view(self):",
                                "type": "added"
                            },
                            {
                                "content": "        from pyramid.request import Request",
                                "type": "added"
                            },
                            {
                                "content": "        def view(request):",
                                "type": "added"
                            },
                            {
                                "content": "            raise ValueError",
                                "type": "added"
                            },
                            {
                                "content": "        def excview(request):",
                                "type": "added"
                            },
                            {
                                "content": "            return 'hello'",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.set_session_factory(",
                                "type": "added"
                            },
                            {
                                "content": "            lambda request: DummySession({'csrf_token': 'foo'}))",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(view, name='foo', require_csrf=False)",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(excview, context=ValueError, renderer='string')",
                                "type": "added"
                            },
                            {
                                "content": "        app = self.config.make_wsgi_app()",
                                "type": "added"
                            },
                            {
                                "content": "        request = Request.blank('/foo', base_url='http://example.com')",
                                "type": "added"
                            },
                            {
                                "content": "        request.method = 'POST'",
                                "type": "added"
                            },
                            {
                                "content": "        response = request.get_response(app)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(b'hello' in response.body)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_csrf_view_failed_on_explicit_exception_view(self):",
                                "type": "added"
                            },
                            {
                                "content": "        from pyramid.exceptions import BadCSRFToken",
                                "type": "added"
                            },
                            {
                                "content": "        from pyramid.request import Request",
                                "type": "added"
                            },
                            {
                                "content": "        def view(request):",
                                "type": "added"
                            },
                            {
                                "content": "            raise ValueError",
                                "type": "added"
                            },
                            {
                                "content": "        def excview(request): pass",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.set_session_factory(",
                                "type": "added"
                            },
                            {
                                "content": "            lambda request: DummySession({'csrf_token': 'foo'}))",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(view, name='foo', require_csrf=False)",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(excview, context=ValueError, renderer='string',",
                                "type": "added"
                            },
                            {
                                "content": "                             require_csrf=True)",
                                "type": "added"
                            },
                            {
                                "content": "        app = self.config.make_wsgi_app()",
                                "type": "added"
                            },
                            {
                                "content": "        request = Request.blank('/foo', base_url='http://example.com')",
                                "type": "added"
                            },
                            {
                                "content": "        request.method = 'POST'",
                                "type": "added"
                            },
                            {
                                "content": "        try:",
                                "type": "added"
                            },
                            {
                                "content": "            request.get_response(app)",
                                "type": "added"
                            },
                            {
                                "content": "        except BadCSRFToken:",
                                "type": "added"
                            },
                            {
                                "content": "            pass",
                                "type": "added"
                            },
                            {
                                "content": "        else: # pragma: no cover",
                                "type": "added"
                            },
                            {
                                "content": "            raise AssertionError",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_csrf_view_passed_on_explicit_exception_view(self):",
                                "type": "added"
                            },
                            {
                                "content": "        from pyramid.request import Request",
                                "type": "added"
                            },
                            {
                                "content": "        def view(request):",
                                "type": "added"
                            },
                            {
                                "content": "            raise ValueError",
                                "type": "added"
                            },
                            {
                                "content": "        def excview(request):",
                                "type": "added"
                            },
                            {
                                "content": "            return 'hello'",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.set_session_factory(",
                                "type": "added"
                            },
                            {
                                "content": "            lambda request: DummySession({'csrf_token': 'foo'}))",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(view, name='foo', require_csrf=False)",
                                "type": "added"
                            },
                            {
                                "content": "        self.config.add_view(excview, context=ValueError, renderer='string',",
                                "type": "added"
                            },
                            {
                                "content": "                             require_csrf=True)",
                                "type": "added"
                            },
                            {
                                "content": "        app = self.config.make_wsgi_app()",
                                "type": "added"
                            },
                            {
                                "content": "        request = Request.blank('/foo', base_url='http://example.com')",
                                "type": "added"
                            },
                            {
                                "content": "        request.method = 'POST'",
                                "type": "added"
                            },
                            {
                                "content": "        request.headers['X-CSRF-Token'] = 'foo'",
                                "type": "added"
                            },
                            {
                                "content": "        response = request.get_response(app)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(b'hello' in response.body)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "class TestDerivationOrder(unittest.TestCase):",
                                "type": "context"
                            },
                            {
                                "content": "    def setUp(self):",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "class",
                            "name": "TestDeriveView",
                            "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 11,
                            "end_lineno": 1356,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "method",
                            "name": "TestDeriveView.test_csrf_view_passed_on_explicit_exception_view",
                            "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1339,
                            "end_lineno": 1356,
                            "parent": {
                                "file_name": "pyramid/tests/test_viewderivers.py",
                                "type": "class",
                                "name": "TestDeriveView",
                                "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 11,
                                "end_lineno": 1356,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "method",
                            "name": "TestDeriveView.test_csrf_view_skipped_by_default_on_exception_view",
                            "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1300,
                            "end_lineno": 1315,
                            "parent": {
                                "file_name": "pyramid/tests/test_viewderivers.py",
                                "type": "class",
                                "name": "TestDeriveView",
                                "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 11,
                                "end_lineno": 1356,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "method",
                            "name": "TestDeriveView.test_csrf_view_failed_on_explicit_exception_view",
                            "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1317,
                            "end_lineno": 1337,
                            "parent": {
                                "file_name": "pyramid/tests/test_viewderivers.py",
                                "type": "class",
                                "name": "TestDeriveView",
                                "content": "class TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 11,
                                "end_lineno": 1356,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1554,
                            "length": 7
                        },
                        "new_range": {
                            "start": 1612,
                            "length": 6
                        },
                        "section": "class TestDeriverIntegration(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        from pyramid.interfaces import IRequest",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.interfaces import IView",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.interfaces import IViewClassifier",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.interfaces import IExceptionViewClassifier",
                                "type": "deleted"
                            },
                            {
                                "content": "        classifier = IViewClassifier",
                                "type": "context"
                            },
                            {
                                "content": "        if ctx_iface is None:",
                                "type": "context"
                            },
                            {
                                "content": "            ctx_iface = Interface",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "method",
                            "name": "TestDeriverIntegration._getViewCallable",
                            "content": "class TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IExceptionViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1551,
                            "end_lineno": 1565,
                            "parent": {
                                "file_name": "pyramid/tests/test_viewderivers.py",
                                "type": "class",
                                "name": "TestDeriverIntegration",
                                "content": "class TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IExceptionViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 1543,
                                "end_lineno": 1603,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "class",
                            "name": "TestDeriverIntegration",
                            "content": "class TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IExceptionViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1543,
                            "end_lineno": 1603,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import inspect\n\nfrom zope.interface import (\n    implementer,\n    provider,\n    )\n\nfrom pyramid.security import NO_PERMISSION_REQUIRED\nfrom pyramid.session import (\n    check_csrf_origin,\n    check_csrf_token,\n)\nfrom pyramid.response import Response\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    IDebugLogger,\n    IResponse,\n    IViewMapper,\n    IViewMapperFactory,\n    )\n\nfrom pyramid.compat import (\n    string_types,\n    is_bound_method,\n    is_unbound_method,\n    )\n\nfrom pyramid.config.util import (\n    DEFAULT_PHASH,\n    MAX_ORDER,\n    takes_one_arg,\n    )\n\nfrom pyramid.exceptions import (\n    ConfigurationError,\n    PredicateMismatch,\n    )\nfrom pyramid.httpexceptions import HTTPForbidden\nfrom pyramid.settings import (\n    falsey,\n    truthy,\n)\nfrom pyramid.util import object_description\nfrom pyramid.view import render_view_to_response\nfrom pyramid import renderers\n\n\ndef view_description(view):\n    try:\n        return view.__text__\n    except AttributeError:\n        # custom view mappers might not add __text__\n        return object_description(view)\n\ndef requestonly(view, attr=None):\n    return takes_one_arg(view, attr=attr, argname='request')\n\n@implementer(IViewMapper)\n@provider(IViewMapperFactory)\nclass DefaultViewMapper(object):\n    def __init__(self, **kw):\n        self.attr = kw.get('attr')\n\n    def __call__(self, view):\n        if is_unbound_method(view) and self.attr is None:\n            raise ConfigurationError((\n                'Unbound method calls are not supported, please set the class '\n                'as your `view` and the method as your `attr`'\n            ))\n\n        if inspect.isclass(view):\n            view = self.map_class(view)\n        else:\n            view = self.map_nonclass(view)\n        return view\n\n    def map_class(self, view):\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_class_requestonly(view)\n        else:\n            mapped_view = self.map_class_native(view)\n        mapped_view.__text__ = 'method %s of %s' % (\n            self.attr or '__call__', object_description(view))\n        return mapped_view\n\n    def map_nonclass(self, view):\n        # We do more work here than appears necessary to avoid wrapping the\n        # view unless it actually requires wrapping (to avoid function call\n        # overhead).\n        mapped_view = view\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_nonclass_requestonly(view)\n        elif self.attr:\n            mapped_view = self.map_nonclass_attr(view)\n        if inspect.isroutine(mapped_view):\n            # This branch will be true if the view is a function or a method.\n            # We potentially mutate an unwrapped object here if it's a\n            # function.  We do this to avoid function call overhead of\n            # injecting another wrapper.  However, we must wrap if the\n            # function is a bound method because we can't set attributes on a\n            # bound method.\n            if is_bound_method(view):\n                _mapped_view = mapped_view\n                def mapped_view(context, request):\n                    return _mapped_view(context, request)\n            if self.attr is not None:\n                mapped_view.__text__ = 'attr %s of %s' % (\n                    self.attr, object_description(view))\n            else:\n                mapped_view.__text__ = object_description(view)\n        return mapped_view\n\n    def map_class_requestonly(self, view):\n        # its a class that has an __init__ which only accepts request\n        attr = self.attr\n        def _class_requestonly_view(context, request):\n            inst = view(request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_requestonly_view\n\n    def map_class_native(self, view):\n        # its a class that has an __init__ which accepts both context and\n        # request\n        attr = self.attr\n        def _class_view(context, request):\n            inst = view(context, request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_view\n\n    def map_nonclass_requestonly(self, view):\n        # its a function that has a __call__ which accepts only a single\n        # request argument\n        attr = self.attr\n        def _requestonly_view(context, request):\n            if attr is None:\n                response = view(request)\n            else:\n                response = getattr(view, attr)(request)\n            return response\n        return _requestonly_view\n\n    def map_nonclass_attr(self, view):\n        # its a function that has a __call__ which accepts both context and\n        # request, but still has an attr\n        def _attr_view(context, request):\n            response = getattr(view, self.attr)(context, request)\n            return response\n        return _attr_view\n\n\ndef wraps_view(wrapper):\n    def inner(view, info):\n        wrapper_view = wrapper(view, info)\n        return preserve_view_attrs(view, wrapper_view)\n    return inner\n\ndef preserve_view_attrs(view, wrapper):\n    if view is None:\n        return wrapper\n\n    if wrapper is view:\n        return view\n\n    original_view = getattr(view, '__original_view__', None)\n\n    if original_view is None:\n        original_view = view\n\n    wrapper.__wraps__ = view\n    wrapper.__original_view__ = original_view\n    wrapper.__module__ = view.__module__\n    wrapper.__doc__ = view.__doc__\n\n    try:\n        wrapper.__name__ = view.__name__\n    except AttributeError:\n        wrapper.__name__ = repr(view)\n\n    # attrs that may not exist on \"view\", but, if so, must be attached to\n    # \"wrapped view\"\n    for attr in ('__permitted__', '__call_permissive__', '__permission__',\n                 '__predicated__', '__predicates__', '__accept__',\n                 '__order__', '__text__'):\n        try:\n            setattr(wrapper, attr, getattr(view, attr))\n        except AttributeError:\n            pass\n\n    return wrapper\n\ndef mapped_view(view, info):\n    mapper = info.options.get('mapper')\n    if mapper is None:\n        mapper = getattr(view, '__view_mapper__', None)\n        if mapper is None:\n            mapper = info.registry.queryUtility(IViewMapperFactory)\n            if mapper is None:\n                mapper = DefaultViewMapper\n\n    mapped_view = mapper(**info.options)(view)\n    return mapped_view\n\nmapped_view.options = ('mapper', 'attr')\n\ndef owrapped_view(view, info):\n    wrapper_viewname = info.options.get('wrapper')\n    viewname = info.options.get('name')\n    if not wrapper_viewname:\n        return view\n    def _owrapped_view(context, request):\n        response = view(context, request)\n        request.wrapped_response = response\n        request.wrapped_body = response.body\n        request.wrapped_view = view\n        wrapped_response = render_view_to_response(context, request,\n                                                   wrapper_viewname)\n        if wrapped_response is None:\n            raise ValueError(\n                'No wrapper view named %r found when executing view '\n                'named %r' % (wrapper_viewname, viewname))\n        return wrapped_response\n    return _owrapped_view\n\nowrapped_view.options = ('name', 'wrapper')\n\ndef http_cached_view(view, info):\n    if info.settings.get('prevent_http_cache', False):\n        return view\n\n    seconds = info.options.get('http_cache')\n\n    if seconds is None:\n        return view\n\n    options = {}\n\n    if isinstance(seconds, (tuple, list)):\n        try:\n            seconds, options = seconds\n        except ValueError:\n            raise ConfigurationError(\n                'If http_cache parameter is a tuple or list, it must be '\n                'in the form (seconds, options); not %s' % (seconds,))\n\n    def wrapper(context, request):\n        response = view(context, request)\n        prevent_caching = getattr(response.cache_control, 'prevent_auto',\n                                  False)\n        if not prevent_caching:\n            response.cache_expires(seconds, **options)\n        return response\n\n    return wrapper\n\nhttp_cached_view.options = ('http_cache',)\n\ndef secured_view(view, info):\n    for wrapper in (_secured_view, _authdebug_view):\n        view = wraps_view(wrapper)(view, info)\n    return view\n\nsecured_view.options = ('permission',)\n\ndef _secured_view(view, info):\n    permission = info.options.get('permission')\n    if permission == NO_PERMISSION_REQUIRED:\n        # allow views registered within configurations that have a\n        # default permission to explicitly override the default\n        # permission, replacing it with no permission at all\n        permission = None\n\n    wrapped_view = view\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n\n    if authn_policy and authz_policy and (permission is not None):\n        def _permitted(context, request):\n            principals = authn_policy.effective_principals(request)\n            return authz_policy.permits(context, principals, permission)\n        def _secured_view(context, request):\n            result = _permitted(context, request)\n            if result:\n                return view(context, request)\n            view_name = getattr(view, '__name__', view)\n            msg = getattr(\n                request, 'authdebug_message',\n                'Unauthorized: %s failed permission check' % view_name)\n            raise HTTPForbidden(msg, result=result)\n        _secured_view.__call_permissive__ = view\n        _secured_view.__permitted__ = _permitted\n        _secured_view.__permission__ = permission\n        wrapped_view = _secured_view\n\n    return wrapped_view\n\ndef _authdebug_view(view, info):\n    wrapped_view = view\n    settings = info.settings\n    permission = info.options.get('permission')\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n    logger = info.registry.queryUtility(IDebugLogger)\n    if settings and settings.get('debug_authorization', False):\n        def _authdebug_view(context, request):\n            view_name = getattr(request, 'view_name', None)\n\n            if authn_policy and authz_policy:\n                if permission is NO_PERMISSION_REQUIRED:\n                    msg = 'Allowed (NO_PERMISSION_REQUIRED)'\n                elif permission is None:\n                    msg = 'Allowed (no permission registered)'\n                else:\n                    principals = authn_policy.effective_principals(request)\n                    msg = str(authz_policy.permits(\n                        context, principals, permission))\n            else:\n                msg = 'Allowed (no authorization policy in use)'\n\n            view_name = getattr(request, 'view_name', None)\n            url = getattr(request, 'url', None)\n            msg = ('debug_authorization of url %s (view name %r against '\n                   'context %r): %s' % (url, view_name, context, msg))\n            if logger:\n                logger.debug(msg)\n            if request is not None:\n                request.authdebug_message = msg\n            return view(context, request)\n\n        wrapped_view = _authdebug_view\n\n    return wrapped_view\n\ndef predicated_view(view, info):\n    preds = info.predicates\n    if not preds:\n        return view\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n                raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)' % (\n                        view_name, predicate.text()))\n        return view(context, request)\n    def checker(context, request):\n        return all((predicate(context, request) for predicate in\n                    preds))\n    predicate_wrapper.__predicated__ = checker\n    predicate_wrapper.__predicates__ = preds\n    return predicate_wrapper\n\ndef attr_wrapped_view(view, info):\n    accept, order, phash = (info.options.get('accept', None),\n                            getattr(info, 'order', MAX_ORDER),\n                            getattr(info, 'phash', DEFAULT_PHASH))\n    # this is a little silly but we don't want to decorate the original\n    # function with attributes that indicate accept, order, and phash,\n    # so we use a wrapper\n    if (\n        (accept is None) and\n        (order == MAX_ORDER) and\n        (phash == DEFAULT_PHASH)\n    ):\n        return view # defaults\n    def attr_view(context, request):\n        return view(context, request)\n    attr_view.__accept__ = accept\n    attr_view.__order__ = order\n    attr_view.__phash__ = phash\n    attr_view.__view_attr__ = info.options.get('attr')\n    attr_view.__permission__ = info.options.get('permission')\n    return attr_view\n\nattr_wrapped_view.options = ('accept', 'attr', 'permission')\n\ndef rendered_view(view, info):\n    # one way or another this wrapper must produce a Response (unless\n    # the renderer is a NullRendererHelper)\n    renderer = info.options.get('renderer')\n    if renderer is None:\n        # register a default renderer if you want super-dynamic\n        # rendering.  registering a default renderer will also allow\n        # override_renderer to work if a renderer is left unspecified for\n        # a view registration.\n        def viewresult_to_response(context, request):\n            result = view(context, request)\n            if result.__class__ is Response: # common case\n                response = result\n            else:\n                response = info.registry.queryAdapterOrSelf(result, IResponse)\n                if response is None:\n                    if result is None:\n                        append = (' You may have forgotten to return a value '\n                                  'from the view callable.')\n                    elif isinstance(result, dict):\n                        append = (' You may have forgotten to define a '\n                                  'renderer in the view configuration.')\n                    else:\n                        append = ''\n\n                    msg = ('Could not convert return value of the view '\n                           'callable %s into a response object. '\n                           'The value returned was %r.' + append)\n\n                    raise ValueError(msg % (view_description(view), result))\n\n            return response\n\n        return viewresult_to_response\n\n    if renderer is renderers.null_renderer:\n        return view\n\n    def rendered_view(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # potential common case\n            response = result\n        else:\n            # this must adapt, it can't do a simple interface check\n            # (avoid trying to render webob responses)\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                attrs = getattr(request, '__dict__', {})\n                if 'override_renderer' in attrs:\n                    # renderer overridden by newrequest event or other\n                    renderer_name = attrs.pop('override_renderer')\n                    view_renderer = renderers.RendererHelper(\n                        name=renderer_name,\n                        package=info.package,\n                        registry=info.registry)\n                else:\n                    view_renderer = renderer.clone()\n                if '__view__' in attrs:\n                    view_inst = attrs.pop('__view__')\n                else:\n                    view_inst = getattr(view, '__original_view__', view)\n                response = view_renderer.render_view(\n                    request, result, view_inst, context)\n        return response\n\n    return rendered_view\n\nrendered_view.options = ('renderer',)\n\ndef decorated_view(view, info):\n    decorator = info.options.get('decorator')\n    if decorator is None:\n        return view\n    return decorator(view)\n\ndecorated_view.options = ('decorator',)\n\ndef _parse_csrf_setting(val, error_source):\n    if val:\n        if isinstance(val, string_types):\n            if val.lower() in truthy:\n                val = True\n            elif val.lower() in falsey:\n                val = False\n        elif not isinstance(val, bool):\n            raise ConfigurationError(\n                '{0} must be a string or boolean value'\n                .format(error_source))\n    return val\n\nSAFE_REQUEST_METHODS = frozenset([\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"])\n\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_default_csrf\"')\n    val = _parse_csrf_setting(\n        info.options.get('require_csrf'),\n        'View option \"require_csrf\"')\n    if (val is True and default_val) or val is None:\n        val = default_val\n    if val is True:\n        val = 'csrf_token'\n    wrapped_view = view\n    if val:\n        def csrf_view(context, request):\n            # Assume that anything not defined as 'safe' by RFC2616 needs\n            # protection\n            if request.method not in SAFE_REQUEST_METHODS:\n                check_csrf_origin(request, raises=True)\n                check_csrf_token(request, val, raises=True)\n            return view(context, request)\n        wrapped_view = csrf_view\n    return wrapped_view\n\ncsrf_view.options = ('require_csrf',)\n\nVIEW = 'VIEW'\nINGRESS = 'INGRESS'\n",
            "new_file_content": "import inspect\n\nfrom zope.interface import (\n    implementer,\n    provider,\n    )\n\nfrom pyramid.security import NO_PERMISSION_REQUIRED\nfrom pyramid.session import (\n    check_csrf_origin,\n    check_csrf_token,\n)\nfrom pyramid.response import Response\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    IDebugLogger,\n    IResponse,\n    IViewMapper,\n    IViewMapperFactory,\n    )\n\nfrom pyramid.compat import (\n    string_types,\n    is_bound_method,\n    is_unbound_method,\n    )\n\nfrom pyramid.config.util import (\n    DEFAULT_PHASH,\n    MAX_ORDER,\n    takes_one_arg,\n    )\n\nfrom pyramid.exceptions import (\n    ConfigurationError,\n    PredicateMismatch,\n    )\nfrom pyramid.httpexceptions import HTTPForbidden\nfrom pyramid.settings import (\n    falsey,\n    truthy,\n)\nfrom pyramid.util import object_description\nfrom pyramid.view import render_view_to_response\nfrom pyramid import renderers\n\n\ndef view_description(view):\n    try:\n        return view.__text__\n    except AttributeError:\n        # custom view mappers might not add __text__\n        return object_description(view)\n\ndef requestonly(view, attr=None):\n    return takes_one_arg(view, attr=attr, argname='request')\n\n@implementer(IViewMapper)\n@provider(IViewMapperFactory)\nclass DefaultViewMapper(object):\n    def __init__(self, **kw):\n        self.attr = kw.get('attr')\n\n    def __call__(self, view):\n        if is_unbound_method(view) and self.attr is None:\n            raise ConfigurationError((\n                'Unbound method calls are not supported, please set the class '\n                'as your `view` and the method as your `attr`'\n            ))\n\n        if inspect.isclass(view):\n            view = self.map_class(view)\n        else:\n            view = self.map_nonclass(view)\n        return view\n\n    def map_class(self, view):\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_class_requestonly(view)\n        else:\n            mapped_view = self.map_class_native(view)\n        mapped_view.__text__ = 'method %s of %s' % (\n            self.attr or '__call__', object_description(view))\n        return mapped_view\n\n    def map_nonclass(self, view):\n        # We do more work here than appears necessary to avoid wrapping the\n        # view unless it actually requires wrapping (to avoid function call\n        # overhead).\n        mapped_view = view\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_nonclass_requestonly(view)\n        elif self.attr:\n            mapped_view = self.map_nonclass_attr(view)\n        if inspect.isroutine(mapped_view):\n            # This branch will be true if the view is a function or a method.\n            # We potentially mutate an unwrapped object here if it's a\n            # function.  We do this to avoid function call overhead of\n            # injecting another wrapper.  However, we must wrap if the\n            # function is a bound method because we can't set attributes on a\n            # bound method.\n            if is_bound_method(view):\n                _mapped_view = mapped_view\n                def mapped_view(context, request):\n                    return _mapped_view(context, request)\n            if self.attr is not None:\n                mapped_view.__text__ = 'attr %s of %s' % (\n                    self.attr, object_description(view))\n            else:\n                mapped_view.__text__ = object_description(view)\n        return mapped_view\n\n    def map_class_requestonly(self, view):\n        # its a class that has an __init__ which only accepts request\n        attr = self.attr\n        def _class_requestonly_view(context, request):\n            inst = view(request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_requestonly_view\n\n    def map_class_native(self, view):\n        # its a class that has an __init__ which accepts both context and\n        # request\n        attr = self.attr\n        def _class_view(context, request):\n            inst = view(context, request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_view\n\n    def map_nonclass_requestonly(self, view):\n        # its a function that has a __call__ which accepts only a single\n        # request argument\n        attr = self.attr\n        def _requestonly_view(context, request):\n            if attr is None:\n                response = view(request)\n            else:\n                response = getattr(view, attr)(request)\n            return response\n        return _requestonly_view\n\n    def map_nonclass_attr(self, view):\n        # its a function that has a __call__ which accepts both context and\n        # request, but still has an attr\n        def _attr_view(context, request):\n            response = getattr(view, self.attr)(context, request)\n            return response\n        return _attr_view\n\n\ndef wraps_view(wrapper):\n    def inner(view, info):\n        wrapper_view = wrapper(view, info)\n        return preserve_view_attrs(view, wrapper_view)\n    return inner\n\ndef preserve_view_attrs(view, wrapper):\n    if view is None:\n        return wrapper\n\n    if wrapper is view:\n        return view\n\n    original_view = getattr(view, '__original_view__', None)\n\n    if original_view is None:\n        original_view = view\n\n    wrapper.__wraps__ = view\n    wrapper.__original_view__ = original_view\n    wrapper.__module__ = view.__module__\n    wrapper.__doc__ = view.__doc__\n\n    try:\n        wrapper.__name__ = view.__name__\n    except AttributeError:\n        wrapper.__name__ = repr(view)\n\n    # attrs that may not exist on \"view\", but, if so, must be attached to\n    # \"wrapped view\"\n    for attr in ('__permitted__', '__call_permissive__', '__permission__',\n                 '__predicated__', '__predicates__', '__accept__',\n                 '__order__', '__text__'):\n        try:\n            setattr(wrapper, attr, getattr(view, attr))\n        except AttributeError:\n            pass\n\n    return wrapper\n\ndef mapped_view(view, info):\n    mapper = info.options.get('mapper')\n    if mapper is None:\n        mapper = getattr(view, '__view_mapper__', None)\n        if mapper is None:\n            mapper = info.registry.queryUtility(IViewMapperFactory)\n            if mapper is None:\n                mapper = DefaultViewMapper\n\n    mapped_view = mapper(**info.options)(view)\n    return mapped_view\n\nmapped_view.options = ('mapper', 'attr')\n\ndef owrapped_view(view, info):\n    wrapper_viewname = info.options.get('wrapper')\n    viewname = info.options.get('name')\n    if not wrapper_viewname:\n        return view\n    def _owrapped_view(context, request):\n        response = view(context, request)\n        request.wrapped_response = response\n        request.wrapped_body = response.body\n        request.wrapped_view = view\n        wrapped_response = render_view_to_response(context, request,\n                                                   wrapper_viewname)\n        if wrapped_response is None:\n            raise ValueError(\n                'No wrapper view named %r found when executing view '\n                'named %r' % (wrapper_viewname, viewname))\n        return wrapped_response\n    return _owrapped_view\n\nowrapped_view.options = ('name', 'wrapper')\n\ndef http_cached_view(view, info):\n    if info.settings.get('prevent_http_cache', False):\n        return view\n\n    seconds = info.options.get('http_cache')\n\n    if seconds is None:\n        return view\n\n    options = {}\n\n    if isinstance(seconds, (tuple, list)):\n        try:\n            seconds, options = seconds\n        except ValueError:\n            raise ConfigurationError(\n                'If http_cache parameter is a tuple or list, it must be '\n                'in the form (seconds, options); not %s' % (seconds,))\n\n    def wrapper(context, request):\n        response = view(context, request)\n        prevent_caching = getattr(response.cache_control, 'prevent_auto',\n                                  False)\n        if not prevent_caching:\n            response.cache_expires(seconds, **options)\n        return response\n\n    return wrapper\n\nhttp_cached_view.options = ('http_cache',)\n\ndef secured_view(view, info):\n    for wrapper in (_secured_view, _authdebug_view):\n        view = wraps_view(wrapper)(view, info)\n    return view\n\nsecured_view.options = ('permission',)\n\ndef _secured_view(view, info):\n    permission = info.options.get('permission')\n    if permission == NO_PERMISSION_REQUIRED:\n        # allow views registered within configurations that have a\n        # default permission to explicitly override the default\n        # permission, replacing it with no permission at all\n        permission = None\n\n    wrapped_view = view\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n\n    if authn_policy and authz_policy and (permission is not None):\n        def _permitted(context, request):\n            principals = authn_policy.effective_principals(request)\n            return authz_policy.permits(context, principals, permission)\n        def _secured_view(context, request):\n            result = _permitted(context, request)\n            if result:\n                return view(context, request)\n            view_name = getattr(view, '__name__', view)\n            msg = getattr(\n                request, 'authdebug_message',\n                'Unauthorized: %s failed permission check' % view_name)\n            raise HTTPForbidden(msg, result=result)\n        _secured_view.__call_permissive__ = view\n        _secured_view.__permitted__ = _permitted\n        _secured_view.__permission__ = permission\n        wrapped_view = _secured_view\n\n    return wrapped_view\n\ndef _authdebug_view(view, info):\n    wrapped_view = view\n    settings = info.settings\n    permission = info.options.get('permission')\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n    logger = info.registry.queryUtility(IDebugLogger)\n    if settings and settings.get('debug_authorization', False):\n        def _authdebug_view(context, request):\n            view_name = getattr(request, 'view_name', None)\n\n            if authn_policy and authz_policy:\n                if permission is NO_PERMISSION_REQUIRED:\n                    msg = 'Allowed (NO_PERMISSION_REQUIRED)'\n                elif permission is None:\n                    msg = 'Allowed (no permission registered)'\n                else:\n                    principals = authn_policy.effective_principals(request)\n                    msg = str(authz_policy.permits(\n                        context, principals, permission))\n            else:\n                msg = 'Allowed (no authorization policy in use)'\n\n            view_name = getattr(request, 'view_name', None)\n            url = getattr(request, 'url', None)\n            msg = ('debug_authorization of url %s (view name %r against '\n                   'context %r): %s' % (url, view_name, context, msg))\n            if logger:\n                logger.debug(msg)\n            if request is not None:\n                request.authdebug_message = msg\n            return view(context, request)\n\n        wrapped_view = _authdebug_view\n\n    return wrapped_view\n\ndef predicated_view(view, info):\n    preds = info.predicates\n    if not preds:\n        return view\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n                raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)' % (\n                        view_name, predicate.text()))\n        return view(context, request)\n    def checker(context, request):\n        return all((predicate(context, request) for predicate in\n                    preds))\n    predicate_wrapper.__predicated__ = checker\n    predicate_wrapper.__predicates__ = preds\n    return predicate_wrapper\n\ndef attr_wrapped_view(view, info):\n    accept, order, phash = (info.options.get('accept', None),\n                            getattr(info, 'order', MAX_ORDER),\n                            getattr(info, 'phash', DEFAULT_PHASH))\n    # this is a little silly but we don't want to decorate the original\n    # function with attributes that indicate accept, order, and phash,\n    # so we use a wrapper\n    if (\n        (accept is None) and\n        (order == MAX_ORDER) and\n        (phash == DEFAULT_PHASH)\n    ):\n        return view # defaults\n    def attr_view(context, request):\n        return view(context, request)\n    attr_view.__accept__ = accept\n    attr_view.__order__ = order\n    attr_view.__phash__ = phash\n    attr_view.__view_attr__ = info.options.get('attr')\n    attr_view.__permission__ = info.options.get('permission')\n    return attr_view\n\nattr_wrapped_view.options = ('accept', 'attr', 'permission')\n\ndef rendered_view(view, info):\n    # one way or another this wrapper must produce a Response (unless\n    # the renderer is a NullRendererHelper)\n    renderer = info.options.get('renderer')\n    if renderer is None:\n        # register a default renderer if you want super-dynamic\n        # rendering.  registering a default renderer will also allow\n        # override_renderer to work if a renderer is left unspecified for\n        # a view registration.\n        def viewresult_to_response(context, request):\n            result = view(context, request)\n            if result.__class__ is Response: # common case\n                response = result\n            else:\n                response = info.registry.queryAdapterOrSelf(result, IResponse)\n                if response is None:\n                    if result is None:\n                        append = (' You may have forgotten to return a value '\n                                  'from the view callable.')\n                    elif isinstance(result, dict):\n                        append = (' You may have forgotten to define a '\n                                  'renderer in the view configuration.')\n                    else:\n                        append = ''\n\n                    msg = ('Could not convert return value of the view '\n                           'callable %s into a response object. '\n                           'The value returned was %r.' + append)\n\n                    raise ValueError(msg % (view_description(view), result))\n\n            return response\n\n        return viewresult_to_response\n\n    if renderer is renderers.null_renderer:\n        return view\n\n    def rendered_view(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # potential common case\n            response = result\n        else:\n            # this must adapt, it can't do a simple interface check\n            # (avoid trying to render webob responses)\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                attrs = getattr(request, '__dict__', {})\n                if 'override_renderer' in attrs:\n                    # renderer overridden by newrequest event or other\n                    renderer_name = attrs.pop('override_renderer')\n                    view_renderer = renderers.RendererHelper(\n                        name=renderer_name,\n                        package=info.package,\n                        registry=info.registry)\n                else:\n                    view_renderer = renderer.clone()\n                if '__view__' in attrs:\n                    view_inst = attrs.pop('__view__')\n                else:\n                    view_inst = getattr(view, '__original_view__', view)\n                response = view_renderer.render_view(\n                    request, result, view_inst, context)\n        return response\n\n    return rendered_view\n\nrendered_view.options = ('renderer',)\n\ndef decorated_view(view, info):\n    decorator = info.options.get('decorator')\n    if decorator is None:\n        return view\n    return decorator(view)\n\ndecorated_view.options = ('decorator',)\n\ndef _parse_csrf_setting(val, error_source):\n    if val:\n        if isinstance(val, string_types):\n            if val.lower() in truthy:\n                val = True\n            elif val.lower() in falsey:\n                val = False\n        elif not isinstance(val, bool):\n            raise ConfigurationError(\n                '{0} must be a string or boolean value'\n                .format(error_source))\n    return val\n\nSAFE_REQUEST_METHODS = frozenset([\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"])\n\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_default_csrf\"')\n    explicit_val = _parse_csrf_setting(\n        info.options.get('require_csrf'),\n        'View option \"require_csrf\"')\n    resolved_val = explicit_val\n    if (explicit_val is True and default_val) or explicit_val is None:\n        resolved_val = default_val\n    if resolved_val is True:\n        resolved_val = 'csrf_token'\n    wrapped_view = view\n    if resolved_val:\n        def csrf_view(context, request):\n            # Assume that anything not defined as 'safe' by RFC2616 needs\n            # protection\n            if (\n                request.method not in SAFE_REQUEST_METHODS and\n                (\n                    # skip exception views unless value is explicitly defined\n                    getattr(request, 'exception', None) is None or\n                    explicit_val is not None\n                )\n            ):\n                check_csrf_origin(request, raises=True)\n                check_csrf_token(request, resolved_val, raises=True)\n            return view(context, request)\n        wrapped_view = csrf_view\n    return wrapped_view\n\ncsrf_view.options = ('require_csrf',)\n\nVIEW = 'VIEW'\nINGRESS = 'INGRESS'\n",
            "header": {
                "file": {
                    "path": "pyramid/viewderivers.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "d9d9c2904",
                "new_commit_hash": "fbe7cd660",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/viewderivers.py"
            },
            "plus_file": {
                "path": "b/pyramid/viewderivers.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 483,
                            "length": 21
                        },
                        "new_range": {
                            "start": 483,
                            "length": 29
                        },
                        "section": "def csrf_view(view, info):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "    default_val = _parse_csrf_setting(",
                                "type": "context"
                            },
                            {
                                "content": "        info.settings.get('pyramid.require_default_csrf'),",
                                "type": "context"
                            },
                            {
                                "content": "        'Config setting \"pyramid.require_default_csrf\"')",
                                "type": "context"
                            },
                            {
                                "content": "    val = _parse_csrf_setting(",
                                "type": "deleted"
                            },
                            {
                                "content": "    explicit_val = _parse_csrf_setting(",
                                "type": "added"
                            },
                            {
                                "content": "        info.options.get('require_csrf'),",
                                "type": "context"
                            },
                            {
                                "content": "        'View option \"require_csrf\"')",
                                "type": "context"
                            },
                            {
                                "content": "    if (val is True and default_val) or val is None:",
                                "type": "deleted"
                            },
                            {
                                "content": "        val = default_val",
                                "type": "deleted"
                            },
                            {
                                "content": "    if val is True:",
                                "type": "deleted"
                            },
                            {
                                "content": "        val = 'csrf_token'",
                                "type": "deleted"
                            },
                            {
                                "content": "    resolved_val = explicit_val",
                                "type": "added"
                            },
                            {
                                "content": "    if (explicit_val is True and default_val) or explicit_val is None:",
                                "type": "added"
                            },
                            {
                                "content": "        resolved_val = default_val",
                                "type": "added"
                            },
                            {
                                "content": "    if resolved_val is True:",
                                "type": "added"
                            },
                            {
                                "content": "        resolved_val = 'csrf_token'",
                                "type": "added"
                            },
                            {
                                "content": "    wrapped_view = view",
                                "type": "context"
                            },
                            {
                                "content": "    if val:",
                                "type": "deleted"
                            },
                            {
                                "content": "    if resolved_val:",
                                "type": "added"
                            },
                            {
                                "content": "        def csrf_view(context, request):",
                                "type": "context"
                            },
                            {
                                "content": "            # Assume that anything not defined as 'safe' by RFC2616 needs",
                                "type": "context"
                            },
                            {
                                "content": "            # protection",
                                "type": "context"
                            },
                            {
                                "content": "            if request.method not in SAFE_REQUEST_METHODS:",
                                "type": "deleted"
                            },
                            {
                                "content": "            if (",
                                "type": "added"
                            },
                            {
                                "content": "                request.method not in SAFE_REQUEST_METHODS and",
                                "type": "added"
                            },
                            {
                                "content": "                (",
                                "type": "added"
                            },
                            {
                                "content": "                    # skip exception views unless value is explicitly defined",
                                "type": "added"
                            },
                            {
                                "content": "                    getattr(request, 'exception', None) is None or",
                                "type": "added"
                            },
                            {
                                "content": "                    explicit_val is not None",
                                "type": "added"
                            },
                            {
                                "content": "                )",
                                "type": "added"
                            },
                            {
                                "content": "            ):",
                                "type": "added"
                            },
                            {
                                "content": "                check_csrf_origin(request, raises=True)",
                                "type": "context"
                            },
                            {
                                "content": "                check_csrf_token(request, val, raises=True)",
                                "type": "deleted"
                            },
                            {
                                "content": "                check_csrf_token(request, resolved_val, raises=True)",
                                "type": "added"
                            },
                            {
                                "content": "            return view(context, request)",
                                "type": "context"
                            },
                            {
                                "content": "        wrapped_view = csrf_view",
                                "type": "context"
                            },
                            {
                                "content": "    return wrapped_view",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/viewderivers.py",
                            "type": "function",
                            "name": "csrf_view",
                            "content": "def csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_default_csrf\"')\n    val = _parse_csrf_setting(\n        info.options.get('require_csrf'),\n        'View option \"require_csrf\"')\n    if (val is True and default_val) or val is None:\n        val = default_val\n    if val is True:\n        val = 'csrf_token'\n    wrapped_view = view\n    if val:\n        def csrf_view(context, request):\n            # Assume that anything not defined as 'safe' by RFC2616 needs\n            # protection\n            if request.method not in SAFE_REQUEST_METHODS:\n                check_csrf_origin(request, raises=True)\n                check_csrf_token(request, val, raises=True)\n            return view(context, request)\n        wrapped_view = csrf_view\n    return wrapped_view",
                            "ast_type_str": "FunctionDef",
                            "start_lineno": 482,
                            "end_lineno": 503,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "6c16fb020027fac47e4d2e335cd9e264dba8aa3b^",
    "new_commit_hash": "6c16fb020027fac47e4d2e335cd9e264dba8aa3b",
    "commit_message": "Merge pull request #2517 from mmerickel/fix/disable-csrf-on-exception-views-by-default\n\ndisable csrf checking on all exception views unless explicitly turned on",
    "commit_date": "2016-04-18T09:56:23-05:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "6c16fb020027fac47e4d2e335cd9e264dba8aa3b",
    "test_file_codes": [
        "import unittest\nfrom zope.interface import implementer\n\nfrom pyramid import testing\nfrom pyramid.exceptions import ConfigurationError\nfrom pyramid.interfaces import (\n    IResponse,\n    IRequest,\n    )\n\nclass TestDeriveView(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _makeRequest(self):\n        request = DummyRequest()\n        request.registry = self.config.registry\n        return request\n\n    def _registerLogger(self):\n        from pyramid.interfaces import IDebugLogger\n        logger = DummyLogger()\n        self.config.registry.registerUtility(logger, IDebugLogger)\n        return logger\n\n    def _registerSecurityPolicy(self, permissive):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(permissive)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n            self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\n            self.assertTrue(msg.endswith(\n                '> into a response object. The value returned was None. You '\n                'may have forgotten to return a value from the view callable.'))\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_function_returns_true_Response_no_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_function_returns_true_Response_with_renderer(self):\n        from pyramid.response import Response\n        r = Response('Hello')\n        def view(request):\n            return r\n        renderer = object()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        response = result(None, None)\n        self.assertEqual(response, r)\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n            self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_requestonly_function(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_requestonly_function_with_renderer(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_requestonly_function_with_renderer_request_override(self):\n        def moo(info):\n            def inner(value, system):\n                self.assertEqual(value, 'OK')\n                self.assertEqual(system['request'], request)\n                self.assertEqual(system['context'], context)\n                return b'moo'\n            return inner\n        def view(request):\n            return 'OK'\n        self.config.add_renderer('moo', moo)\n        result = self.config.derive_view(view, renderer='string')\n        self.assertFalse(result is view)\n        request = self._makeRequest()\n        request.override_renderer = 'moo'\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request).body, b'moo')\n\n    def test_requestonly_function_with_renderer_request_has_view(self):\n        response = DummyResponse()\n        class moo(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, 'OK')\n                self.assertEqual(view_inst, 'view')\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        def view(request):\n            return 'OK'\n        result = self.config.derive_view(view, renderer=moo())\n        self.assertFalse(result.__wraps__ is view)\n        request = self._makeRequest()\n        request.__view__ = 'view'\n        context = testing.DummyResource()\n        r = result(context, request)\n        self.assertEqual(r, response)\n        self.assertFalse(hasattr(request, '__view__'))\n\n    def test_class_without_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(View)\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_class_with_attr(self):\n        response = DummyResponse()\n        class View(object):\n            def __init__(self, request):\n                pass\n            def another(self):\n                return response\n        result = self.config.derive_view(View, attr='another')\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, View)\n\n    def test_as_function_context_and_request(self):\n        def view(context, request):\n            return 'OK'\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(view(None, None), 'OK')\n\n    def test_as_function_requestonly(self):\n        response = DummyResponse()\n        def view(request):\n            return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_newstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_newstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view(object):\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_context_and_request(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_oldstyle_class_requestonly(self):\n        response = DummyResponse()\n        class view:\n            def __init__(self, context, request):\n                pass\n            def __call__(self):\n                return response\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(request.__view__.__class__, view)\n\n    def test_as_instance_context_and_request(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, context, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertTrue(result.__wraps__ is view)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertTrue('test_viewderivers' in result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        self.assertEqual(result(None, None), response)\n\n    def test_with_debug_authorization_no_authpol(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(debug_authorization=True)\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed \"\n                         \"(no authorization policy in use)\")\n\n    def test_with_debug_authorization_no_permission(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerSecurityPolicy(True)\n        logger = self._registerLogger()\n        result = self.config._derive_view(view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): Allowed (\"\n                         \"no permission registered)\")\n\n    def test_debug_auth_permission_authpol_permitted(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): True\")\n\n    def test_debug_auth_permission_authpol_permitted_no_request(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(True)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        self.assertEqual(result(None, None), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url None (view name \"\n                         \"None against context None): True\")\n\n    def test_debug_auth_permission_authpol_denied(self):\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertEqual(result.__call_permissive__.__wraps__, view)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertRaises(HTTPForbidden, result, None, request)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): False\")\n\n    def test_debug_auth_permission_authpol_denied2(self):\n        view = lambda *arg: 'OK'\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        permitted = result.__permitted__(None, None)\n        self.assertEqual(permitted, False)\n\n    def test_debug_auth_permission_authpol_overridden(self):\n        from pyramid.security import NO_PERMISSION_REQUIRED\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = dict(\n            debug_authorization=True, reload_templates=True)\n        logger = self._registerLogger()\n        self._registerSecurityPolicy(False)\n        result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n        self.assertEqual(len(logger.messages), 1)\n        self.assertEqual(logger.messages[0],\n                         \"debug_authorization of url url (view name \"\n                         \"'view_name' against context None): \"\n                         \"Allowed (NO_PERMISSION_REQUIRED)\")\n\n    def test_secured_view_authn_policy_no_authz_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthenticationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_authz_policy_no_authn_policy(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        from pyramid.interfaces import IAuthorizationPolicy\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n        self.assertEqual(view.__name__, result.__name__)\n        self.assertFalse(hasattr(result, '__call_permissive__'))\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        self.assertEqual(result(None, request), response)\n\n    def test_secured_view_raises_forbidden_no_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        response = DummyResponse()\n        view = lambda *arg: response\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(view, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: <lambda> failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_secured_view_raises_forbidden_with_name(self):\n        from pyramid.interfaces import IAuthenticationPolicy\n        from pyramid.interfaces import IAuthorizationPolicy\n        from pyramid.httpexceptions import HTTPForbidden\n        def myview(request): pass\n        self.config.registry.settings = {}\n        policy = DummySecurityPolicy(False)\n        self.config.registry.registerUtility(policy, IAuthenticationPolicy)\n        self.config.registry.registerUtility(policy, IAuthorizationPolicy)\n        result = self.config._derive_view(myview, permission='view')\n        request = self._makeRequest()\n        request.view_name = 'view_name'\n        request.url = 'url'\n        try:\n            result(None, request)\n        except HTTPForbidden as e:\n            self.assertEqual(e.message,\n                             'Unauthorized: myview failed permission check')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_no_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        response = DummyResponse()\n        view = lambda *arg: response\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view <lambda> (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_view_has_name(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return False\n        predicate1.text = lambda *arg: 'text'\n        result = self.config._derive_view(myview, predicates=[predicate1])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (text)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_predicate_mismatch_exception_has_text_in_detail(self):\n        from pyramid.exceptions import PredicateMismatch\n        def myview(request): pass\n        def predicate1(context, request):\n            return True\n        predicate1.text = lambda *arg: 'pred1'\n        def predicate2(context, request):\n            return False\n        predicate2.text = lambda *arg: 'pred2'\n        result = self.config._derive_view(myview, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        try:\n            result(None, None)\n        except PredicateMismatch as e:\n            self.assertEqual(e.detail,\n                             'predicate mismatch for view myview (pred2)')\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_with_predicates_all(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result(None, None)\n        self.assertEqual(next, response)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_checker(self):\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        def predicate2(context, request):\n            predicates.append(True)\n            return True\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        next = result.__predicated__(None, None)\n        self.assertEqual(next, True)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_predicates_notall(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        view = lambda *arg: 'OK'\n        predicates = []\n        def predicate1(context, request):\n            predicates.append(True)\n            return True\n        predicate1.text = lambda *arg: 'text'\n        def predicate2(context, request):\n            predicates.append(True)\n            return False\n        predicate2.text = lambda *arg: 'text'\n        result = self.config._derive_view(view, \n            predicates=[predicate1, predicate2])\n        request = self._makeRequest()\n        request.method = 'POST'\n        self.assertRaises(HTTPNotFound, result, None, None)\n        self.assertEqual(predicates, [True, True])\n\n    def test_with_wrapper_viewname(self):\n        from pyramid.response import Response\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        def outer_view(context, request):\n            self.assertEqual(request.wrapped_response, inner_response)\n            self.assertEqual(request.wrapped_body, inner_response.body)\n            self.assertEqual(request.wrapped_view.__original_view__,\n                             inner_view)\n            return Response(b'outer ' + request.wrapped_body)\n        self.config.registry.registerAdapter(\n            outer_view, (IViewClassifier, None, None), IView, 'owrap')\n        result = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        response = result(None, request)\n        self.assertEqual(response.body, b'outer OK')\n\n    def test_with_wrapper_viewname_notfound(self):\n        from pyramid.response import Response\n        inner_response = Response('OK')\n        def inner_view(context, request):\n            return inner_response\n        wrapped = self.config._derive_view(inner_view, viewname='inner',\n                                wrapper_viewname='owrap')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, wrapped, None, request)\n\n    def test_as_newstyle_class_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config._derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_newstyle_class_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View(object):\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_context_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, context, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_oldstyle_cls_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst.__class__, View)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def __init__(self, request):\n                pass\n            def index(self):\n                return {'a':'1'}\n        result = self.config.derive_view(View, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is View)\n        self.assertEqual(result.__module__, View.__module__)\n        self.assertEqual(result.__doc__, View.__doc__)\n        self.assertEqual(result.__name__, View.__name__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_context_and_request_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, context, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_as_instance_requestonly_attr_and_renderer(self):\n        response = DummyResponse()\n        class renderer(object):\n            def render_view(inself, req, resp, view_inst, ctx):\n                self.assertEqual(req, request)\n                self.assertEqual(resp, {'a':'1'})\n                self.assertEqual(view_inst, view)\n                self.assertEqual(ctx, context)\n                return response\n            def clone(self):\n                return self\n        class View:\n            def index(self, request):\n                return {'a':'1'}\n        view = View()\n        result = self.config.derive_view(view, \n            renderer=renderer(), attr='index')\n        self.assertFalse(result is view)\n        self.assertEqual(result.__module__, view.__module__)\n        self.assertEqual(result.__doc__, view.__doc__)\n        request = self._makeRequest()\n        context = testing.DummyResource()\n        self.assertEqual(result(context, request), response)\n\n    def test_with_view_mapper_config_specified(self):\n        response = DummyResponse()\n        class mapper(object):\n            def __init__(self, **kw):\n                self.kw = kw\n            def __call__(self, view):\n                def wrapped(context, request):\n                    return response\n                return wrapped\n        def view(context, request): return 'NOTOK'\n        result = self.config._derive_view(view, mapper=mapper)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_view_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return response\n                return superinner\n            return inner\n        def view(context, request): return 'NOTOK'\n        view.__view_mapper__ = mapper\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_with_view_mapper_default_mapper_specified(self):\n        from pyramid.response import Response\n        response = Response()\n        def mapper(**kw):\n            def inner(view):\n                def superinner(context, request):\n                    self.assertEqual(request, None)\n                    return  response\n                return superinner\n            return inner\n        self.config.set_view_mapper(mapper)\n        def view(context, request): return 'NOTOK'\n        result = self.config.derive_view(view)\n        self.assertFalse(result.__wraps__ is view)\n        self.assertEqual(result(None, None), response)\n\n    def test_attr_wrapped_view_branching_default_phash(self):\n        from pyramid.config.util import DEFAULT_PHASH\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash=DEFAULT_PHASH)\n        self.assertEqual(result.__wraps__, view)\n\n    def test_attr_wrapped_view_branching_nondefault_phash(self):\n        def view(context, request): pass\n        result = self.config._derive_view(view, phash='nondefault')\n        self.assertNotEqual(result, view)\n\n    def test_http_cached_view_integer(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_timedelta(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, \n            http_cache=datetime.timedelta(hours=1))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600')\n\n    def test_http_cached_view_tuple(self):\n        import datetime\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(3600, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        when = datetime.datetime.utcnow() + datetime.timedelta(hours=1)\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        expires = parse_httpdate(headers['Expires'])\n        assert_similar_datetime(expires, when)\n        self.assertEqual(headers['Cache-Control'], 'max-age=3600, public')\n\n    def test_http_cached_view_tuple_seconds_None(self):\n        from pyramid.response import Response\n        response = Response('OK')\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view,\n            http_cache=(None, {'public':True}))\n        self.assertFalse(result is inner_view)\n        self.assertEqual(inner_view.__module__, result.__module__)\n        self.assertEqual(inner_view.__doc__, result.__doc__)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertEqual(headers['Cache-Control'], 'public')\n\n    def test_http_cached_view_prevent_auto_set(self):\n        from pyramid.response import Response\n        response = Response()\n        response.cache_control.prevent_auto = True\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response) # doesn't blow up\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_prevent_http_cache_in_settings(self):\n        self.config.registry.settings['prevent_http_cache'] = True\n        from pyramid.response import Response\n        response = Response()\n        def inner_view(context, request):\n            return response\n        result = self.config._derive_view(inner_view, http_cache=3600)\n        request = self._makeRequest()\n        result = result(None, request)\n        self.assertEqual(result, response)\n        headers = dict(result.headerlist)\n        self.assertFalse('Expires' in headers)\n        self.assertFalse('Cache-Control' in headers)\n\n    def test_http_cached_view_bad_tuple(self):\n        def view(request): pass\n        self.assertRaises(ConfigurationError, self.config._derive_view, \n            view, http_cache=(None,))\n\n    def test_csrf_view_requires_bool_or_str_in_require_csrf(self):\n        def view(request): pass\n        try:\n            self.config._derive_view(view, require_csrf=object())\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'View option \"require_csrf\" must be a string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_bool_or_str_in_config_setting(self):\n        def view(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': object()})\n        try:\n            self.config._derive_view(view)\n        except ConfigurationError as ex:\n            self.assertEqual(\n                'Config setting \"pyramid.require_default_csrf\" must be a '\n                'string or boolean value',\n                ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_requires_header(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_requires_param(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_https_domain(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"https\"\n        request.domain = \"example.com\"\n        request.host_port = \"443\"\n        request.referrer = \"https://example.com/login/\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_ignores_GET(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'GET'\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_fails_on_bad_POST_param(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_POST_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_PUT_header(self):\n        from pyramid.exceptions import BadCSRFToken\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'PUT'\n        request.POST = {}\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.headers = {'X-CSRF-Token': 'bar'}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFToken, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_referrer(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.referrer = \"https://not-example.com/evil/\"\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_fails_on_bad_origin(self):\n        from pyramid.exceptions import BadCSRFOrigin\n        def inner_view(request): pass\n        request = self._makeRequest()\n        request.method = \"POST\"\n        request.scheme = \"https\"\n        request.host_port = \"443\"\n        request.domain = \"example.com\"\n        request.headers = {\"Origin\": \"https://not-example.com/evil/\"}\n        request.registry.settings = {}\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        self.assertRaises(BadCSRFOrigin, lambda: view(None, request))\n\n    def test_csrf_view_uses_config_setting_truthy(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'csrf_token': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_with_custom_token(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_falsey(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.params['csrf_token'] = 'foo'\n        self.config.add_settings({'pyramid.require_default_csrf': 'no'})\n        view = self.config._derive_view(inner_view)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_view_option_override(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        view = self.config._derive_view(inner_view, require_csrf='DUMMY')\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_uses_config_setting_when_view_option_is_true(self):\n        response = DummyResponse()\n        def inner_view(request):\n            return response\n        request = self._makeRequest()\n        request.scheme = \"http\"\n        request.method = 'POST'\n        request.session = DummySession({'csrf_token': 'foo'})\n        request.POST = {'DUMMY': 'foo'}\n        self.config.add_settings({'pyramid.require_default_csrf': 'DUMMY'})\n        view = self.config._derive_view(inner_view, require_csrf=True)\n        result = view(None, request)\n        self.assertTrue(result is response)\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n    def test_csrf_view_failed_on_explicit_exception_view(self):\n        from pyramid.exceptions import BadCSRFToken\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request): pass\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        try:\n            request.get_response(app)\n        except BadCSRFToken:\n            pass\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_csrf_view_passed_on_explicit_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string',\n                             require_csrf=True)\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n        request.headers['X-CSRF-Token'] = 'foo'\n        response = request.get_response(app)\n        self.assertTrue(b'hello' in response.body)\n\n\nclass TestDerivationOrder(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_right_order_user_sorted(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2', 'decorated_view', 'deriv1')\n        self.config.add_view_deriver(None, 'deriv3', 'deriv2', 'deriv1')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv2',\n            'deriv3',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_implicit(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'deriv1',\n            'rendered_view',\n            'mapped_view',\n            ], dlist)\n\n    def test_right_order_under_rendered_view(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\n    def test_right_order_under_rendered_view_others(self):\n        from pyramid.interfaces import IViewDerivers\n\n        self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view')\n        self.config.add_view_deriver(None, 'deriv2')\n        self.config.add_view_deriver(None, 'deriv3')\n\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        derivers_sorted = derivers.sorted()\n        dlist = [d for (d, _) in derivers_sorted]\n        self.assertEqual([\n            'secured_view',\n            'csrf_view',\n            'owrapped_view',\n            'http_cached_view',\n            'decorated_view',\n            'deriv3',\n            'deriv2',\n            'rendered_view',\n            'deriv1',\n            'mapped_view',\n            ], dlist)\n\n\nclass TestAddDeriver(unittest.TestCase):\n\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def test_add_single_deriver(self):\n        response = DummyResponse()\n        response.deriv = False\n        view = lambda *arg: response\n\n        def deriv(view, info):\n            self.assertFalse(response.deriv)\n            response.deriv = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(response.deriv)\n        self.config.add_view_deriver(deriv, 'test_deriv')\n\n        result = self.config._derive_view(view)\n        self.assertTrue(response.deriv)\n\n    def test_override_deriver(self):\n        flags = {}\n\n        class AView:\n            def __init__(self):\n                self.response = DummyResponse()\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        def deriv2(view, info):\n            flags['deriv2'] = True\n            return view\n\n        view1 = AView()\n        self.config.add_view_deriver(deriv1, 'test_deriv')\n        result = self.config._derive_view(view1)\n        self.assertTrue(flags.get('deriv1'))\n        self.assertFalse(flags.get('deriv2'))\n\n        flags.clear()\n        view2 = AView()\n        self.config.add_view_deriver(deriv2, 'test_deriv')\n        result = self.config._derive_view(view2)\n        self.assertFalse(flags.get('deriv1'))\n        self.assertTrue(flags.get('deriv2'))\n\n    def test_override_mapped_view(self):\n        from pyramid.viewderivers import VIEW\n        response = DummyResponse()\n        view = lambda *arg: response\n        flags = {}\n\n        def deriv1(view, info):\n            flags['deriv1'] = True\n            return view\n\n        result = self.config._derive_view(view)\n        self.assertFalse(flags.get('deriv1'))\n\n        flags.clear()\n        self.config.add_view_deriver(\n            deriv1, name='mapped_view', under='rendered_view', over=VIEW)\n        result = self.config._derive_view(view)\n        self.assertTrue(flags.get('deriv1'))\n\n    def test_add_multi_derivers_ordered(self):\n        from pyramid.viewderivers import INGRESS\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append('deriv1')\n            return view\n\n        def deriv2(view, info):\n            response.deriv.append('deriv2')\n            return view\n\n        def deriv3(view, info):\n            response.deriv.append('deriv3')\n            return view\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2', INGRESS, 'deriv1')\n        self.config.add_view_deriver(deriv3, 'deriv3', 'deriv2', 'deriv1')\n        result = self.config._derive_view(view)\n        self.assertEqual(response.deriv, ['deriv1', 'deriv3', 'deriv2'])\n\n    def test_add_deriver_without_name(self):\n        from pyramid.interfaces import IViewDerivers\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1)\n        derivers = self.config.registry.getUtility(IViewDerivers)\n        self.assertTrue('deriv1' in derivers.names)\n\n    def test_add_deriver_reserves_ingress(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        self.assertRaises(\n            ConfigurationError, self.config.add_view_deriver, deriv1, INGRESS)\n\n    def test_add_deriver_enforces_ingress_is_first(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import INGRESS\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, over=INGRESS)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be over INGRESS' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        from pyramid.viewderivers import VIEW\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, under=VIEW)\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under VIEW' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n    def test_add_deriver_enforces_mapped_view_is_last(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        try:\n            self.config.add_view_deriver(deriv1, 'deriv1', under='mapped_view')\n        except ConfigurationError as ex:\n            self.assertTrue('cannot be under \"mapped_view\"' in ex.args[0])\n        else: # pragma: no cover\n            raise AssertionError\n\n\nclass TestDeriverIntegration(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        self.config = None\n        testing.tearDown()\n\n    def _getViewCallable(self, config, ctx_iface=None, request_iface=None,\n                         name=''):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRequest\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n        classifier = IViewClassifier\n        if ctx_iface is None:\n            ctx_iface = Interface\n        if request_iface is None:\n            request_iface = IRequest\n        return config.registry.adapters.lookup(\n            (classifier, request_iface, ctx_iface), IView, name=name,\n            default=None)\n\n    def _makeRequest(self, config):\n        request = DummyRequest()\n        request.registry = config.registry\n        return request\n\n    def test_view_options(self):\n        response = DummyResponse()\n        view = lambda *arg: response\n        response.deriv = []\n\n        def deriv1(view, info):\n            response.deriv.append(info.options['deriv1'])\n            return view\n        deriv1.options = ('deriv1',)\n\n        def deriv2(view, info):\n            response.deriv.append(info.options['deriv2'])\n            return view\n        deriv2.options = ('deriv2',)\n\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.config.add_view_deriver(deriv2, 'deriv2')\n        self.config.add_view(view, deriv1='test1', deriv2='test2')\n\n        wrapper = self._getViewCallable(self.config)\n        request = self._makeRequest(self.config)\n        request.method = 'GET'\n        self.assertEqual(wrapper(None, request), response)\n        self.assertEqual(['test1', 'test2'], response.deriv)\n\n    def test_unexpected_view_options(self):\n        from pyramid.exceptions import ConfigurationError\n        def deriv1(view, info): pass\n        self.config.add_view_deriver(deriv1, 'deriv1')\n        self.assertRaises(\n            ConfigurationError,\n            lambda: self.config.add_view(lambda r: {}, deriv1='test1'))\n\n@implementer(IResponse)\nclass DummyResponse(object):\n    content_type = None\n    default_content_type = None\n    body = None\n\nclass DummyRequest:\n    subpath = ()\n    matchdict = None\n    request_iface  = IRequest\n\n    def __init__(self, environ=None):\n        if environ is None:\n            environ = {}\n        self.environ = environ\n        self.params = {}\n        self.cookies = {}\n        self.headers = {}\n        self.response = DummyResponse()\n\nclass DummyLogger:\n    def __init__(self):\n        self.messages = []\n    def info(self, msg):\n        self.messages.append(msg)\n    warn = info\n    debug = info\n\nclass DummySecurityPolicy:\n    def __init__(self, permitted=True):\n        self.permitted = permitted\n\n    def effective_principals(self, request):\n        return []\n\n    def permits(self, context, principals, permission):\n        return self.permitted\n\nclass DummySession(dict):\n    def get_csrf_token(self):\n        return self['csrf_token']\n\ndef parse_httpdate(s):\n    import datetime\n    # cannot use %Z, must use literal GMT; Jython honors timezone\n    # but CPython does not\n    return datetime.datetime.strptime(s, \"%a, %d %b %Y %H:%M:%S GMT\")\n\ndef assert_similar_datetime(one, two):\n    for attr in ('year', 'month', 'day', 'hour', 'minute'):\n        one_attr = getattr(one, attr)\n        two_attr = getattr(two, attr)\n        if not one_attr == two_attr: # pragma: no cover\n            raise AssertionError('%r != %r in %s' % (one_attr, two_attr, attr))\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "",
    "setup_res_stderr": "Using CPython 3.8.20\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 9 packages in 673ms\nPrepared 1 package in 767ms\nInstalled 9 packages in 11ms\n + pastedeploy==3.1.0\n + pyramid==1.8.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b)\n + repoze-lru==0.7\n + setuptools==75.3.0\n + translationstring==1.4\n + venusian==3.1.1\n + webob==1.8.9\n + zope-deprecation==5.0\n + zope-interface==7.2\nResolved 19 packages in 70ms\nInstalled 10 packages in 9ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + distlib==0.3.9\n + filelock==3.16.1\n + nose==1.3.7\n + platformdirs==4.3.6\n + soupsieve==2.6\n + virtualenv==20.29.0\n + waitress==3.0.0\n + webtest==3.0.1\nResolved 16 packages in 6ms\nInstalled 12 packages in 23ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + exceptiongroup==1.2.2\n + iniconfig==2.0.0\n + packaging==24.2\n + pluggy==1.5.0\n + pyproject-api==1.8.0\n + pytest==8.3.4\n + tomli==2.2.1\n + tox==4.23.2\n + typing-extensions==4.12.2\n",
    "new_commit_res_code": 1,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b\ncollected 986 items\n\nr2e_tests/test_1.py ....F.....................................FF........ [  5%]\n.F...F....F...............................                               [  9%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 11%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 15%]\n.....................................F.F................................ [ 22%]\n                                                                         [ 22%]\nr2e_tests/test_config/test_factories.py .....................            [ 24%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 25%]\nr2e_tests/test_config/test_init.py ..................................... [ 29%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 36%]\n......................                                                   [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n...........................................                              [ 46%]\nr2e_tests/test_config/test_rendering.py ...                              [ 46%]\nr2e_tests/test_config/test_routes.py ........................            [ 49%]\nr2e_tests/test_config/test_security.py ..........                        [ 50%]\nr2e_tests/test_config/test_settings.py ........................          [ 52%]\nr2e_tests/test_config/test_testing.py ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 57%]\nr2e_tests/test_config/test_util.py ..................................... [ 60%]\n..............                                                           [ 62%]\nr2e_tests/test_config/test_views.py ........................F........... [ 65%]\n........................................................................ [ 73%]\n..........FF............................................................ [ 80%]\n......................................F.......F                          [ 85%]\nr2e_tests/test_scripts/test_common.py ...                                [ 85%]\nr2e_tests/test_scripts/test_pcreate.py ....................              [ 87%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 87%]\nr2e_tests/test_scripts/test_prequest.py F.FFF.FFFFFF.F.FFF.              [ 89%]\nr2e_tests/test_scripts/test_proutes.py ...FFF....FFFF.F.FF....F..FF.     [ 92%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 95%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n_________________ TestDeriveView.test_as_instance_requestonly __________________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_as_instance_requestonly>\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n>       self.assertTrue('test_viewderivers' in result.__name__)\nE       AssertionError: False is not true\n\nr2e_tests/test_1.py:361: AssertionError\n______________ TestDeriveView.test_function_returns_non_adaptable ______________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:44: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[52 chars]tion r2e_tests.test_1.view into a response obj[94 chars]ble.' != 'Coul[52 chars]tion pyramid.tests.test_viewderivers.view into[109 chars]ble.'\nE           - Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\nE           ?                                                              ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^\nE           + Could not convert return value of the view callable function pyramid.tests.test_viewderivers.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\nE           ?                                                              ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:46: AssertionError\n___________ TestDeriveView.test_function_returns_non_adaptable_dict ____________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:62: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was {'a': 1}. You may have forgotten to define a renderer in the view configuration.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\nE           AssertionError: \"Coul[52 chars]tion r2e_tests.test_1.view into a response obj[104 chars]ion.\" != \"Coul[52 chars]tion pyramid.tests.test_viewderivers.view into[119 chars]ion.\"\nE           Diff is 641 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:64: AssertionError\n______________ TestDeriveView.test_instance_returns_non_adaptable ______________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:82: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable object <r2e_tests.test_1.TestDeriveView.test_instance_returns_non_adaptable.<locals>.AView object at 0x75678b1eabe0> into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n>           self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\nE           AssertionError: False is not true\n\nr2e_tests/test_1.py:85: AssertionError\n_____ TestDeriveView.test_requestonly_default_method_returns_non_adaptable _____\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_1.py:125: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_1.DummyRequest object at 0x75678b037d60>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method __call__ of class r2e_tests.test_1.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[68 chars]lass r2e_tests.test_1.AView into a response ob[95 chars]ble.' != 'Coul[68 chars]lass pyramid.tests.test_viewderivers.AView int[110 chars]ble.'\nE           Diff is 663 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:127: AssertionError\n___ TestDeriveView.test_requestonly_nondefault_method_returns_non_adaptable ____\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_1.py:148: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_1.DummyRequest object at 0x75678b371e80>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method theviewmethod of class r2e_tests.test_1.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[73 chars]lass r2e_tests.test_1.AView into a response ob[95 chars]ble.' != 'Coul[73 chars]lass pyramid.tests.test_viewderivers.AView int[110 chars]ble.'\nE           Diff is 683 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:150: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b355430>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b355430>)\ninterface = <InterfaceClass pyramid.interfaces.IResourceURL>, name = ''\n\n    def getMultiAdapter(self, objects, interface, name=''):\n        adapter = self.adapters.queryMultiAdapter(objects, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(objects, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: ((<r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b355430>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b355430>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs  = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                  ^^^\nE       + resource url adapter for resource iface <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b6d7c10>\ninterface = <InterfaceClass pyramid.interfaces.ITraverser>, name = ''\n\n    def getAdapter(self, object, interface, name=''):\n        adapter = self.adapters.queryAdapter(object, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(object, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: (<r2e_tests.test_config.test_adapters.DummyIface object at 0x75678b6d7c10>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:574: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x75678b299cd0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]aa3b/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]aa3b/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]aa3b/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]aa3b/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:68: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:654: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1163: in execute_actions\n    action = next(pending_actions, None)\npyramid/config/__init__.py:1121: in resume\n    for a, b in zip_longest(actions, executed_actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x75678b38a280>, 'discriminat...678b38aa60>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\n\n    def resolveConflicts(actions):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n        \"\"\"\n    \n        def orderandpos(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return (v['order'] or 0, n)\n    \n        sactions = sorted(enumerate(actions), key=orderandpos)\n    \n        def orderonly(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return v['order'] or 0\n    \n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n    \n            unique = {}\n            output = []\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                if not isinstance(action, dict):\n                    # old-style tuple action\n                    action = expand_action(*action)\n    \n                # \"ainfo\" is a tuple of (order, i, action) where \"order\" is a\n                # user-supplied grouping, \"i\" is an integer expressing the relative\n                # position of this action in the action list being resolved, and\n                # \"action\" is an action dictionary.  The purpose of an ainfo is to\n                # associate an \"order\" and an \"i\" with a particular action; \"order\"\n                # and \"i\" exist for sorting purposes after conflict resolution.\n                ainfo = (order, i, action)\n    \n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n    \n            for discriminator, ainfos in unique.items():\n                # We use (includepath, order, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"order\", then\n                # \"i\".\n                def bypath(ainfo):\n                    path, order, i = ainfo[2]['includepath'], ainfo[0], ainfo[1]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                output.append(ainfo)\n                _, _, action = ainfo\n                basepath, baseinfo, discriminator = (\n                    action['includepath'],\n                    action['info'],\n                    action['discriminator'],\n                    )\n    \n                for _, _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath or  # not a prefix\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1299: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1048: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:444: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1247: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1234: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1221: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:543: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]5678b14ce20>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]5678b14ce20>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]75678b14ce20>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]75678b14ce20>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x75678b14ce20>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:1904: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1143: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1184: AssertionError\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'pyramid.tests.test_config:path/',\n                'pyramid.tests.test_config:other_path/')\n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n                return cb_\n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:2983: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3154: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_commas _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_commas>\n\n    def test_config_format_ini_commas(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method,name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:726: AssertionError\n______________ TestPRoutesCommand.test_config_format_ini_newlines ______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_newlines>\n\n    def test_config_format_ini_newlines(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method\\nname')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:660: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_spaces _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_spaces>\n\n    def test_config_format_ini_spaces(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:693: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:309: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:336: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:195: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:503: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:393: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        config.add_static_view(name='static2', path='/var/www/static')\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', '/var/www/static/', '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:423: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:155: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:574: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:533: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_function_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_function_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_cls_context_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_cls_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_attr_wrapped_view_branching_default_phash\nPASSED r2e_tests/test_1.py::TestDeriveView::test_attr_wrapped_view_branching_nondefault_phash\nPASSED r2e_tests/test_1.py::TestDeriveView::test_class_with_attr\nPASSED r2e_tests/test_1.py::TestDeriveView::test_class_without_attr\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_failed_on_explicit_exception_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_POST_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_POST_param\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_PUT_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_origin\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_referrer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_https_domain\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_ignores_GET\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_passed_on_explicit_exception_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_bool_or_str_in_config_setting\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_bool_or_str_in_require_csrf\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_param\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_skipped_by_default_on_exception_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_falsey\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_truthy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_when_view_option_is_true\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_with_custom_token\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_view_option_override\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_denied\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_denied2\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_overridden\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_permitted\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_permitted_no_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_function_returns_true_Response_no_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_function_returns_true_Response_with_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_prevent_http_cache_in_settings\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_bad_tuple\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_integer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_prevent_auto_set\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_timedelta\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_tuple\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_tuple_seconds_None\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_exception_has_text_in_detail\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_view_has_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_view_has_no_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer_request_has_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer_request_override\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_authn_policy_no_authz_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_authz_policy_no_authn_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_raises_forbidden_no_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_raises_forbidden_with_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_authn_policy_no_authz_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_authz_policy_no_authn_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_no_authpol\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_no_permission\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_all\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_checker\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_notall\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_config_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_default_mapper_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_view_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_wrapper_viewname\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_wrapper_viewname_notfound\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_implicit\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_under_rendered_view\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_under_rendered_view_others\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_user_sorted\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_ingress_is_first\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_mapped_view_is_last\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_view_is_last\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_reserves_ingress\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_without_name\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_multi_derivers_ordered\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_single_deriver\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_override_deriver\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_override_mapped_view\nPASSED r2e_tests/test_1.py::TestDeriverIntegration::test_unexpected_view_options\nPASSED r2e_tests/test_1.py::TestDeriverIntegration::test_view_options\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_check_csrf_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::Test_logging_file_config::test_it\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_with_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_written_pid\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_stale_pid_write_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_unlink_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_bad_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_invalid_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_no_such_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_flush\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_open\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_write\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_writeline\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__fail\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__succeed\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::TestDeriveView::test_as_instance_requestonly - As...\nFAILED r2e_tests/test_1.py::TestDeriveView::test_function_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_1.py::TestDeriveView::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 66 failed, 920 passed in 5.57s ========================\n",
    "new_commit_res_stderr": "",
    "old_commit_res_code": 1,
    "old_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b\ncollected 986 items\n\nr2e_tests/test_1.py ....F..........................F..........FF........ [  5%]\n.F...F....F...............................                               [  9%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 11%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 15%]\n.....................................F.F................................ [ 22%]\n                                                                         [ 22%]\nr2e_tests/test_config/test_factories.py .....................            [ 24%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 25%]\nr2e_tests/test_config/test_init.py ..................................... [ 29%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 36%]\n......................                                                   [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n...........................................                              [ 46%]\nr2e_tests/test_config/test_rendering.py ...                              [ 46%]\nr2e_tests/test_config/test_routes.py ........................            [ 49%]\nr2e_tests/test_config/test_security.py ..........                        [ 50%]\nr2e_tests/test_config/test_settings.py ........................          [ 52%]\nr2e_tests/test_config/test_testing.py ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 57%]\nr2e_tests/test_config/test_util.py ..................................... [ 60%]\n..............                                                           [ 62%]\nr2e_tests/test_config/test_views.py ........................F........... [ 65%]\n........................................................................ [ 73%]\n..........FF............................................................ [ 80%]\n......................................F.......F                          [ 85%]\nr2e_tests/test_scripts/test_common.py ...                                [ 85%]\nr2e_tests/test_scripts/test_pcreate.py ....................              [ 87%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 87%]\nr2e_tests/test_scripts/test_prequest.py F.FFF.FFFFFF.F.FFF.              [ 89%]\nr2e_tests/test_scripts/test_proutes.py ...FFF....FFFF.F.FF....F..FF.     [ 92%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 95%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n_________________ TestDeriveView.test_as_instance_requestonly __________________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_as_instance_requestonly>\n\n    def test_as_instance_requestonly(self):\n        response = DummyResponse()\n        class View:\n            def __call__(self, request):\n                return response\n        view = View()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        self.assertEqual(view.__module__, result.__module__)\n        self.assertEqual(view.__doc__, result.__doc__)\n>       self.assertTrue('test_viewderivers' in result.__name__)\nE       AssertionError: False is not true\n\nr2e_tests/test_1.py:361: AssertionError\n______ TestDeriveView.test_csrf_view_skipped_by_default_on_exception_view ______\n\nrequest = <Request at 0x792fc91b6a00 POST http://example.com/foo>\n\n    def view(request):\n>       raise ValueError\nE       ValueError\n\nr2e_tests/test_1.py:1303: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_csrf_view_skipped_by_default_on_exception_view>\n\n    def test_csrf_view_skipped_by_default_on_exception_view(self):\n        from pyramid.request import Request\n        def view(request):\n            raise ValueError\n        def excview(request):\n            return 'hello'\n        self.config.add_settings({'pyramid.require_default_csrf': 'yes'})\n        self.config.set_session_factory(\n            lambda request: DummySession({'csrf_token': 'foo'}))\n        self.config.add_view(view, name='foo', require_csrf=False)\n        self.config.add_view(excview, context=ValueError, renderer='string')\n        app = self.config.make_wsgi_app()\n        request = Request.blank('/foo', base_url='http://example.com')\n        request.method = 'POST'\n>       response = request.get_response(app)\n\nr2e_tests/test_1.py:1314: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.venv/lib/python3.8/site-packages/webob/request.py:1313: in send\n    status, headers, app_iter = self.call_application(\n.venv/lib/python3.8/site-packages/webob/request.py:1278: in call_application\n    app_iter = application(self.environ, start_response)\npyramid/router.py:236: in __call__\n    response = self.invoke_subrequest(request, use_tweens=True)\npyramid/router.py:211: in invoke_subrequest\n    response = handle_request(request)\npyramid/tweens.py:41: in excview_tween\n    response = _call_view(\npyramid/view.py:546: in _call_view\n    response = view_callable(context, request)\npyramid/viewderivers.py:500: in csrf_view\n    check_csrf_token(request, val, raises=True)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nrequest = <Request at 0x792fc91b6a00 POST http://example.com/foo>\ntoken = 'csrf_token', header = 'X-CSRF-Token', raises = True\n\n    def check_csrf_token(request,\n                         token='csrf_token',\n                         header='X-CSRF-Token',\n                         raises=True):\n        \"\"\" Check the CSRF token in the request's session against the value in\n        ``request.POST.get(token)`` (if a POST request) or\n        ``request.headers.get(header)``. If a ``token`` keyword is not supplied to\n        this function, the string ``csrf_token`` will be used to look up the token\n        in ``request.POST``. If a ``header`` keyword is not supplied to this\n        function, the string ``X-CSRF-Token`` will be used to look up the token in\n        ``request.headers``.\n    \n        If the value supplied by post or by header doesn't match the value\n        supplied by ``request.session.get_csrf_token()``, and ``raises`` is\n        ``True``, this function will raise an\n        :exc:`pyramid.exceptions.BadCSRFToken` exception.\n        If the check does succeed and ``raises`` is ``False``, this\n        function will return ``False``.  If the CSRF check is successful, this\n        function will return ``True`` unconditionally.\n    \n        Note that using this function requires that a :term:`session factory` is\n        configured.\n    \n        See :ref:`auto_csrf_checking` for information about how to secure your\n        application automatically against CSRF attacks.\n    \n        .. versionadded:: 1.4a2\n    \n        .. versionchanged:: 1.7a1\n           A CSRF token passed in the query string of the request is no longer\n           considered valid. It must be passed in either the request body or\n           a header.\n        \"\"\"\n        # If this is a POST/PUT/etc request, then we'll check the body to see if it\n        # has a token. We explicitly use request.POST here because CSRF tokens\n        # should never appear in an URL as doing so is a security issue. We also\n        # explicitly check for request.POST here as we do not support sending form\n        # encoded data over anything but a request.POST.\n        supplied_token = request.POST.get(token, \"\")\n    \n        # If we were unable to locate a CSRF token in a request body, then we'll\n        # check to see if there are any headers that have a value for us.\n        if supplied_token == \"\":\n            supplied_token = request.headers.get(header, \"\")\n    \n        expected_token = request.session.get_csrf_token()\n        if strings_differ(bytes_(expected_token), bytes_(supplied_token)):\n            if raises:\n>               raise BadCSRFToken('check_csrf_token(): Invalid token')\nE               pyramid.exceptions.BadCSRFToken: check_csrf_token(): Invalid token\n\npyramid/session.py:251: BadCSRFToken\n______________ TestDeriveView.test_function_returns_non_adaptable ______________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:44: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_viewderivers.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[52 chars]tion r2e_tests.test_1.view into a response obj[94 chars]ble.' != 'Coul[52 chars]tion pyramid.tests.test_viewderivers.view into[109 chars]ble.'\nE           - Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\nE           ?                                                              ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^\nE           + Could not convert return value of the view callable function pyramid.tests.test_viewderivers.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\nE           ?                                                              ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:46: AssertionError\n___________ TestDeriveView.test_function_returns_non_adaptable_dict ____________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:62: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_1.view into a response object. The value returned was {'a': 1}. You may have forgotten to define a renderer in the view configuration.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_viewderivers.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\nE           AssertionError: \"Coul[52 chars]tion r2e_tests.test_1.view into a response obj[104 chars]ion.\" != \"Coul[52 chars]tion pyramid.tests.test_viewderivers.view into[119 chars]ion.\"\nE           Diff is 641 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:64: AssertionError\n______________ TestDeriveView.test_instance_returns_non_adaptable ______________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_1.py:82: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable object <r2e_tests.test_1.TestDeriveView.test_instance_returns_non_adaptable.<locals>.AView object at 0x792fc91ab910> into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        result = self.config.derive_view(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n>           self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_viewderivers.'))\nE           AssertionError: False is not true\n\nr2e_tests/test_1.py:85: AssertionError\n_____ TestDeriveView.test_requestonly_default_method_returns_non_adaptable _____\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_1.py:125: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_1.DummyRequest object at 0x792fc916cd60>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method __call__ of class r2e_tests.test_1.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        result = self.config.derive_view(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[68 chars]lass r2e_tests.test_1.AView into a response ob[95 chars]ble.' != 'Coul[68 chars]lass pyramid.tests.test_viewderivers.AView int[110 chars]ble.'\nE           Diff is 663 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:127: AssertionError\n___ TestDeriveView.test_requestonly_nondefault_method_returns_non_adaptable ____\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_1.py:148: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_1.DummyRequest object at 0x792fc8d979d0>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method theviewmethod of class r2e_tests.test_1.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/viewderivers.py:419: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        result = self.config.derive_view(AView, attr='theviewmethod')\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_viewderivers.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[73 chars]lass r2e_tests.test_1.AView into a response ob[95 chars]ble.' != 'Coul[73 chars]lass pyramid.tests.test_viewderivers.AView int[110 chars]ble.'\nE           Diff is 683 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_1.py:150: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8fd1c70>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8fd1c70>)\ninterface = <InterfaceClass pyramid.interfaces.IResourceURL>, name = ''\n\n    def getMultiAdapter(self, objects, interface, name=''):\n        adapter = self.adapters.queryMultiAdapter(objects, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(objects, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: ((<r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8fd1c70>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8fd1c70>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs  = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                  ^^^\nE       + resource url adapter for resource iface <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8dea910>\ninterface = <InterfaceClass pyramid.interfaces.ITraverser>, name = ''\n\n    def getAdapter(self, object, interface, name=''):\n        adapter = self.adapters.queryAdapter(object, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(object, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: (<r2e_tests.test_config.test_adapters.DummyIface object at 0x792fc8dea910>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]aa3b/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]aa3b/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:574: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x792fc9287130>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]aa3b/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]aa3b/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]c47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]aa3b/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]aa3b/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]47e4d2e335cd9e264dba8aa3b/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]47e4d2e335cd9e264dba8aa3b/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:68: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:654: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1163: in execute_actions\n    action = next(pending_actions, None)\npyramid/config/__init__.py:1121: in resume\n    for a, b in zip_longest(actions, executed_actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x792fc8d8e5e0>, 'discriminat...2fc8d8eb80>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\n\n    def resolveConflicts(actions):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n        \"\"\"\n    \n        def orderandpos(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return (v['order'] or 0, n)\n    \n        sactions = sorted(enumerate(actions), key=orderandpos)\n    \n        def orderonly(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return v['order'] or 0\n    \n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n    \n            unique = {}\n            output = []\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                if not isinstance(action, dict):\n                    # old-style tuple action\n                    action = expand_action(*action)\n    \n                # \"ainfo\" is a tuple of (order, i, action) where \"order\" is a\n                # user-supplied grouping, \"i\" is an integer expressing the relative\n                # position of this action in the action list being resolved, and\n                # \"action\" is an action dictionary.  The purpose of an ainfo is to\n                # associate an \"order\" and an \"i\" with a particular action; \"order\"\n                # and \"i\" exist for sorting purposes after conflict resolution.\n                ainfo = (order, i, action)\n    \n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n    \n            for discriminator, ainfos in unique.items():\n                # We use (includepath, order, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"order\", then\n                # \"i\".\n                def bypath(ainfo):\n                    path, order, i = ainfo[2]['includepath'], ainfo[0], ainfo[1]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                output.append(ainfo)\n                _, _, action = ainfo\n                basepath, baseinfo, discriminator = (\n                    action['includepath'],\n                    action['info'],\n                    action['discriminator'],\n                    )\n    \n                for _, _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath or  # not a prefix\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_6c16fb020027fac47e4d2e335cd9e264dba8aa3b/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1299: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1048: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:444: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1247: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1234: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1221: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:543: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]92fc8ea17f0>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]92fc8ea17f0>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]792fc8ea17f0>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]792fc8ea17f0>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x792fc8ea17f0>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:1904: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1143: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1184: AssertionError\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'pyramid.tests.test_config:path/',\n                'pyramid.tests.test_config:other_path/')\n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n                return cb_\n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:2983: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3154: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_commas _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_commas>\n\n    def test_config_format_ini_commas(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method,name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:726: AssertionError\n______________ TestPRoutesCommand.test_config_format_ini_newlines ______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_newlines>\n\n    def test_config_format_ini_newlines(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method\\nname')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:660: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_spaces _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_spaces>\n\n    def test_config_format_ini_spaces(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:693: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:309: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:336: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:195: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:503: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:393: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        config.add_static_view(name='static2', path='/var/www/static')\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', '/var/www/static/', '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:423: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:155: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:574: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:533: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_function_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_function_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_instance_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_newstyle_class_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_cls_context_request_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_as_oldstyle_cls_requestonly_attr_and_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_attr_wrapped_view_branching_default_phash\nPASSED r2e_tests/test_1.py::TestDeriveView::test_attr_wrapped_view_branching_nondefault_phash\nPASSED r2e_tests/test_1.py::TestDeriveView::test_class_with_attr\nPASSED r2e_tests/test_1.py::TestDeriveView::test_class_without_attr\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_failed_on_explicit_exception_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_POST_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_POST_param\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_PUT_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_origin\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_fails_on_bad_referrer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_https_domain\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_ignores_GET\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_passed_on_explicit_exception_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_bool_or_str_in_config_setting\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_bool_or_str_in_require_csrf\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_header\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_requires_param\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_falsey\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_truthy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_when_view_option_is_true\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_config_setting_with_custom_token\nPASSED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_uses_view_option_override\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_denied\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_denied2\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_overridden\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_permitted\nPASSED r2e_tests/test_1.py::TestDeriveView::test_debug_auth_permission_authpol_permitted_no_request\nPASSED r2e_tests/test_1.py::TestDeriveView::test_function_returns_true_Response_no_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_function_returns_true_Response_with_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_prevent_http_cache_in_settings\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_bad_tuple\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_integer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_prevent_auto_set\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_timedelta\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_tuple\nPASSED r2e_tests/test_1.py::TestDeriveView::test_http_cached_view_tuple_seconds_None\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_exception_has_text_in_detail\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_view_has_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_predicate_mismatch_view_has_no_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer_request_has_view\nPASSED r2e_tests/test_1.py::TestDeriveView::test_requestonly_function_with_renderer_request_override\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_authn_policy_no_authz_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_authz_policy_no_authn_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_raises_forbidden_no_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_secured_view_raises_forbidden_with_name\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_authn_policy_no_authz_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_authz_policy_no_authn_policy\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_no_authpol\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_debug_authorization_no_permission\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_all\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_checker\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_predicates_notall\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_config_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_default_mapper_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_view_mapper_view_specified\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_wrapper_viewname\nPASSED r2e_tests/test_1.py::TestDeriveView::test_with_wrapper_viewname_notfound\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_implicit\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_under_rendered_view\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_under_rendered_view_others\nPASSED r2e_tests/test_1.py::TestDerivationOrder::test_right_order_user_sorted\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_ingress_is_first\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_mapped_view_is_last\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_enforces_view_is_last\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_reserves_ingress\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_deriver_without_name\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_multi_derivers_ordered\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_add_single_deriver\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_override_deriver\nPASSED r2e_tests/test_1.py::TestAddDeriver::test_override_mapped_view\nPASSED r2e_tests/test_1.py::TestDeriverIntegration::test_unexpected_view_options\nPASSED r2e_tests/test_1.py::TestDeriverIntegration::test_view_options\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi_equal_sign\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_check_csrf_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::Test_logging_file_config::test_it\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_with_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_written_pid\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_stale_pid_write_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_unlink_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_bad_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_invalid_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_no_such_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_flush\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_open\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_write\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_writeline\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__fail\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__succeed\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::TestDeriveView::test_as_instance_requestonly - As...\nFAILED r2e_tests/test_1.py::TestDeriveView::test_csrf_view_skipped_by_default_on_exception_view\nFAILED r2e_tests/test_1.py::TestDeriveView::test_function_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_1.py::TestDeriveView::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_1.py::TestDeriveView::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 67 failed, 919 passed in 4.80s ========================\n",
    "old_commit_res_stderr": ""
}
pyramid/tests/test_viewderivers.py pyramid/viewderivers.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]

**Title:** CSRF Checks Enabled by Default on Exception Views Causing Unexpected Errors

**Description:**
When an exception is raised within a view, the corresponding exception view inadvertently undergoes CSRF validation even when it should be exempted. This results in `BadCSRFToken` errors, disrupting the response handling for exceptions.

**Example Buggy Code:**
```python
from pyramid.request import Request
from pyramid.config import Configurator

def faulty_view(request):
    raise ValueError("An error occurred")

def exception_view(request):
    return 'An error has been handled.'

def test_exception_view_csrf_check():
    config = Configurator()
    config.add_settings({'pyramid.require_default_csrf': 'yes'})
    config.set_session_factory(lambda request: DummySession({'csrf_token': 'foo'}))
    config.add_view(faulty_view, name='faulty', require_csrf=False)
    config.add_view(exception_view, context=ValueError, renderer='string')
    app = config.make_wsgi_app()
    
    request = Request.blank('/faulty', base_url='http://example.com')
    request.method = 'POST'
    response = request.get_response(app)
    # Expecting 'An error has been handled.' without CSRF validation
```

**Expected Behavior:**
Exception views should bypass CSRF validation by default unless explicitly configured to enforce it. When an exception is raised, the exception view should return the appropriate response without triggering CSRF-related errors.

**Actual Behavior:**
The exception view undergoes CSRF validation by default, leading to a `BadCSRFToken` error when handling exceptions. This prevents the exception view from returning the expected response smoothly.

[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### pyramid/viewderivers.py
import inspect

from zope.interface import (
    implementer,
    provider,
    )

from pyramid.security import NO_PERMISSION_REQUIRED
from pyramid.session import (
    check_csrf_origin,
    check_csrf_token,
)
from pyramid.response import Response

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IAuthorizationPolicy,
    IDebugLogger,
    IResponse,
    IViewMapper,
    IViewMapperFactory,
    )

from pyramid.compat import (
    string_types,
    is_bound_method,
    is_unbound_method,
    )

from pyramid.config.util import (
    DEFAULT_PHASH,
    MAX_ORDER,
    takes_one_arg,
    )

from pyramid.exceptions import (
    ConfigurationError,
    PredicateMismatch,
    )
from pyramid.httpexceptions import HTTPForbidden
from pyramid.settings import (
    falsey,
    truthy,
)
from pyramid.util import object_description
from pyramid.view import render_view_to_response
from pyramid import renderers


def view_description(view):
    try:
        return view.__text__
    except AttributeError:
        # custom view mappers might not add __text__
        return object_description(view)

def requestonly(view, attr=None):
    return takes_one_arg(view, attr=attr, argname='request')

@implementer(IViewMapper)
@provider(IViewMapperFactory)
class DefaultViewMapper(object):
    def __init__(self, **kw):
        self.attr = kw.get('attr')

    def __call__(self, view):
        if is_unbound_method(view) and self.attr is None:
            raise ConfigurationError((
                'Unbound method calls are not supported, please set the class '
                'as your `view` and the method as your `attr`'
            ))

        if inspect.isclass(view):
            view = self.map_class(view)
        else:
            view = self.map_nonclass(view)
        return view

    def map_class(self, view):
        ronly = requestonly(view, self.attr)
        if ronly:
            mapped_view = self.map_class_requestonly(view)
        else:
            mapped_view = self.map_class_native(view)
        mapped_view.__text__ = 'method %s of %s' % (
            self.attr or '__call__', object_description(view))
        return mapped_view

    def map_nonclass(self, view):
        # We do more work here than appears necessary to avoid wrapping the
        # view unless it actually requires wrapping (to avoid function call
        # overhead).
        mapped_view = view
        ronly = requestonly(view, self.attr)
        if ronly:
            mapped_view = self.map_nonclass_requestonly(view)
        elif self.attr:
            mapped_view = self.map_nonclass_attr(view)
        if inspect.isroutine(mapped_view):
            # This branch will be true if the view is a function or a method.
            # We potentially mutate an unwrapped object here if it's a
            # function.  We do this to avoid function call overhead of
            # injecting another wrapper.  However, we must wrap if the
            # function is a bound method because we can't set attributes on a
            # bound method.
            if is_bound_method(view):
                _mapped_view = mapped_view
                def mapped_view(context, request):
                    return _mapped_view(context, request)
            if self.attr is not None:
                mapped_view.__text__ = 'attr %s of %s' % (
                    self.attr, object_description(view))
            else:
                mapped_view.__text__ = object_description(view)
        return mapped_view

    def map_class_requestonly(self, view):
        # its a class that has an __init__ which only accepts request
        attr = self.attr
        def _class_requestonly_view(context, request):
            inst = view(request)
            request.__view__ = inst
            if attr is None:
                response = inst()
            else:
                response = getattr(inst, attr)()
            return response
        return _class_requestonly_view

    def map_class_native(self, view):
        # its a class that has an __init__ which accepts both context and
        # request
        attr = self.attr
        def _class_view(context, request):
            inst = view(context, request)
            request.__view__ = inst
            if attr is None:
                response = inst()
            else:
                response = getattr(inst, attr)()
            return response
        return _class_view

    def map_nonclass_requestonly(self, view):
        # its a function that has a __call__ which accepts only a single
        # request argument
        attr = self.attr
        def _requestonly_view(context, request):
            if attr is None:
                response = view(request)
            else:
                response = getattr(view, attr)(request)
            return response
        return _requestonly_view

    def map_nonclass_attr(self, view):
        # its a function that has a __call__ which accepts both context and
        # request, but still has an attr
        def _attr_view(context, request):
            response = getattr(view, self.attr)(context, request)
            return response
        return _attr_view


def wraps_view(wrapper):
    def inner(view, info):
        wrapper_view = wrapper(view, info)
        return preserve_view_attrs(view, wrapper_view)
    return inner

def preserve_view_attrs(view, wrapper):
    if view is None:
        return wrapper

    if wrapper is view:
        return view

    original_view = getattr(view, '__original_view__', None)

    if original_view is None:
        original_view = view

    wrapper.__wraps__ = view
    wrapper.__original_view__ = original_view
    wrapper.__module__ = view.__module__
    wrapper.__doc__ = view.__doc__

    try:
        wrapper.__name__ = view.__name__
    except AttributeError:
        wrapper.__name__ = repr(view)

    # attrs that may not exist on "view", but, if so, must be attached to
    # "wrapped view"
    for attr in ('__permitted__', '__call_permissive__', '__permission__',
                 '__predicated__', '__predicates__', '__accept__',
                 '__order__', '__text__'):
        try:
            setattr(wrapper, attr, getattr(view, attr))
        except AttributeError:
            pass

    return wrapper

def mapped_view(view, info):
    mapper = info.options.get('mapper')
    if mapper is None:
        mapper = getattr(view, '__view_mapper__', None)
        if mapper is None:
            mapper = info.registry.queryUtility(IViewMapperFactory)
            if mapper is None:
                mapper = DefaultViewMapper

    mapped_view = mapper(**info.options)(view)
    return mapped_view

mapped_view.options = ('mapper', 'attr')

def owrapped_view(view, info):
    wrapper_viewname = info.options.get('wrapper')
    viewname = info.options.get('name')
    if not wrapper_viewname:
        return view
    def _owrapped_view(context, request):
        response = view(context, request)
        request.wrapped_response = response
        request.wrapped_body = response.body
        request.wrapped_view = view
        wrapped_response = render_view_to_response(context, request,
                                                   wrapper_viewname)
        if wrapped_response is None:
            raise ValueError(
                'No wrapper view named %r found when executing view '
                'named %r' % (wrapper_viewname, viewname))
        return wrapped_response
    return _owrapped_view

owrapped_view.options = ('name', 'wrapper')

def http_cached_view(view, info):
    if info.settings.get('prevent_http_cache', False):
        return view

    seconds = info.options.get('http_cache')

    if seconds is None:
        return view

    options = {}

    if isinstance(seconds, (tuple, list)):
        try:
            seconds, options = seconds
        except ValueError:
            raise ConfigurationError(
                'If http_cache parameter is a tuple or list, it must be '
                'in the form (seconds, options); not %s' % (seconds,))

    def wrapper(context, request):
        response = view(context, request)
        prevent_caching = getattr(response.cache_control, 'prevent_auto',
                                  False)
        if not prevent_caching:
            response.cache_expires(seconds, **options)
        return response

    return wrapper

http_cached_view.options = ('http_cache',)

def secured_view(view, info):
    for wrapper in (_secured_view, _authdebug_view):
        view = wraps_view(wrapper)(view, info)
    return view

secured_view.options = ('permission',)

def _secured_view(view, info):
    permission = info.options.get('permission')
    if permission == NO_PERMISSION_REQUIRED:
        # allow views registered within configurations that have a
        # default permission to explicitly override the default
        # permission, replacing it with no permission at all
        permission = None

    wrapped_view = view
    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)
    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)

    if authn_policy and authz_policy and (permission is not None):
        def _permitted(context, request):
            principals = authn_policy.effective_principals(request)
            return authz_policy.permits(context, principals, permission)
        def _secured_view(context, request):
            result = _permitted(context, request)
            if result:
                return view(context, request)
            view_name = getattr(view, '__name__', view)
            msg = getattr(
                request, 'authdebug_message',
                'Unauthorized: %s failed permission check' % view_name)
            raise HTTPForbidden(msg, result=result)
        _secured_view.__call_permissive__ = view
        _secured_view.__permitted__ = _permitted
        _secured_view.__permission__ = permission
        wrapped_view = _secured_view

    return wrapped_view

def _authdebug_view(view, info):
    wrapped_view = view
    settings = info.settings
    permission = info.options.get('permission')
    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)
    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)
    logger = info.registry.queryUtility(IDebugLogger)
    if settings and settings.get('debug_authorization', False):
        def _authdebug_view(context, request):
            view_name = getattr(request, 'view_name', None)

            if authn_policy and authz_policy:
                if permission is NO_PERMISSION_REQUIRED:
                    msg = 'Allowed (NO_PERMISSION_REQUIRED)'
                elif permission is None:
                    msg = 'Allowed (no permission registered)'
                else:
                    principals = authn_policy.effective_principals(request)
                    msg = str(authz_policy.permits(
                        context, principals, permission))
            else:
                msg = 'Allowed (no authorization policy in use)'

            view_name = getattr(request, 'view_name', None)
            url = getattr(request, 'url', None)
            msg = ('debug_authorization of url %s (view name %r against '
                   'context %r): %s' % (url, view_name, context, msg))
            if logger:
                logger.debug(msg)
            if request is not None:
                request.authdebug_message = msg
            return view(context, request)

        wrapped_view = _authdebug_view

    return wrapped_view

def predicated_view(view, info):
    preds = info.predicates
    if not preds:
        return view
    def predicate_wrapper(context, request):
        for predicate in preds:
            if not predicate(context, request):
                view_name = getattr(view, '__name__', view)
                raise PredicateMismatch(
                    'predicate mismatch for view %s (%s)' % (
                        view_name, predicate.text()))
        return view(context, request)
    def checker(context, request):
        return all((predicate(context, request) for predicate in
                    preds))
    predicate_wrapper.__predicated__ = checker
    predicate_wrapper.__predicates__ = preds
    return predicate_wrapper

def attr_wrapped_view(view, info):
    accept, order, phash = (info.options.get('accept', None),
                            getattr(info, 'order', MAX_ORDER),
                            getattr(info, 'phash', DEFAULT_PHASH))
    # this is a little silly but we don't want to decorate the original
    # function with attributes that indicate accept, order, and phash,
    # so we use a wrapper
    if (
        (accept is None) and
        (order == MAX_ORDER) and
        (phash == DEFAULT_PHASH)
    ):
        return view # defaults
    def attr_view(context, request):
        return view(context, request)
    attr_view.__accept__ = accept
    attr_view.__order__ = order
    attr_view.__phash__ = phash
    attr_view.__view_attr__ = info.options.get('attr')
    attr_view.__permission__ = info.options.get('permission')
    return attr_view

attr_wrapped_view.options = ('accept', 'attr', 'permission')

def rendered_view(view, info):
    # one way or another this wrapper must produce a Response (unless
    # the renderer is a NullRendererHelper)
    renderer = info.options.get('renderer')
    if renderer is None:
        # register a default renderer if you want super-dynamic
        # rendering.  registering a default renderer will also allow
        # override_renderer to work if a renderer is left unspecified for
        # a view registration.
        def viewresult_to_response(context, request):
            result = view(context, request)
            if result.__class__ is Response: # common case
                response = result
            else:
                response = info.registry.queryAdapterOrSelf(result, IResponse)
                if response is None:
                    if result is None:
                        append = (' You may have forgotten to return a value '
                                  'from the view callable.')
                    elif isinstance(result, dict):
                        append = (' You may have forgotten to define a '
                                  'renderer in the view configuration.')
                    else:
                        append = ''

                    msg = ('Could not convert return value of the view '
                           'callable %s into a response object. '
                           'The value returned was %r.' + append)

                    raise ValueError(msg % (view_description(view), result))

            return response

        return viewresult_to_response

    if renderer is renderers.null_renderer:
        return view

    def rendered_view(context, request):
        result = view(context, request)
        if result.__class__ is Response: # potential common case
            response = result
        else:
            # this must adapt, it can't do a simple interface check
            # (avoid trying to render webob responses)
            response = info.registry.queryAdapterOrSelf(result, IResponse)
            if response is None:
                attrs = getattr(request, '__dict__', {})
                if 'override_renderer' in attrs:
                    # renderer overridden by newrequest event or other
                    renderer_name = attrs.pop('override_renderer')
                    view_renderer = renderers.RendererHelper(
                        name=renderer_name,
                        package=info.package,
                        registry=info.registry)
                else:
                    view_renderer = renderer.clone()
                if '__view__' in attrs:
                    view_inst = attrs.pop('__view__')
                else:
                    view_inst = getattr(view, '__original_view__', view)
                response = view_renderer.render_view(
                    request, result, view_inst, context)
        return response

    return rendered_view

rendered_view.options = ('renderer',)

def decorated_view(view, info):
    decorator = info.options.get('decorator')
    if decorator is None:
        return view
    return decorator(view)

decorated_view.options = ('decorator',)

def _parse_csrf_setting(val, error_source):
    if val:
        if isinstance(val, string_types):
            if val.lower() in truthy:
                val = True
            elif val.lower() in falsey:
                val = False
        elif not isinstance(val, bool):
            raise ConfigurationError(
                '{0} must be a string or boolean value'
                .format(error_source))
    return val

SAFE_REQUEST_METHODS = frozenset(["GET", "HEAD", "OPTIONS", "TRACE"])

def csrf_view(view, info):
    default_val = _parse_csrf_setting(
        info.settings.get('pyramid.require_default_csrf'),
        'Config setting "pyramid.require_default_csrf"')
    val = _parse_csrf_setting(
        info.options.get('require_csrf'),
        'View option "require_csrf"')
    if (val is True and default_val) or val is None:
        val = default_val
    if val is True:
        val = 'csrf_token'
    wrapped_view = view
    if val:
        def csrf_view(context, request):
            # Assume that anything not defined as 'safe' by RFC2616 needs
            # protection
            if request.method not in SAFE_REQUEST_METHODS:
                check_csrf_origin(request, raises=True)
                check_csrf_token(request, val, raises=True)
            return view(context, request)
        wrapped_view = csrf_view
    return wrapped_view

csrf_view.options = ('require_csrf',)

VIEW = 'VIEW'
INGRESS = 'INGRESS'

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
[ISSUE]

**Title:** CSRF Checks Enabled by Default on Exception Views Causing Unexpected Errors

**Description:**
When an exception is raised within a view, the corresponding exception view inadvertently undergoes CSRF validation even when it should be exempted. This results in `BadCSRFToken` errors, disrupting the response handling for exceptions.

**Example Buggy Code:**
```python
from pyramid.request import Request
from pyramid.config import Configurator

def faulty_view(request):
    raise ValueError("An error occurred")

def exception_view(request):
    return 'An error has been handled.'

def test_exception_view_csrf_check():
    config = Configurator()
    config.add_settings({'pyramid.require_default_csrf': 'yes'})
    config.set_session_factory(lambda request: DummySession({'csrf_token': 'foo'}))
    config.add_view(faulty_view, name='faulty', require_csrf=False)
    config.add_view(exception_view, context=ValueError, renderer='string')
    app = config.make_wsgi_app()
    
    request = Request.blank('/faulty', base_url='http://example.com')
    request.method = 'POST'
    response = request.get_response(app)
    # Expecting 'An error has been handled.' without CSRF validation
```

**Expected Behavior:**
Exception views should bypass CSRF validation by default unless explicitly configured to enforce it. When an exception is raised, the exception view should return the appropriate response without triggering CSRF-related errors.

**Actual Behavior:**
The exception view undergoes CSRF validation by default, leading to a `BadCSRFToken` error when handling exceptions. This prevents the exception view from returning the expected response smoothly.

[/ISSUE]
{
    "TestDeriveView.test_as_function_context_and_request": "PASSED",
    "TestDeriveView.test_as_function_requestonly": "PASSED",
    "TestDeriveView.test_as_instance_context_and_request": "PASSED",
    "TestDeriveView.test_as_instance_context_and_request_attr_and_renderer": "PASSED",
    "TestDeriveView.test_as_instance_requestonly_attr_and_renderer": "PASSED",
    "TestDeriveView.test_as_newstyle_class_context_and_request": "PASSED",
    "TestDeriveView.test_as_newstyle_class_context_and_request_attr_and_renderer": "PASSED",
    "TestDeriveView.test_as_newstyle_class_requestonly": "PASSED",
    "TestDeriveView.test_as_newstyle_class_requestonly_attr_and_renderer": "PASSED",
    "TestDeriveView.test_as_oldstyle_class_context_and_request": "PASSED",
    "TestDeriveView.test_as_oldstyle_class_requestonly": "PASSED",
    "TestDeriveView.test_as_oldstyle_cls_context_request_attr_and_renderer": "PASSED",
    "TestDeriveView.test_as_oldstyle_cls_requestonly_attr_and_renderer": "PASSED",
    "TestDeriveView.test_attr_wrapped_view_branching_default_phash": "PASSED",
    "TestDeriveView.test_attr_wrapped_view_branching_nondefault_phash": "PASSED",
    "TestDeriveView.test_class_with_attr": "PASSED",
    "TestDeriveView.test_class_without_attr": "PASSED",
    "TestDeriveView.test_csrf_view_failed_on_explicit_exception_view": "PASSED",
    "TestDeriveView.test_csrf_view_fails_on_bad_POST_header": "PASSED",
    "TestDeriveView.test_csrf_view_fails_on_bad_POST_param": "PASSED",
    "TestDeriveView.test_csrf_view_fails_on_bad_PUT_header": "PASSED",
    "TestDeriveView.test_csrf_view_fails_on_bad_origin": "PASSED",
    "TestDeriveView.test_csrf_view_fails_on_bad_referrer": "PASSED",
    "TestDeriveView.test_csrf_view_https_domain": "PASSED",
    "TestDeriveView.test_csrf_view_ignores_GET": "PASSED",
    "TestDeriveView.test_csrf_view_passed_on_explicit_exception_view": "PASSED",
    "TestDeriveView.test_csrf_view_requires_bool_or_str_in_config_setting": "PASSED",
    "TestDeriveView.test_csrf_view_requires_bool_or_str_in_require_csrf": "PASSED",
    "TestDeriveView.test_csrf_view_requires_header": "PASSED",
    "TestDeriveView.test_csrf_view_requires_param": "PASSED",
    "TestDeriveView.test_csrf_view_skipped_by_default_on_exception_view": "PASSED",
    "TestDeriveView.test_csrf_view_uses_config_setting_falsey": "PASSED",
    "TestDeriveView.test_csrf_view_uses_config_setting_truthy": "PASSED",
    "TestDeriveView.test_csrf_view_uses_config_setting_when_view_option_is_true": "PASSED",
    "TestDeriveView.test_csrf_view_uses_config_setting_with_custom_token": "PASSED",
    "TestDeriveView.test_csrf_view_uses_view_option_override": "PASSED",
    "TestDeriveView.test_debug_auth_permission_authpol_denied": "PASSED",
    "TestDeriveView.test_debug_auth_permission_authpol_denied2": "PASSED",
    "TestDeriveView.test_debug_auth_permission_authpol_overridden": "PASSED",
    "TestDeriveView.test_debug_auth_permission_authpol_permitted": "PASSED",
    "TestDeriveView.test_debug_auth_permission_authpol_permitted_no_request": "PASSED",
    "TestDeriveView.test_function_returns_true_Response_no_renderer": "PASSED",
    "TestDeriveView.test_function_returns_true_Response_with_renderer": "PASSED",
    "TestDeriveView.test_http_cached_prevent_http_cache_in_settings": "PASSED",
    "TestDeriveView.test_http_cached_view_bad_tuple": "PASSED",
    "TestDeriveView.test_http_cached_view_integer": "PASSED",
    "TestDeriveView.test_http_cached_view_prevent_auto_set": "PASSED",
    "TestDeriveView.test_http_cached_view_timedelta": "PASSED",
    "TestDeriveView.test_http_cached_view_tuple": "PASSED",
    "TestDeriveView.test_http_cached_view_tuple_seconds_None": "PASSED",
    "TestDeriveView.test_predicate_mismatch_exception_has_text_in_detail": "PASSED",
    "TestDeriveView.test_predicate_mismatch_view_has_name": "PASSED",
    "TestDeriveView.test_predicate_mismatch_view_has_no_name": "PASSED",
    "TestDeriveView.test_requestonly_function": "PASSED",
    "TestDeriveView.test_requestonly_function_with_renderer": "PASSED",
    "TestDeriveView.test_requestonly_function_with_renderer_request_has_view": "PASSED",
    "TestDeriveView.test_requestonly_function_with_renderer_request_override": "PASSED",
    "TestDeriveView.test_secured_view_authn_policy_no_authz_policy": "PASSED",
    "TestDeriveView.test_secured_view_authz_policy_no_authn_policy": "PASSED",
    "TestDeriveView.test_secured_view_raises_forbidden_no_name": "PASSED",
    "TestDeriveView.test_secured_view_raises_forbidden_with_name": "PASSED",
    "TestDeriveView.test_with_debug_authorization_authn_policy_no_authz_policy": "PASSED",
    "TestDeriveView.test_with_debug_authorization_authz_policy_no_authn_policy": "PASSED",
    "TestDeriveView.test_with_debug_authorization_no_authpol": "PASSED",
    "TestDeriveView.test_with_debug_authorization_no_permission": "PASSED",
    "TestDeriveView.test_with_predicates_all": "PASSED",
    "TestDeriveView.test_with_predicates_checker": "PASSED",
    "TestDeriveView.test_with_predicates_notall": "PASSED",
    "TestDeriveView.test_with_view_mapper_config_specified": "PASSED",
    "TestDeriveView.test_with_view_mapper_default_mapper_specified": "PASSED",
    "TestDeriveView.test_with_view_mapper_view_specified": "PASSED",
    "TestDeriveView.test_with_wrapper_viewname": "PASSED",
    "TestDeriveView.test_with_wrapper_viewname_notfound": "PASSED",
    "TestDerivationOrder.test_right_order_implicit": "PASSED",
    "TestDerivationOrder.test_right_order_under_rendered_view": "PASSED",
    "TestDerivationOrder.test_right_order_under_rendered_view_others": "PASSED",
    "TestDerivationOrder.test_right_order_user_sorted": "PASSED",
    "TestAddDeriver.test_add_deriver_enforces_ingress_is_first": "PASSED",
    "TestAddDeriver.test_add_deriver_enforces_mapped_view_is_last": "PASSED",
    "TestAddDeriver.test_add_deriver_enforces_view_is_last": "PASSED",
    "TestAddDeriver.test_add_deriver_reserves_ingress": "PASSED",
    "TestAddDeriver.test_add_deriver_without_name": "PASSED",
    "TestAddDeriver.test_add_multi_derivers_ordered": "PASSED",
    "TestAddDeriver.test_add_single_deriver": "PASSED",
    "TestAddDeriver.test_override_deriver": "PASSED",
    "TestAddDeriver.test_override_mapped_view": "PASSED",
    "TestDeriverIntegration.test_unexpected_view_options": "PASSED",
    "TestDeriverIntegration.test_view_options": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_object_event_subscriber": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_default_resource_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_nodefault_resource_iface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_self": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_defaults": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_iface_specified": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_predicate": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_default_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_introspectables": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_nondefault_iface": "PASSED",
    "Test_eventonly.test_defaults": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_already_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_not_yet_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_missing_abspath": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_samename": "PASSED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_string_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_value": "PASSED",
    "TestOverrideProvider.test_has_resource_no_overrides": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_None": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_True": "PASSED",
    "TestOverrideProvider.test_resource_isdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_False": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_values": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_different_type": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_same_type": "PASSED",
    "TestPackageOverrides.test_ctor_registers_loader_type": "PASSED",
    "TestPackageOverrides.test_ctor_sets_loader": "PASSED",
    "TestPackageOverrides.test_ctor_sets_local_state": "PASSED",
    "TestPackageOverrides.test_filtered_sources": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_filename": "PASSED",
    "TestPackageOverrides.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_stream": "PASSED",
    "TestPackageOverrides.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_string": "PASSED",
    "TestPackageOverrides.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_has_resource": "PASSED",
    "TestPackageOverrides.test_has_resource_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_insert_directory": "PASSED",
    "TestPackageOverrides.test_insert_emptystring": "PASSED",
    "TestPackageOverrides.test_insert_file": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_isdir_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_isdir_false": "PASSED",
    "TestPackageOverrides.test_isdir_true": "PASSED",
    "TestPackageOverrides.test_listdir": "PASSED",
    "TestPackageOverrides.test_listdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists": "PASSED",
    "TestPackageAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream": "PASSED",
    "TestPackageAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_string": "PASSED",
    "TestPackageAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_string_with_prefix": "PASSED",
    "TestPackageAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_isdir_false": "PASSED",
    "TestPackageAssetSource.test_isdir_true": "PASSED",
    "TestPackageAssetSource.test_listdir": "PASSED",
    "TestPackageAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists": "PASSED",
    "TestFSAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_filename": "PASSED",
    "TestFSAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_filename_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_stream": "PASSED",
    "TestFSAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_string": "PASSED",
    "TestFSAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_string_with_prefix": "PASSED",
    "TestFSAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_isdir_false": "PASSED",
    "TestFSAssetSource.test_isdir_true": "PASSED",
    "TestFSAssetSource.test_listdir": "PASSED",
    "TestFSAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestDirectoryOverride.test_it_match": "PASSED",
    "TestDirectoryOverride.test_it_no_match": "PASSED",
    "TestFileOverride.test_it_match": "PASSED",
    "TestFileOverride.test_it_no_match": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_and_no_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_conflict": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_text_type_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_response_factory": "PASSED",
    "TestFactoriesMixin.test_set_response_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "PASSED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties_conflict": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_callable": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_property": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_unnamed_callable": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test___getattr__matches": "PASSED",
    "ConfiguratorTests.test___getattr__matches_no_action_wrap": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_dont_exist": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_exist": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds__lock": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds_clear_view_lookup_cache": "PASSED",
    "ConfiguratorTests.test__fix_registry_has_listeners": "PASSED",
    "ConfiguratorTests.test__fix_registry_notify": "PASSED",
    "ConfiguratorTests.test__fix_registry_queryAdapterOrSelf": "PASSED",
    "ConfiguratorTests.test__fix_registry_registerSelfAdapter": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_already_absolute": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_notastring": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_relative": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_None": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_not_None": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ConfiguratorTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_autocommit_no_conflicts": "PASSED",
    "ConfiguratorTests.test_begin": "PASSED",
    "ConfiguratorTests.test_begin_with_request": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ConfiguratorTests.test_commit_conflict_simple": "PASSED",
    "ConfiguratorTests.test_commit_conflict_with_two_includes": "PASSED",
    "ConfiguratorTests.test_conflict_set_forbidden_view": "PASSED",
    "ConfiguratorTests.test_conflict_set_notfound_view": "PASSED",
    "ConfiguratorTests.test_ctor_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_authentication_policy": "PASSED",
    "ConfiguratorTests.test_ctor_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_ctor_default_permission": "PASSED",
    "ConfiguratorTests.test_ctor_default_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_default_view_mapper": "PASSED",
    "ConfiguratorTests.test_ctor_default_webob_response_adapter_registered": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_None": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_custom": "PASSED",
    "ConfiguratorTests.test_ctor_httpexception_view_default": "PASSED",
    "ConfiguratorTests.test_ctor_no_root_factory": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_custom_settings": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_ctor_session_factory": "PASSED",
    "ConfiguratorTests.test_ctor_with_introspection": "PASSED",
    "ConfiguratorTests.test_ctor_with_package_registry": "PASSED",
    "ConfiguratorTests.test_ctor_with_root_factory": "PASSED",
    "ConfiguratorTests.test_end": "PASSED",
    "ConfiguratorTests.test_hook_zca": "PASSED",
    "ConfiguratorTests.test_include_with_dotted_name": "PASSED",
    "ConfiguratorTests.test_include_with_missing_source_file": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme_missing": "PASSED",
    "ConfiguratorTests.test_include_with_nested_route_prefix": "PASSED",
    "ConfiguratorTests.test_include_with_python_callable": "PASSED",
    "ConfiguratorTests.test_include_with_route_prefix": "PASSED",
    "ConfiguratorTests.test_introspector_decorator": "PASSED",
    "ConfiguratorTests.test_make_wsgi_app": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_notstring_success": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_fail": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_success": "PASSED",
    "ConfiguratorTests.test_scan_integration": "PASSED",
    "ConfiguratorTests.test_scan_integration_dottedname_package": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_extra_kw": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_ignore": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_onerror": "PASSED",
    "ConfiguratorTests.test_setup_registry_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_setup_registry_calls_fix_registry": "PASSED",
    "ConfiguratorTests.test_setup_registry_custom_settings": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_name": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_setup_registry_default_permission": "PASSED",
    "ConfiguratorTests.test_setup_registry_dottedname_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_explicit_notfound_trumps_iexceptionresponse": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes_spaces": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_no_default_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_exceptionresponse_views": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_view_predicates": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_webob_iresponse_adapter": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_response_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_tweens": "PASSED",
    "ConfiguratorTests.test_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "PASSED",
    "ConfiguratorTests.test_with_package_module": "PASSED",
    "ConfiguratorTests.test_with_package_package": "PASSED",
    "TestConfigurator_add_directive.test_directive_persists_across_configurator_creations": "PASSED",
    "TestConfigurator_add_directive.test_extend_action_method_successful": "PASSED",
    "TestConfigurator_add_directive.test_extend_same_name_doesnt_conflict": "PASSED",
    "TestConfigurator__add_predicate.test_factory_as_object": "PASSED",
    "TestActionState.test_action_simple": "PASSED",
    "TestActionState.test_action_with_includepath": "PASSED",
    "TestActionState.test_action_with_includepath_and_info": "PASSED",
    "TestActionState.test_action_with_info": "PASSED",
    "TestActionState.test_action_with_introspectables": "PASSED",
    "TestActionState.test_action_with_order": "PASSED",
    "TestActionState.test_execute_actions_dicts": "PASSED",
    "TestActionState.test_execute_actions_error": "PASSED",
    "TestActionState.test_execute_actions_tuples": "PASSED",
    "TestActionState.test_execute_actions_with_introspectable_no_callable": "PASSED",
    "TestActionState.test_execute_actions_with_introspectables": "PASSED",
    "TestActionState.test_it": "PASSED",
    "TestActionState.test_processSpec": "PASSED",
    "TestActionState.test_reentrant_action": "PASSED",
    "TestActionState.test_reentrant_action_error": "PASSED",
    "TestActionState.test_reentrant_action_without_clear": "PASSED",
    "Test_reentrant_action_functional.test_functional": "PASSED",
    "Test_resolveConflicts.test_it_conflict": "PASSED",
    "Test_resolveConflicts.test_it_success_dicts": "PASSED",
    "Test_resolveConflicts.test_it_success_tuples": "PASSED",
    "Test_resolveConflicts.test_it_with_actions_grouped_by_order": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "PASSED",
    "TestXHRPredicate.test___call___false": "PASSED",
    "TestXHRPredicate.test___call___true": "PASSED",
    "TestXHRPredicate.test_phash": "PASSED",
    "TestXHRPredicate.test_text": "PASSED",
    "TestRequestMethodPredicate.test___call___false": "PASSED",
    "TestRequestMethodPredicate.test___call___true_multi": "PASSED",
    "TestRequestMethodPredicate.test___call___true_single": "PASSED",
    "TestRequestMethodPredicate.test_ctor_get_but_no_head": "PASSED",
    "TestRequestMethodPredicate.test_phash": "PASSED",
    "TestRequestMethodPredicate.test_text": "PASSED",
    "TestPathInfoPredicate.test___call___false": "PASSED",
    "TestPathInfoPredicate.test___call___true": "PASSED",
    "TestPathInfoPredicate.test_ctor_compilefail": "PASSED",
    "TestPathInfoPredicate.test_phash": "PASSED",
    "TestPathInfoPredicate.test_text": "PASSED",
    "TestRequestParamPredicate.test___call___false": "PASSED",
    "TestRequestParamPredicate.test___call___false_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_exists": "PASSED",
    "TestRequestParamPredicate.test___call___true_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_withval": "PASSED",
    "TestRequestParamPredicate.test_phash_exists": "PASSED",
    "TestRequestParamPredicate.test_phash_exists_equal_sign": "PASSED",
    "TestRequestParamPredicate.test_phash_withval": "PASSED",
    "TestRequestParamPredicate.test_text_exists": "PASSED",
    "TestRequestParamPredicate.test_text_exists_equal_sign": "PASSED",
    "TestRequestParamPredicate.test_text_multi": "PASSED",
    "TestRequestParamPredicate.test_text_multi_equal_sign": "PASSED",
    "TestRequestParamPredicate.test_text_withval": "PASSED",
    "TestMatchParamPredicate.test___call___false": "PASSED",
    "TestMatchParamPredicate.test___call___matchdict_is_None": "PASSED",
    "TestMatchParamPredicate.test___call___true_multi": "PASSED",
    "TestMatchParamPredicate.test___call___true_single": "PASSED",
    "TestMatchParamPredicate.test_phash": "PASSED",
    "TestMatchParamPredicate.test_text": "PASSED",
    "TestCustomPredicate.test___call___false": "PASSED",
    "TestCustomPredicate.test___call___true": "PASSED",
    "TestCustomPredicate.test_phash": "PASSED",
    "TestCustomPredicate.test_text_func_has___text__": "PASSED",
    "TestCustomPredicate.test_text_func_repr": "PASSED",
    "TestTraversePredicate.test___call__traverse_has_remainder_already": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches_with_highorder_chars": "PASSED",
    "TestTraversePredicate.test_phash": "PASSED",
    "TestTraversePredicate.test_text": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_False": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_True": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_str": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_phash": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_text": "PASSED",
    "TestHeaderPredicate.test___call___false": "PASSED",
    "TestHeaderPredicate.test___call___false_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_exists": "PASSED",
    "TestHeaderPredicate.test___call___true_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_withval": "PASSED",
    "TestHeaderPredicate.test_phash_exists": "PASSED",
    "TestHeaderPredicate.test_phash_withregex": "PASSED",
    "TestHeaderPredicate.test_phash_withval": "PASSED",
    "TestHeaderPredicate.test_text_exists": "PASSED",
    "TestHeaderPredicate.test_text_withregex": "PASSED",
    "TestHeaderPredicate.test_text_withval": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_False": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_context_has_no_name": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_list_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_str_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_tuple_True": "PASSED",
    "Test_PhysicalPathPredicate.test_phash": "PASSED",
    "Test_PhysicalPathPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_doesnt_provide_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset_implicit": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_no_authentication_policy": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_phash": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text_noniter": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_default_renderers": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer_dottedname_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_defaults": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_discriminator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_path_no_pattern": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_pattern_with_path": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_attr": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_context": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_permission": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_renderer": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_accept": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_highorder": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_regex": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_pregenerator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_method": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_param": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_xhr": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_already_registered": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_not_yet_registered": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_add_permission": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_permission": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_None": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_already_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_not_yet_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_nosettings": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_withsettings": "PASSED",
    "TestSettings.test_debug_all": "PASSED",
    "TestSettings.test_debug_authorization": "PASSED",
    "TestSettings.test_debug_notfound": "PASSED",
    "TestSettings.test_debug_routematch": "PASSED",
    "TestSettings.test_debug_templates": "PASSED",
    "TestSettings.test_default_locale_name": "PASSED",
    "TestSettings.test_getattr_fail": "PASSED",
    "TestSettings.test_getattr_raises_attribute_error": "PASSED",
    "TestSettings.test_getattr_success": "PASSED",
    "TestSettings.test_noargs": "PASSED",
    "TestSettings.test_originals_kept": "PASSED",
    "TestSettings.test_prevent_cachebust": "PASSED",
    "TestSettings.test_prevent_http_cache": "PASSED",
    "TestSettings.test_reload_all": "PASSED",
    "TestSettings.test_reload_assets": "PASSED",
    "TestSettings.test_reload_resources": "PASSED",
    "TestSettings.test_reload_templates": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_explicitrenderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_twice": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_defaults": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_multiple": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_single": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_template": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_resources": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_forget_result": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_remember_result": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_dottedname": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_instance": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_unsuitable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_conflict": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_distinct": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "PASSED",
    "TestTweens.test___call___explicit": "PASSED",
    "TestTweens.test___call___implicit": "PASSED",
    "TestTweens.test_add_explicit": "PASSED",
    "TestTweens.test_add_implicit": "PASSED",
    "TestTweens.test_implicit_ordering_1": "PASSED",
    "TestTweens.test_implicit_ordering_2": "PASSED",
    "TestTweens.test_implicit_ordering_3": "PASSED",
    "TestTweens.test_implicit_ordering_4": "PASSED",
    "TestTweens.test_implicit_ordering_5": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_direct": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_indirect": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_and_under_partials": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_with_missing_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_multiple_matching_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_partial_fallbacks": "PASSED",
    "TestPredicateList.test_custom_predicates_can_affect_traversal": "PASSED",
    "TestPredicateList.test_different_custom_predicates_with_same_hash": "PASSED",
    "TestPredicateList.test_match_param_from_dict": "PASSED",
    "TestPredicateList.test_match_param_from_dict_fails": "PASSED",
    "TestPredicateList.test_match_param_from_string": "PASSED",
    "TestPredicateList.test_match_param_from_string_fails": "PASSED",
    "TestPredicateList.test_notted": "PASSED",
    "TestPredicateList.test_ordering_importance_and_number": "PASSED",
    "TestPredicateList.test_ordering_importance_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_number_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_xhr_and_request_method_trump_only_containment": "PASSED",
    "TestPredicateList.test_predicate_text_is_correct": "PASSED",
    "TestPredicateList.test_request_method_ordering_hashes_same": "PASSED",
    "TestPredicateList.test_request_method_sequence": "PASSED",
    "TestPredicateList.test_traverse_has_remainder_already": "PASSED",
    "TestPredicateList.test_traverse_matches": "PASSED",
    "TestPredicateList.test_traverse_matches_with_highorder_chars": "PASSED",
    "TestPredicateList.test_unknown_predicate": "PASSED",
    "Test_takes_one_arg.test_function_annotations": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_function_noargs": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_function_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_false": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_true": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_instance_nocall": "PASSED",
    "Test_takes_one_arg.test_instance_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_method_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_firstname_request_with_secondname": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_no_init": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_no_init": "PASSED",
    "TestNotted.test_it_with_phash_val": "PASSED",
    "TestNotted.test_it_without_phash_val": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash_custom_response": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_absolute": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_here_no_utility_registered": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_package_relative": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_class_method_no_attr": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_trumps_for": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_more_preds_first_bests_fewer_preds_last": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_mulview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for__as_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_mixed_case_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview___discriminator__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_call_ordering": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_context_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_exception_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_no_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_check_csrf_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_param": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator_tuple": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_missing_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name_unicode": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_no_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_nonexistant_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_get_implies_head": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_and_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_noniface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name_exception": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_introspector_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_no_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_with_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_conflicts": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_doesnt_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_wrapped_view_is_decorated": "PASSED",
    "TestViewsConfigurationMixin.test_add_views_with_accept_multiview_replaces_existing": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_function": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_no_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_with_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate_with_mismatch": "PASSED",
    "Test_requestonly.test_defaults": "PASSED",
    "Test_requestonly.test_otherattr": "PASSED",
    "Test_isexception.test_is_IException": "PASSED",
    "Test_isexception.test_is_IException_subinterface": "PASSED",
    "Test_isexception.test_is_exception_class": "PASSED",
    "Test_isexception.test_is_exception_instance": "PASSED",
    "TestMultiView.test___call__": "PASSED",
    "TestMultiView.test___call__intermediate_not_found": "PASSED",
    "TestMultiView.test___call__raise_not_found_isnt_interpreted_as_pred_mismatch": "PASSED",
    "TestMultiView.test___call_permissive_has_call_permissive": "PASSED",
    "TestMultiView.test___call_permissive_has_no_call_permissive": "PASSED",
    "TestMultiView.test__call__not_found": "PASSED",
    "TestMultiView.test__call__with_accept_match": "PASSED",
    "TestMultiView.test__call__with_accept_miss": "PASSED",
    "TestMultiView.test__call_permissive__not_found": "PASSED",
    "TestMultiView.test_add": "PASSED",
    "TestMultiView.test_add_with_phash": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept2": "PASSED",
    "TestMultiView.test_class_implements_ISecuredView": "PASSED",
    "TestMultiView.test_get_views": "PASSED",
    "TestMultiView.test_get_views_best_match_returns_None": "PASSED",
    "TestMultiView.test_get_views_no_self_accepts": "PASSED",
    "TestMultiView.test_get_views_request_has_no_accept": "PASSED",
    "TestMultiView.test_instance_implements_ISecuredView": "PASSED",
    "TestMultiView.test_match_not_found": "PASSED",
    "TestMultiView.test_match_predicate_fails": "PASSED",
    "TestMultiView.test_match_predicate_succeeds": "PASSED",
    "TestMultiView.test_multiple_with_functions_as_views": "PASSED",
    "TestMultiView.test_permitted": "PASSED",
    "TestMultiView.test_permitted_no_match_with__permitted__": "PASSED",
    "TestMultiView.test_permitted_no_views": "PASSED",
    "TestDefaultViewMapper.test__view_as_function_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request_and_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly_with_attr": "PASSED",
    "Test_preserve_view_attrs.test_it_different": "PASSED",
    "Test_preserve_view_attrs.test_it_different_with_existing_original_view": "PASSED",
    "Test_preserve_view_attrs.test_it_same": "PASSED",
    "Test_preserve_view_attrs.test_it_view_is_None": "PASSED",
    "TestStaticURLInfo.test_add_already_exists": "PASSED",
    "TestStaticURLInfo.test_add_cachebust_prevented": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_abspath": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_for_more_specific_path": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite_explicit": "PASSED",
    "TestStaticURLInfo.test_add_package_root": "PASSED",
    "TestStaticURLInfo.test_add_url_noendslash": "PASSED",
    "TestStaticURLInfo.test_add_url_noscheme": "PASSED",
    "TestStaticURLInfo.test_add_url_withendslash": "PASSED",
    "TestStaticURLInfo.test_add_viewname": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_context": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_for_": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_permission": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_renderer": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_route_prefix": "PASSED",
    "TestStaticURLInfo.test_generate_missing": "PASSED",
    "TestStaticURLInfo.test_generate_quoting": "PASSED",
    "TestStaticURLInfo.test_generate_registration_miss": "PASSED",
    "TestStaticURLInfo.test_generate_route_url": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name1": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name2": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_abspath": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_nomatch": "PASSED",
    "TestStaticURLInfo.test_generate_url_quoted_remote": "PASSED",
    "TestStaticURLInfo.test_generate_url_unquoted_local": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_anchor": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_query": "PASSED",
    "TestStaticURLInfo.test_verifyClass": "PASSED",
    "TestStaticURLInfo.test_verifyObject": "PASSED",
    "Test_view_description.test_with_text": "PASSED",
    "Test_logging_file_config.test_it": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "PASSED",
    "TestPCreateCommand.test_confirm_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_site_name": "PASSED",
    "TestPCreateCommand.test_known_scaffold_absolute_path": "PASSED",
    "TestPCreateCommand.test_known_scaffold_multiple_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_single_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_with_path_as_project_target_rendered": "PASSED",
    "TestPCreateCommand.test_no_project_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_no_args": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_exist": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_none_exist": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_hyphen_in_project_name": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_unparsable_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_version": "PASSED",
    "TestPCreateCommand.test_unknown_scaffold_name": "PASSED",
    "Test_main.test_it": "PASSED",
    "TestPDistReportCommand.test_no_dists": "PASSED",
    "TestPDistReportCommand.test_with_dists": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_method_configures_logging": "PASSED",
    "TestPRequestCommand.test_command_not_enough_args": "PASSED",
    "TestPRequestCommand.test_command_response_has_no_charset": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_bad_format": "PASSED",
    "TestPRoutesCommand.test_good_args": "PASSED",
    "TestPRoutesCommand.test_good_format": "PASSED",
    "TestPRoutesCommand.test_no_mapper": "PASSED",
    "TestPRoutesCommand.test_no_routes": "PASSED",
    "TestPRoutesCommand.test_route_as_wsgiapp": "PASSED",
    "TestPRoutesCommand.test_route_no_view": "PASSED",
    "TestPRoutesCommand.test_route_with_no_slash_prefix": "PASSED",
    "TestPRoutesCommand.test_single_route_multiview_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_route_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_views_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_one_view_registered_with_factory": "PASSED",
    "TestPRoutesCommand.test_static_routes_included_in_list": "PASSED",
    "TestPServeCommand.test_get_options_no_command": "PASSED",
    "TestPServeCommand.test_get_options_with_command": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_record_pid_not_verbose": "PASSED",
    "TestPServeCommand.test_record_pid_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_current_pid_is_not_pid_in_file": "PASSED",
    "TestPServeCommand.test_remove_pid_current_pid_is_not_written_pid": "PASSED",
    "TestPServeCommand.test_remove_pid_file_not_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_file_stale_pid_write_exception": "PASSED",
    "TestPServeCommand.test_remove_pid_file_unlink_exception": "PASSED",
    "TestPServeCommand.test_remove_pid_file_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_no_pid_file": "PASSED",
    "TestPServeCommand.test_remove_pid_not_a_number": "PASSED",
    "TestPServeCommand.test_run_no_args": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_bad_pid_file": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_invalid_pid_in_file": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_no_such_pid_file": "PASSED",
    "Test_read_pidfile.test_read_pidfile": "PASSED",
    "Test_read_pidfile.test_read_pidfile_no_pid_file": "PASSED",
    "Test_read_pidfile.test_read_pidfile_not_a_number": "PASSED",
    "TestLazyWriter.test_flush": "PASSED",
    "TestLazyWriter.test_open": "PASSED",
    "TestLazyWriter.test_write": "PASSED",
    "TestLazyWriter.test_writeline": "PASSED",
    "Test__methodwrapper.test___call__fail": "PASSED",
    "Test__methodwrapper.test___call__succeed": "PASSED",
    "TestPShellCommand.test_command_custom_section_override": "PASSED",
    "TestPShellCommand.test_command_default_shell_option": "PASSED",
    "TestPShellCommand.test_command_errors_with_unknown_shell": "PASSED",
    "TestPShellCommand.test_command_loads_check_variable_override_order": "PASSED",
    "TestPShellCommand.test_command_loads_custom_items": "PASSED",
    "TestPShellCommand.test_command_loads_default_shell": "PASSED",
    "TestPShellCommand.test_command_loads_ipython": "PASSED",
    "TestPShellCommand.test_command_loads_pythonstartup": "PASSED",
    "TestPShellCommand.test_command_loads_setup_from_options": "PASSED",
    "TestPShellCommand.test_command_setup": "PASSED",
    "TestPShellCommand.test_list_shells": "PASSED",
    "TestPShellCommand.test_shell_entry_points": "PASSED",
    "TestPShellCommand.test_shell_ordering": "PASSED",
    "TestPShellCommand.test_shell_override": "PASSED",
    "Test_python_shell_runner.test_it": "PASSED",
    "TestPTweensCommand.test__get_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_and_explicit_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_tweens_only": "PASSED",
    "TestPTweensCommand.test_command_no_tweens": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_all_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_none_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_some_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match_multiview_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview_no_view_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_no_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_traversal": "PASSED",
    "TestPViewsCommand.test__find_view_traversal_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_multi_view_nested": "PASSED",
    "TestPViewsCommand.test_views_command_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_not_found": "PASSED",
    "TestPViewsCommand.test_views_command_not_found_url_starts_without_slash": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route_with_route_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_predicates": "PASSED",
    "TestDeriveView.test_as_instance_requestonly": "FAILED",
    "TestDeriveView.test_function_returns_non_adaptable": "FAILED",
    "TestDeriveView.test_function_returns_non_adaptable_dict": "FAILED",
    "TestDeriveView.test_instance_returns_non_adaptable": "FAILED",
    "TestDeriveView.test_requestonly_default_method_returns_non_adaptable": "FAILED",
    "TestDeriveView.test_requestonly_nondefault_method_returns_non_adaptable": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_package": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_file": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_package": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_no_overrides": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_None": "FAILED",
    "TestPackageAssetSource.test_get_filename": "FAILED",
    "TestPackageAssetSource.test_get_filename_with_prefix": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_abspath": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls": "FAILED",
    "ConfiguratorTests.test_ctor_no_registry": "FAILED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_include_constant_root_package": "FAILED",
    "ConfiguratorTests.test_scan_integration_conflict": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_custom_callable": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_partial": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_dotted_name": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_python_callable": "FAILED",
    "TestConfigurator__add_predicate.test_factory_as_dotted_name": "FAILED",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestStaticURLInfo.test_generate_url_cachebust_with_overrides": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRequestCommand.test_command_display_headers": "FAILED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_good_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "FAILED",
    "TestPRequestCommand.test_command_method_get": "FAILED",
    "TestPRequestCommand.test_command_method_options": "FAILED",
    "TestPRequestCommand.test_command_method_patch": "FAILED",
    "TestPRequestCommand.test_command_method_post": "FAILED",
    "TestPRequestCommand.test_command_method_propfind": "FAILED",
    "TestPRequestCommand.test_command_method_put": "FAILED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "FAILED",
    "TestPRequestCommand.test_command_two_args": "FAILED",
    "TestPRequestCommand.test_command_w_basic_auth": "FAILED",
    "TestPRequestCommand.test_command_with_query_string": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_commas": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_newlines": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_spaces": "FAILED",
    "TestPRoutesCommand.test_one_route_all_methods_view_only_post": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_all_methods": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_post_and_get": "FAILED",
    "TestPRoutesCommand.test_one_route_with_long_name_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_route_is_get_view_request_method_not_post": "FAILED",
    "TestPRoutesCommand.test_route_request_method_mismatch": "FAILED",
    "TestPRoutesCommand.test_route_static_views": "FAILED",
    "TestPRoutesCommand.test_single_route_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_view_glob": "FAILED",
    "TestPRoutesCommand.test_view_request_method_not_post": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED"
}
diff --git a/pyramid/viewderivers.py b/pyramid/viewderivers.py
index d9d9c2904..fbe7cd660 100644
--- a/pyramid/viewderivers.py
+++ b/pyramid/viewderivers.py
@@ -483,21 +483,29 @@ def csrf_view(view, info):
     default_val = _parse_csrf_setting(
         info.settings.get('pyramid.require_default_csrf'),
         'Config setting "pyramid.require_default_csrf"')
-    val = _parse_csrf_setting(
+    explicit_val = _parse_csrf_setting(
         info.options.get('require_csrf'),
         'View option "require_csrf"')
-    if (val is True and default_val) or val is None:
-        val = default_val
-    if val is True:
-        val = 'csrf_token'
+    resolved_val = explicit_val
+    if (explicit_val is True and default_val) or explicit_val is None:
+        resolved_val = default_val
+    if resolved_val is True:
+        resolved_val = 'csrf_token'
     wrapped_view = view
-    if val:
+    if resolved_val:
         def csrf_view(context, request):
             # Assume that anything not defined as 'safe' by RFC2616 needs
             # protection
-            if request.method not in SAFE_REQUEST_METHODS:
+            if (
+                request.method not in SAFE_REQUEST_METHODS and
+                (
+                    # skip exception views unless value is explicitly defined
+                    getattr(request, 'exception', None) is None or
+                    explicit_val is not None
+                )
+            ):
                 check_csrf_origin(request, raises=True)
-                check_csrf_token(request, val, raises=True)
+                check_csrf_token(request, resolved_val, raises=True)
             return view(context, request)
         wrapped_view = csrf_view
     return wrapped_view
 

{"pyramid/viewderivers.py": "import inspect\n\nfrom zope.interface import (\n    implementer,\n    provider,\n    )\n\nfrom pyramid.security import NO_PERMISSION_REQUIRED\nfrom pyramid.session import (\n    check_csrf_origin,\n    check_csrf_token,\n)\nfrom pyramid.response import Response\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    IDebugLogger,\n    IResponse,\n    IViewMapper,\n    IViewMapperFactory,\n    )\n\nfrom pyramid.compat import (\n    string_types,\n    is_bound_method,\n    is_unbound_method,\n    )\n\nfrom pyramid.config.util import (\n    DEFAULT_PHASH,\n    MAX_ORDER,\n    takes_one_arg,\n    )\n\nfrom pyramid.exceptions import (\n    ConfigurationError,\n    PredicateMismatch,\n    )\nfrom pyramid.httpexceptions import HTTPForbidden\nfrom pyramid.settings import (\n    falsey,\n    truthy,\n)\nfrom pyramid.util import object_description\nfrom pyramid.view import render_view_to_response\nfrom pyramid import renderers\n\n\ndef view_description(view):\n    try:\n        return view.__text__\n    except AttributeError:\n        # custom view mappers might not add __text__\n        return object_description(view)\n\ndef requestonly(view, attr=None):\n    return takes_one_arg(view, attr=attr, argname='request')\n\n@implementer(IViewMapper)\n@provider(IViewMapperFactory)\nclass DefaultViewMapper(object):\n    def __init__(self, **kw):\n        self.attr = kw.get('attr')\n\n    def __call__(self, view):\n        if is_unbound_method(view) and self.attr is None:\n            raise ConfigurationError((\n                'Unbound method calls are not supported, please set the class '\n                'as your `view` and the method as your `attr`'\n            ))\n\n        if inspect.isclass(view):\n            view = self.map_class(view)\n        else:\n            view = self.map_nonclass(view)\n        return view\n\n    def map_class(self, view):\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_class_requestonly(view)\n        else:\n            mapped_view = self.map_class_native(view)\n        mapped_view.__text__ = 'method %s of %s' % (\n            self.attr or '__call__', object_description(view))\n        return mapped_view\n\n    def map_nonclass(self, view):\n        # We do more work here than appears necessary to avoid wrapping the\n        # view unless it actually requires wrapping (to avoid function call\n        # overhead).\n        mapped_view = view\n        ronly = requestonly(view, self.attr)\n        if ronly:\n            mapped_view = self.map_nonclass_requestonly(view)\n        elif self.attr:\n            mapped_view = self.map_nonclass_attr(view)\n        if inspect.isroutine(mapped_view):\n            # This branch will be true if the view is a function or a method.\n            # We potentially mutate an unwrapped object here if it's a\n            # function.  We do this to avoid function call overhead of\n            # injecting another wrapper.  However, we must wrap if the\n            # function is a bound method because we can't set attributes on a\n            # bound method.\n            if is_bound_method(view):\n                _mapped_view = mapped_view\n                def mapped_view(context, request):\n                    return _mapped_view(context, request)\n            if self.attr is not None:\n                mapped_view.__text__ = 'attr %s of %s' % (\n                    self.attr, object_description(view))\n            else:\n                mapped_view.__text__ = object_description(view)\n        return mapped_view\n\n    def map_class_requestonly(self, view):\n        # its a class that has an __init__ which only accepts request\n        attr = self.attr\n        def _class_requestonly_view(context, request):\n            inst = view(request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_requestonly_view\n\n    def map_class_native(self, view):\n        # its a class that has an __init__ which accepts both context and\n        # request\n        attr = self.attr\n        def _class_view(context, request):\n            inst = view(context, request)\n            request.__view__ = inst\n            if attr is None:\n                response = inst()\n            else:\n                response = getattr(inst, attr)()\n            return response\n        return _class_view\n\n    def map_nonclass_requestonly(self, view):\n        # its a function that has a __call__ which accepts only a single\n        # request argument\n        attr = self.attr\n        def _requestonly_view(context, request):\n            if attr is None:\n                response = view(request)\n            else:\n                response = getattr(view, attr)(request)\n            return response\n        return _requestonly_view\n\n    def map_nonclass_attr(self, view):\n        # its a function that has a __call__ which accepts both context and\n        # request, but still has an attr\n        def _attr_view(context, request):\n            response = getattr(view, self.attr)(context, request)\n            return response\n        return _attr_view\n\n\ndef wraps_view(wrapper):\n    def inner(view, info):\n        wrapper_view = wrapper(view, info)\n        return preserve_view_attrs(view, wrapper_view)\n    return inner\n\ndef preserve_view_attrs(view, wrapper):\n    if view is None:\n        return wrapper\n\n    if wrapper is view:\n        return view\n\n    original_view = getattr(view, '__original_view__', None)\n\n    if original_view is None:\n        original_view = view\n\n    wrapper.__wraps__ = view\n    wrapper.__original_view__ = original_view\n    wrapper.__module__ = view.__module__\n    wrapper.__doc__ = view.__doc__\n\n    try:\n        wrapper.__name__ = view.__name__\n    except AttributeError:\n        wrapper.__name__ = repr(view)\n\n    # attrs that may not exist on \"view\", but, if so, must be attached to\n    # \"wrapped view\"\n    for attr in ('__permitted__', '__call_permissive__', '__permission__',\n                 '__predicated__', '__predicates__', '__accept__',\n                 '__order__', '__text__'):\n        try:\n            setattr(wrapper, attr, getattr(view, attr))\n        except AttributeError:\n            pass\n\n    return wrapper\n\ndef mapped_view(view, info):\n    mapper = info.options.get('mapper')\n    if mapper is None:\n        mapper = getattr(view, '__view_mapper__', None)\n        if mapper is None:\n            mapper = info.registry.queryUtility(IViewMapperFactory)\n            if mapper is None:\n                mapper = DefaultViewMapper\n\n    mapped_view = mapper(**info.options)(view)\n    return mapped_view\n\nmapped_view.options = ('mapper', 'attr')\n\ndef owrapped_view(view, info):\n    wrapper_viewname = info.options.get('wrapper')\n    viewname = info.options.get('name')\n    if not wrapper_viewname:\n        return view\n    def _owrapped_view(context, request):\n        response = view(context, request)\n        request.wrapped_response = response\n        request.wrapped_body = response.body\n        request.wrapped_view = view\n        wrapped_response = render_view_to_response(context, request,\n                                                   wrapper_viewname)\n        if wrapped_response is None:\n            raise ValueError(\n                'No wrapper view named %r found when executing view '\n                'named %r' % (wrapper_viewname, viewname))\n        return wrapped_response\n    return _owrapped_view\n\nowrapped_view.options = ('name', 'wrapper')\n\ndef http_cached_view(view, info):\n    if info.settings.get('prevent_http_cache', False):\n        return view\n\n    seconds = info.options.get('http_cache')\n\n    if seconds is None:\n        return view\n\n    options = {}\n\n    if isinstance(seconds, (tuple, list)):\n        try:\n            seconds, options = seconds\n        except ValueError:\n            raise ConfigurationError(\n                'If http_cache parameter is a tuple or list, it must be '\n                'in the form (seconds, options); not %s' % (seconds,))\n\n    def wrapper(context, request):\n        response = view(context, request)\n        prevent_caching = getattr(response.cache_control, 'prevent_auto',\n                                  False)\n        if not prevent_caching:\n            response.cache_expires(seconds, **options)\n        return response\n\n    return wrapper\n\nhttp_cached_view.options = ('http_cache',)\n\ndef secured_view(view, info):\n    for wrapper in (_secured_view, _authdebug_view):\n        view = wraps_view(wrapper)(view, info)\n    return view\n\nsecured_view.options = ('permission',)\n\ndef _secured_view(view, info):\n    permission = info.options.get('permission')\n    if permission == NO_PERMISSION_REQUIRED:\n        # allow views registered within configurations that have a\n        # default permission to explicitly override the default\n        # permission, replacing it with no permission at all\n        permission = None\n\n    wrapped_view = view\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n\n    if authn_policy and authz_policy and (permission is not None):\n        def _permitted(context, request):\n            principals = authn_policy.effective_principals(request)\n            return authz_policy.permits(context, principals, permission)\n        def _secured_view(context, request):\n            result = _permitted(context, request)\n            if result:\n                return view(context, request)\n            view_name = getattr(view, '__name__', view)\n            msg = getattr(\n                request, 'authdebug_message',\n                'Unauthorized: %s failed permission check' % view_name)\n            raise HTTPForbidden(msg, result=result)\n        _secured_view.__call_permissive__ = view\n        _secured_view.__permitted__ = _permitted\n        _secured_view.__permission__ = permission\n        wrapped_view = _secured_view\n\n    return wrapped_view\n\ndef _authdebug_view(view, info):\n    wrapped_view = view\n    settings = info.settings\n    permission = info.options.get('permission')\n    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)\n    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)\n    logger = info.registry.queryUtility(IDebugLogger)\n    if settings and settings.get('debug_authorization', False):\n        def _authdebug_view(context, request):\n            view_name = getattr(request, 'view_name', None)\n\n            if authn_policy and authz_policy:\n                if permission is NO_PERMISSION_REQUIRED:\n                    msg = 'Allowed (NO_PERMISSION_REQUIRED)'\n                elif permission is None:\n                    msg = 'Allowed (no permission registered)'\n                else:\n                    principals = authn_policy.effective_principals(request)\n                    msg = str(authz_policy.permits(\n                        context, principals, permission))\n            else:\n                msg = 'Allowed (no authorization policy in use)'\n\n            view_name = getattr(request, 'view_name', None)\n            url = getattr(request, 'url', None)\n            msg = ('debug_authorization of url %s (view name %r against '\n                   'context %r): %s' % (url, view_name, context, msg))\n            if logger:\n                logger.debug(msg)\n            if request is not None:\n                request.authdebug_message = msg\n            return view(context, request)\n\n        wrapped_view = _authdebug_view\n\n    return wrapped_view\n\ndef predicated_view(view, info):\n    preds = info.predicates\n    if not preds:\n        return view\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n                raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)' % (\n                        view_name, predicate.text()))\n        return view(context, request)\n    def checker(context, request):\n        return all((predicate(context, request) for predicate in\n                    preds))\n    predicate_wrapper.__predicated__ = checker\n    predicate_wrapper.__predicates__ = preds\n    return predicate_wrapper\n\ndef attr_wrapped_view(view, info):\n    accept, order, phash = (info.options.get('accept', None),\n                            getattr(info, 'order', MAX_ORDER),\n                            getattr(info, 'phash', DEFAULT_PHASH))\n    # this is a little silly but we don't want to decorate the original\n    # function with attributes that indicate accept, order, and phash,\n    # so we use a wrapper\n    if (\n        (accept is None) and\n        (order == MAX_ORDER) and\n        (phash == DEFAULT_PHASH)\n    ):\n        return view # defaults\n    def attr_view(context, request):\n        return view(context, request)\n    attr_view.__accept__ = accept\n    attr_view.__order__ = order\n    attr_view.__phash__ = phash\n    attr_view.__view_attr__ = info.options.get('attr')\n    attr_view.__permission__ = info.options.get('permission')\n    return attr_view\n\nattr_wrapped_view.options = ('accept', 'attr', 'permission')\n\ndef rendered_view(view, info):\n    # one way or another this wrapper must produce a Response (unless\n    # the renderer is a NullRendererHelper)\n    renderer = info.options.get('renderer')\n    if renderer is None:\n        # register a default renderer if you want super-dynamic\n        # rendering.  registering a default renderer will also allow\n        # override_renderer to work if a renderer is left unspecified for\n        # a view registration.\n        def viewresult_to_response(context, request):\n            result = view(context, request)\n            if result.__class__ is Response: # common case\n                response = result\n            else:\n                response = info.registry.queryAdapterOrSelf(result, IResponse)\n                if response is None:\n                    if result is None:\n                        append = (' You may have forgotten to return a value '\n                                  'from the view callable.')\n                    elif isinstance(result, dict):\n                        append = (' You may have forgotten to define a '\n                                  'renderer in the view configuration.')\n                    else:\n                        append = ''\n\n                    msg = ('Could not convert return value of the view '\n                           'callable %s into a response object. '\n                           'The value returned was %r.' + append)\n\n                    raise ValueError(msg % (view_description(view), result))\n\n            return response\n\n        return viewresult_to_response\n\n    if renderer is renderers.null_renderer:\n        return view\n\n    def rendered_view(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # potential common case\n            response = result\n        else:\n            # this must adapt, it can't do a simple interface check\n            # (avoid trying to render webob responses)\n            response = info.registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                attrs = getattr(request, '__dict__', {})\n                if 'override_renderer' in attrs:\n                    # renderer overridden by newrequest event or other\n                    renderer_name = attrs.pop('override_renderer')\n                    view_renderer = renderers.RendererHelper(\n                        name=renderer_name,\n                        package=info.package,\n                        registry=info.registry)\n                else:\n                    view_renderer = renderer.clone()\n                if '__view__' in attrs:\n                    view_inst = attrs.pop('__view__')\n                else:\n                    view_inst = getattr(view, '__original_view__', view)\n                response = view_renderer.render_view(\n                    request, result, view_inst, context)\n        return response\n\n    return rendered_view\n\nrendered_view.options = ('renderer',)\n\ndef decorated_view(view, info):\n    decorator = info.options.get('decorator')\n    if decorator is None:\n        return view\n    return decorator(view)\n\ndecorated_view.options = ('decorator',)\n\ndef _parse_csrf_setting(val, error_source):\n    if val:\n        if isinstance(val, string_types):\n            if val.lower() in truthy:\n                val = True\n            elif val.lower() in falsey:\n                val = False\n        elif not isinstance(val, bool):\n            raise ConfigurationError(\n                '{0} must be a string or boolean value'\n                .format(error_source))\n    return val\n\nSAFE_REQUEST_METHODS = frozenset([\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"])\n\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_default_csrf\"')\n    val = _parse_csrf_setting(\n        info.options.get('require_csrf'),\n        'View option \"require_csrf\"')\n    if (val is True and default_val) or val is None:\n        val = default_val\n    if val is True:\n        val = 'csrf_token'\n    wrapped_view = view\n    if val:\n        def csrf_view(context, request):\n            # Assume that anything not defined as 'safe' by RFC2616 needs\n            # protection\n            if request.method not in SAFE_REQUEST_METHODS:\n                check_csrf_origin(request, raises=True)\n                check_csrf_token(request, val, raises=True)\n            return view(context, request)\n        wrapped_view = csrf_view\n    return wrapped_view\n\ncsrf_view.options = ('require_csrf',)\n\nVIEW = 'VIEW'\nINGRESS = 'INGRESS'\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

Your response format must follow the template below:
<think>
Your thoughts or/and draft, like working through an exercise on scratch paper. Be as casual and as long as you want until you are confident to generate a correct solution.
</think>
<solution>
Final solution presented to the user.
</solution>
system
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]

**Title:** CSRF Checks Enabled by Default on Exception Views Causing Unexpected Errors

**Description:**
When an exception is raised within a view, the corresponding exception view inadvertently undergoes CSRF validation even when it should be exempted. This results in `BadCSRFToken` errors, disrupting the response handling for exceptions.

**Example Buggy Code:**
```python
from pyramid.request import Request
from pyramid.config import Configurator

def faulty_view(request):
    raise ValueError("An error occurred")

def exception_view(request):
    return 'An error has been handled.'

def test_exception_view_csrf_check():
    config = Configurator()
    config.add_settings({'pyramid.require_default_csrf': 'yes'})
    config.set_session_factory(lambda request: DummySession({'csrf_token': 'foo'}))
    config.add_view(faulty_view, name='faulty', require_csrf=False)
    config.add_view(exception_view, context=ValueError, renderer='string')
    app = config.make_wsgi_app()
    
    request = Request.blank('/faulty', base_url='http://example.com')
    request.method = 'POST'
    response = request.get_response(app)
    # Expecting 'An error has been handled.' without CSRF validation
```

**Expected Behavior:**
Exception views should bypass CSRF validation by default unless explicitly configured to enforce it. When an exception is raised, the exception view should return the appropriate response without triggering CSRF-related errors.

**Actual Behavior:**
The exception view undergoes CSRF validation by default, leading to a `BadCSRFToken` error when handling exceptions. This prevents the exception view from returning the expected response smoothly.

[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### pyramid/viewderivers.py
import inspect

from zope.interface import (
    implementer,
    provider,
    )

from pyramid.security import NO_PERMISSION_REQUIRED
from pyramid.session import (
    check_csrf_origin,
    check_csrf_token,
)
from pyramid.response import Response

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IAuthorizationPolicy,
    IDebugLogger,
    IResponse,
    IViewMapper,
    IViewMapperFactory,
    )

from pyramid.compat import (
    string_types,
    is_bound_method,
    is_unbound_method,
    )

from pyramid.config.util import (
    DEFAULT_PHASH,
    MAX_ORDER,
    takes_one_arg,
    )

from pyramid.exceptions import (
    ConfigurationError,
    PredicateMismatch,
    )
from pyramid.httpexceptions import HTTPForbidden
from pyramid.settings import (
    falsey,
    truthy,
)
from pyramid.util import object_description
from pyramid.view import render_view_to_response
from pyramid import renderers


def view_description(view):
    try:
        return view.__text__
    except AttributeError:
        # custom view mappers might not add __text__
        return object_description(view)

def requestonly(view, attr=None):
    return takes_one_arg(view, attr=attr, argname='request')

@implementer(IViewMapper)
@provider(IViewMapperFactory)
class DefaultViewMapper(object):
    def __init__(self, **kw):
        self.attr = kw.get('attr')

    def __call__(self, view):
        if is_unbound_method(view) and self.attr is None:
            raise ConfigurationError((
                'Unbound method calls are not supported, please set the class '
                'as your `view` and the method as your `attr`'
            ))

        if inspect.isclass(view):
            view = self.map_class(view)
        else:
            view = self.map_nonclass(view)
        return view

    def map_class(self, view):
        ronly = requestonly(view, self.attr)
        if ronly:
            mapped_view = self.map_class_requestonly(view)
        else:
            mapped_view = self.map_class_native(view)
        mapped_view.__text__ = 'method %s of %s' % (
            self.attr or '__call__', object_description(view))
        return mapped_view

    def map_nonclass(self, view):
        # We do more work here than appears necessary to avoid wrapping the
        # view unless it actually requires wrapping (to avoid function call
        # overhead).
        mapped_view = view
        ronly = requestonly(view, self.attr)
        if ronly:
            mapped_view = self.map_nonclass_requestonly(view)
        elif self.attr:
            mapped_view = self.map_nonclass_attr(view)
        if inspect.isroutine(mapped_view):
            # This branch will be true if the view is a function or a method.
            # We potentially mutate an unwrapped object here if it's a
            # function.  We do this to avoid function call overhead of
            # injecting another wrapper.  However, we must wrap if the
            # function is a bound method because we can't set attributes on a
            # bound method.
            if is_bound_method(view):
                _mapped_view = mapped_view
                def mapped_view(context, request):
                    return _mapped_view(context, request)
            if self.attr is not None:
                mapped_view.__text__ = 'attr %s of %s' % (
                    self.attr, object_description(view))
            else:
                mapped_view.__text__ = object_description(view)
        return mapped_view

    def map_class_requestonly(self, view):
        # its a class that has an __init__ which only accepts request
        attr = self.attr
        def _class_requestonly_view(context, request):
            inst = view(request)
            request.__view__ = inst
            if attr is None:
                response = inst()
            else:
                response = getattr(inst, attr)()
            return response
        return _class_requestonly_view

    def map_class_native(self, view):
        # its a class that has an __init__ which accepts both context and
        # request
        attr = self.attr
        def _class_view(context, request):
            inst = view(context, request)
            request.__view__ = inst
            if attr is None:
                response = inst()
            else:
                response = getattr(inst, attr)()
            return response
        return _class_view

    def map_nonclass_requestonly(self, view):
        # its a function that has a __call__ which accepts only a single
        # request argument
        attr = self.attr
        def _requestonly_view(context, request):
            if attr is None:
                response = view(request)
            else:
                response = getattr(view, attr)(request)
            return response
        return _requestonly_view

    def map_nonclass_attr(self, view):
        # its a function that has a __call__ which accepts both context and
        # request, but still has an attr
        def _attr_view(context, request):
            response = getattr(view, self.attr)(context, request)
            return response
        return _attr_view


def wraps_view(wrapper):
    def inner(view, info):
        wrapper_view = wrapper(view, info)
        return preserve_view_attrs(view, wrapper_view)
    return inner

def preserve_view_attrs(view, wrapper):
    if view is None:
        return wrapper

    if wrapper is view:
        return view

    original_view = getattr(view, '__original_view__', None)

    if original_view is None:
        original_view = view

    wrapper.__wraps__ = view
    wrapper.__original_view__ = original_view
    wrapper.__module__ = view.__module__
    wrapper.__doc__ = view.__doc__

    try:
        wrapper.__name__ = view.__name__
    except AttributeError:
        wrapper.__name__ = repr(view)

    # attrs that may not exist on "view", but, if so, must be attached to
    # "wrapped view"
    for attr in ('__permitted__', '__call_permissive__', '__permission__',
                 '__predicated__', '__predicates__', '__accept__',
                 '__order__', '__text__'):
        try:
            setattr(wrapper, attr, getattr(view, attr))
        except AttributeError:
            pass

    return wrapper

def mapped_view(view, info):
    mapper = info.options.get('mapper')
    if mapper is None:
        mapper = getattr(view, '__view_mapper__', None)
        if mapper is None:
            mapper = info.registry.queryUtility(IViewMapperFactory)
            if mapper is None:
                mapper = DefaultViewMapper

    mapped_view = mapper(**info.options)(view)
    return mapped_view

mapped_view.options = ('mapper', 'attr')

def owrapped_view(view, info):
    wrapper_viewname = info.options.get('wrapper')
    viewname = info.options.get('name')
    if not wrapper_viewname:
        return view
    def _owrapped_view(context, request):
        response = view(context, request)
        request.wrapped_response = response
        request.wrapped_body = response.body
        request.wrapped_view = view
        wrapped_response = render_view_to_response(context, request,
                                                   wrapper_viewname)
        if wrapped_response is None:
            raise ValueError(
                'No wrapper view named %r found when executing view '
                'named %r' % (wrapper_viewname, viewname))
        return wrapped_response
    return _owrapped_view

owrapped_view.options = ('name', 'wrapper')

def http_cached_view(view, info):
    if info.settings.get('prevent_http_cache', False):
        return view

    seconds = info.options.get('http_cache')

    if seconds is None:
        return view

    options = {}

    if isinstance(seconds, (tuple, list)):
        try:
            seconds, options = seconds
        except ValueError:
            raise ConfigurationError(
                'If http_cache parameter is a tuple or list, it must be '
                'in the form (seconds, options); not %s' % (seconds,))

    def wrapper(context, request):
        response = view(context, request)
        prevent_caching = getattr(response.cache_control, 'prevent_auto',
                                  False)
        if not prevent_caching:
            response.cache_expires(seconds, **options)
        return response

    return wrapper

http_cached_view.options = ('http_cache',)

def secured_view(view, info):
    for wrapper in (_secured_view, _authdebug_view):
        view = wraps_view(wrapper)(view, info)
    return view

secured_view.options = ('permission',)

def _secured_view(view, info):
    permission = info.options.get('permission')
    if permission == NO_PERMISSION_REQUIRED:
        # allow views registered within configurations that have a
        # default permission to explicitly override the default
        # permission, replacing it with no permission at all
        permission = None

    wrapped_view = view
    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)
    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)

    if authn_policy and authz_policy and (permission is not None):
        def _permitted(context, request):
            principals = authn_policy.effective_principals(request)
            return authz_policy.permits(context, principals, permission)
        def _secured_view(context, request):
            result = _permitted(context, request)
            if result:
                return view(context, request)
            view_name = getattr(view, '__name__', view)
            msg = getattr(
                request, 'authdebug_message',
                'Unauthorized: %s failed permission check' % view_name)
            raise HTTPForbidden(msg, result=result)
        _secured_view.__call_permissive__ = view
        _secured_view.__permitted__ = _permitted
        _secured_view.__permission__ = permission
        wrapped_view = _secured_view

    return wrapped_view

def _authdebug_view(view, info):
    wrapped_view = view
    settings = info.settings
    permission = info.options.get('permission')
    authn_policy = info.registry.queryUtility(IAuthenticationPolicy)
    authz_policy = info.registry.queryUtility(IAuthorizationPolicy)
    logger = info.registry.queryUtility(IDebugLogger)
    if settings and settings.get('debug_authorization', False):
        def _authdebug_view(context, request):
            view_name = getattr(request, 'view_name', None)

            if authn_policy and authz_policy:
                if permission is NO_PERMISSION_REQUIRED:
                    msg = 'Allowed (NO_PERMISSION_REQUIRED)'
                elif permission is None:
                    msg = 'Allowed (no permission registered)'
                else:
                    principals = authn_policy.effective_principals(request)
                    msg = str(authz_policy.permits(
                        context, principals, permission))
            else:
                msg = 'Allowed (no authorization policy in use)'

            view_name = getattr(request, 'view_name', None)
            url = getattr(request, 'url', None)
            msg = ('debug_authorization of url %s (view name %r against '
                   'context %r): %s' % (url, view_name, context, msg))
            if logger:
                logger.debug(msg)
            if request is not None:
                request.authdebug_message = msg
            return view(context, request)

        wrapped_view = _authdebug_view

    return wrapped_view

def predicated_view(view, info):
    preds = info.predicates
    if not preds:
        return view
    def predicate_wrapper(context, request):
        for predicate in preds:
            if not predicate(context, request):
                view_name = getattr(view, '__name__', view)
                raise PredicateMismatch(
                    'predicate mismatch for view %s (%s)' % (
                        view_name, predicate.text()))
        return view(context, request)
    def checker(context, request):
        return all((predicate(context, request) for predicate in
                    preds))
    predicate_wrapper.__predicated__ = checker
    predicate_wrapper.__predicates__ = preds
    return predicate_wrapper

def attr_wrapped_view(view, info):
    accept, order, phash = (info.options.get('accept', None),
                            getattr(info, 'order', MAX_ORDER),
                            getattr(info, 'phash', DEFAULT_PHASH))
    # this is a little silly but we don't want to decorate the original
    # function with attributes that indicate accept, order, and phash,
    # so we use a wrapper
    if (
        (accept is None) and
        (order == MAX_ORDER) and
        (phash == DEFAULT_PHASH)
    ):
        return view # defaults
    def attr_view(context, request):
        return view(context, request)
    attr_view.__accept__ = accept
    attr_view.__order__ = order
    attr_view.__phash__ = phash
    attr_view.__view_attr__ = info.options.get('attr')
    attr_view.__permission__ = info.options.get('permission')
    return attr_view

attr_wrapped_view.options = ('accept', 'attr', 'permission')

def rendered_view(view, info):
    # one way or another this wrapper must produce a Response (unless
    # the renderer is a NullRendererHelper)
    renderer = info.options.get('renderer')
    if renderer is None:
        # register a default renderer if you want super-dynamic
        # rendering.  registering a default renderer will also allow
        # override_renderer to work if a renderer is left unspecified for
        # a view registration.
        def viewresult_to_response(context, request):
            result = view(context, request)
            if result.__class__ is Response: # common case
                response = result
            else:
                response = info.registry.queryAdapterOrSelf(result, IResponse)
                if response is None:
                    if result is None:
                        append = (' You may have forgotten to return a value '
                                  'from the view callable.')
                    elif isinstance(result, dict):
                        append = (' You may have forgotten to define a '
                                  'renderer in the view configuration.')
                    else:
                        append = ''

                    msg = ('Could not convert return value of the view '
                           'callable %s into a response object. '
                           'The value returned was %r.' + append)

                    raise ValueError(msg % (view_description(view), result))

            return response

        return viewresult_to_response

    if renderer is renderers.null_renderer:
        return view

    def rendered_view(context, request):
        result = view(context, request)
        if result.__class__ is Response: # potential common case
            response = result
        else:
            # this must adapt, it can't do a simple interface check
            # (avoid trying to render webob responses)
            response = info.registry.queryAdapterOrSelf(result, IResponse)
            if response is None:
                attrs = getattr(request, '__dict__', {})
                if 'override_renderer' in attrs:
                    # renderer overridden by newrequest event or other
                    renderer_name = attrs.pop('override_renderer')
                    view_renderer = renderers.RendererHelper(
                        name=renderer_name,
                        package=info.package,
                        registry=info.registry)
                else:
                    view_renderer = renderer.clone()
                if '__view__' in attrs:
                    view_inst = attrs.pop('__view__')
                else:
                    view_inst = getattr(view, '__original_view__', view)
                response = view_renderer.render_view(
                    request, result, view_inst, context)
        return response

    return rendered_view

rendered_view.options = ('renderer',)

def decorated_view(view, info):
    decorator = info.options.get('decorator')
    if decorator is None:
        return view
    return decorator(view)

decorated_view.options = ('decorator',)

def _parse_csrf_setting(val, error_source):
    if val:
        if isinstance(val, string_types):
            if val.lower() in truthy:
                val = True
            elif val.lower() in falsey:
                val = False
        elif not isinstance(val, bool):
            raise ConfigurationError(
                '{0} must be a string or boolean value'
                .format(error_source))
    return val

SAFE_REQUEST_METHODS = frozenset(["GET", "HEAD", "OPTIONS", "TRACE"])

def csrf_view(view, info):
    default_val = _parse_csrf_setting(
        info.settings.get('pyramid.require_default_csrf'),
        'Config setting "pyramid.require_default_csrf"')
    val = _parse_csrf_setting(
        info.options.get('require_csrf'),
        'View option "require_csrf"')
    if (val is True and default_val) or val is None:
        val = default_val
    if val is True:
        val = 'csrf_token'
    wrapped_view = view
    if val:
        def csrf_view(context, request):
            # Assume that anything not defined as 'safe' by RFC2616 needs
            # protection
            if request.method not in SAFE_REQUEST_METHODS:
                check_csrf_origin(request, raises=True)
                check_csrf_token(request, val, raises=True)
            return view(context, request)
        wrapped_view = csrf_view
    return wrapped_view

csrf_view.options = ('require_csrf',)

VIEW = 'VIEW'
INGRESS = 'INGRESS'

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
user