{
    "file_diffs": [
        {
            "old_file_content": ".. index::\n   single: session\n\n.. _sessions_chapter:\n\nSessions\n========\n\nA :term:`session` is a namespace which is valid for some period of continual\nactivity that can be used to represent a user's interaction with a web\napplication.\n\nThis chapter describes how to configure sessions, what session implementations\n:app:`Pyramid` provides out of the box, how to store and retrieve data from\nsessions, and two session-specific features: flash messages, and cross-site\nrequest forgery attack prevention.\n\n.. index::\n   single: session factory (default)\n\n.. _using_the_default_session_factory:\n\nUsing the Default Session Factory\n---------------------------------\n\nIn order to use sessions, you must set up a :term:`session factory` during your\n:app:`Pyramid` configuration.\n\nA very basic, insecure sample session factory implementation is provided in the\n:app:`Pyramid` core.  It uses a cookie to store session information.  This\nimplementation has the following limitations:\n\n- The session information in the cookies used by this implementation is *not*\n  encrypted, so it can be viewed by anyone with access to the cookie storage of\n  the user's browser or anyone with access to the network along which the\n  cookie travels.\n\n- The maximum number of bytes that are storable in a serialized representation\n  of the session is fewer than 4000.  This is suitable only for very small data\n  sets.\n\nIt is digitally signed, however, and thus its data cannot easily be tampered\nwith.\n\nYou can configure this session factory in your :app:`Pyramid` application by\nusing the :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.session import SignedCookieSessionFactory\n   my_session_factory = SignedCookieSessionFactory('itsaseekreet')\n\n   from pyramid.config import Configurator\n   config = Configurator()\n   config.set_session_factory(my_session_factory)\n\n.. warning::\n\n   By default the :func:`~pyramid.session.SignedCookieSessionFactory`\n   implementation is *unencrypted*.  You should not use it when you keep\n   sensitive information in the session object, as the information can be\n   easily read by both users of your application and third parties who have\n   access to your users' network traffic.  And, if you use this sessioning\n   implementation, and you inadvertently create a cross-site scripting\n   vulnerability in your application, because the session data is stored\n   unencrypted in a cookie, it will also be easier for evildoers to obtain the\n   current user's cross-site scripting token.  In short, use a different\n   session factory implementation (preferably one which keeps session data on\n   the server) for anything but the most basic of applications where \"session\n   security doesn't matter\", and you are sure your application has no\n   cross-site scripting vulnerabilities.\n\n.. index::\n   single: session object\n\nUsing a Session Object\n----------------------\n\nOnce a session factory has been configured for your application, you can access\nsession objects provided by the session factory via the ``session`` attribute\nof any :term:`request` object.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n\n   def myview(request):\n       session = request.session\n       if 'abc' in session:\n           session['fred'] = 'yes'\n       session['abc'] = '123'\n       if 'fred' in session:\n           return Response('Fred was in the session')\n       else:\n           return Response('Fred was not in the session')\n\nThe first time this view is invoked produces ``Fred was not in the session``.\nSubsequent invocations produce ``Fred was in the session``, assuming of course\nthat the client side maintains the session's identity across multiple requests.\n\nYou can use a session much like a Python dictionary.  It supports all\ndictionary methods, along with some extra attributes and methods.\n\nExtra attributes:\n\n``created``\n  An integer timestamp indicating the time that this session was created.\n\n``new``\n  A boolean.  If ``new`` is True, this session is new.  Otherwise, it has been\n  constituted from data that was already serialized.\n\nExtra methods:\n\n``changed()``\n  Call this when you mutate a mutable value in the session namespace. See the\n  gotchas below for details on when and why you should call this.\n\n``invalidate()``\n  Call this when you want to invalidate the session (dump all data, and perhaps\n  set a clearing cookie).\n\nThe formal definition of the methods and attributes supported by the session\nobject are in the :class:`pyramid.interfaces.ISession` documentation.\n\nSome gotchas:\n\n- Keys and values of session data must be *pickleable*.  This means, typically,\n  that they are instances of basic types of objects, such as strings, lists,\n  dictionaries, tuples, integers, etc.  If you place an object in a session\n  data key or value that is not pickleable, an error will be raised when the\n  session is serialized.\n\n- If you place a mutable value (for example, a list or a dictionary) in a\n  session object, and you subsequently mutate that value, you must call the\n  ``changed()`` method of the session object. In this case, the session has no\n  way to know that it was modified.  However, when you modify a session object\n  directly, such as setting a value (i.e., ``__setitem__``), or removing a key\n  (e.g., ``del`` or ``pop``), the session will automatically know that it needs\n  to re-serialize its data, thus calling ``changed()`` is unnecessary. There is\n  no harm in calling ``changed()`` in either case, so when in doubt, call it\n  after you've changed sessioning data.\n\n.. index::\n   single: pyramid_redis_sessions\n   single: session factory (alternates)\n\n.. _using_alternate_session_factories:\n\nUsing Alternate Session Factories\n---------------------------------\n\nThe following session factories exist at the time of this writing.\n\n======================= ======= =============================\nSession Factory         Backend   Description\n======================= ======= =============================\npyramid_redis_sessions_ Redis_  Server-side session library\n                                for Pyramid, using Redis for\n                                storage.\npyramid_beaker_         Beaker_ Session factory for Pyramid\n                                backed by the Beaker\n                                sessioning system.\n======================= ======= =============================\n\n.. _pyramid_redis_sessions: https://pypi.python.org/pypi/pyramid_redis_sessions\n.. _Redis: http://redis.io/\n\n.. _pyramid_beaker: https://pypi.python.org/pypi/pyramid_beaker\n.. _Beaker: http://beaker.readthedocs.org/en/latest/\n\n.. index::\n   single: session factory (custom)\n\nCreating Your Own Session Factory\n---------------------------------\n\nIf none of the default or otherwise available sessioning implementations for\n:app:`Pyramid` suit you, you may create your own session object by implementing\na :term:`session factory`.  Your session factory should return a\n:term:`session`.  The interfaces for both types are available in\n:class:`pyramid.interfaces.ISessionFactory` and\n:class:`pyramid.interfaces.ISession`. You might use the cookie implementation\nin the :mod:`pyramid.session` module as inspiration.\n\n.. index::\n   single: flash messages\n\n.. _flash_messages:\n\nFlash Messages\n--------------\n\n\"Flash messages\" are simply a queue of message strings stored in the\n:term:`session`.  To use flash messaging, you must enable a :term:`session\nfactory` as described in :ref:`using_the_default_session_factory` or\n:ref:`using_alternate_session_factories`.\n\nFlash messaging has two main uses: to display a status message only once to the\nuser after performing an internal redirect, and to allow generic code to log\nmessages for single-time display without having direct access to an HTML\ntemplate. The user interface consists of a number of methods of the\n:term:`session` object.\n\n.. index::\n   single: session.flash\n\nUsing the ``session.flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo add a message to a flash message queue, use a session object's ``flash()``\nmethod:\n\n.. code-block:: python\n\n   request.session.flash('mymessage')\n\nThe ``flash()`` method appends a message to a flash queue, creating the queue\nif necessary.\n\n``flash()`` accepts three arguments:\n\n.. method:: flash(message, queue='', allow_duplicate=True)\n\nThe ``message`` argument is required.  It represents a message you wish to\nlater display to a user.  It is usually a string but the ``message`` you\nprovide is not modified in any way.\n\nThe ``queue`` argument allows you to choose a queue to which to append the\nmessage you provide.  This can be used to push different kinds of messages into\nflash storage for later display in different places on a page.  You can pass\nany name for your queue, but it must be a string. Each queue is independent,\nand can be popped by ``pop_flash()`` or examined via ``peek_flash()``\nseparately.  ``queue`` defaults to the empty string.  The empty string\nrepresents the default flash message queue.\n\n.. code-block:: python\n\n   request.session.flash(msg, 'myappsqueue')\n\nThe ``allow_duplicate`` argument defaults to ``True``.  If this is ``False``,\nand you attempt to add a message value which is already present in the queue,\nit will not be added.\n\n.. index::\n   single: session.pop_flash\n\nUsing the ``session.pop_flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce one or more messages have been added to a flash queue by the\n``session.flash()`` API, the ``session.pop_flash()`` API can be used to pop an\nentire queue and return it for use.\n\nTo pop a particular queue of messages from the flash object, use the session\nobject's ``pop_flash()`` method. This returns a list of the messages that were\nadded to the flash queue, and empties the queue.\n\n.. method:: pop_flash(queue='')\n\n>>> request.session.flash('info message')\n>>> request.session.pop_flash()\n['info message']\n\nCalling ``session.pop_flash()`` again like above without a corresponding call\nto ``session.flash()`` will return an empty list, because the queue has already\nbeen popped.\n\n>>> request.session.flash('info message')\n>>> request.session.pop_flash()\n['info message']\n>>> request.session.pop_flash()\n[]\n\n.. index::\n   single: session.peek_flash\n\nUsing the ``session.peek_flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce one or more messages have been added to a flash queue by the\n``session.flash()`` API, the ``session.peek_flash()`` API can be used to \"peek\"\nat that queue.  Unlike ``session.pop_flash()``, the queue is not popped from\nflash storage.\n\n.. method:: peek_flash(queue='')\n\n>>> request.session.flash('info message')\n>>> request.session.peek_flash()\n['info message']\n>>> request.session.peek_flash()\n['info message']\n>>> request.session.pop_flash()\n['info message']\n>>> request.session.peek_flash()\n[]\n\n.. index::\n   single: preventing cross-site request forgery attacks\n   single: cross-site request forgery attacks, prevention\n\nPreventing Cross-Site Request Forgery Attacks\n---------------------------------------------\n\n`Cross-site request forgery\n<http://en.wikipedia.org/wiki/Cross-site_request_forgery>`_ attacks are a\nphenomenon whereby a user who is logged in to your website might inadvertantly\nload a URL because it is linked from, or embedded in, an attacker's website.\nIf the URL is one that may modify or delete data, the consequences can be dire.\n\nYou can avoid most of these attacks by issuing a unique token to the browser\nand then requiring that it be present in all potentially unsafe requests.\n:app:`Pyramid` sessions provide facilities to create and check CSRF tokens.\n\nTo use CSRF tokens, you must first enable a :term:`session factory` as\ndescribed in :ref:`using_the_default_session_factory` or\n:ref:`using_alternate_session_factories`.\n\n.. index::\n   single: session.get_csrf_token\n\nUsing the ``session.get_csrf_token`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo get the current CSRF token from the session, use the\n``session.get_csrf_token()`` method.\n\n.. code-block:: python\n\n   token = request.session.get_csrf_token()\n\nThe ``session.get_csrf_token()`` method accepts no arguments.  It returns a\nCSRF *token* string. If ``session.get_csrf_token()`` or\n``session.new_csrf_token()`` was invoked previously for this session, then the\nexisting token will be returned.  If no CSRF token previously existed for this\nsession, then a new token will be set into the session and returned.  The newly\ncreated token will be opaque and randomized.\n\nYou can use the returned token as the value of a hidden field in a form that\nposts to a method that requires elevated privileges, or supply it as a request\nheader in AJAX requests.\n\nFor example, include the CSRF token as a hidden field:\n\n.. code-block:: html\n\n    <form method=\"post\" action=\"/myview\">\n      <input type=\"hidden\" name=\"csrf_token\" value=\"${request.session.get_csrf_token()}\">\n      <input type=\"submit\" value=\"Delete Everything\">\n    </form>\n\nOr include it as a header in a jQuery AJAX request:\n\n.. code-block:: javascript\n\n    var csrfToken = ${request.session.get_csrf_token()};\n    $.ajax({\n      type: \"POST\",\n      url: \"/myview\",\n      headers: { 'X-CSRF-Token': csrfToken }\n    }).done(function() {\n      alert(\"Deleted\");\n    });\n\nThe handler for the URL that receives the request should then require that the\ncorrect CSRF token is supplied.\n\n.. index::\n   single: session.new_csrf_token\n\nUsing the ``session.new_csrf_token`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo explicitly create a new CSRF token, use the ``session.new_csrf_token()``\nmethod.  This differs only from ``session.get_csrf_token()`` inasmuch as it\nclears any existing CSRF token, creates a new CSRF token, sets the token into\nthe session, and returns the token.\n\n.. code-block:: python\n\n   token = request.session.new_csrf_token()\n\nChecking CSRF Tokens Manually\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn request handling code, you can check the presence and validity of a CSRF\ntoken with :func:`pyramid.session.check_csrf_token`. If the token is valid, it\nwill return ``True``, otherwise it will raise ``HTTPBadRequest``. Optionally,\nyou can specify ``raises=False`` to have the check return ``False`` instead of\nraising an exception.\n\nBy default, it checks for a POST parameter named ``csrf_token`` or a header\nnamed ``X-CSRF-Token``.\n\n.. code-block:: python\n\n    from pyramid.session import check_csrf_token\n\n    def myview(request):\n        # Require CSRF Token\n        check_csrf_token(request)\n\n        # ...\n\n.. _auto_csrf_checking:\n\nChecking CSRF Tokens Automatically\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. versionadded:: 1.7\n\n:app:`Pyramid` supports automatically checking CSRF tokens on POST requests.\nAny other request may be checked manually. This feature can be turned on\nglobally for an application using the ``pyramid.require_default_csrf`` setting.\n\nIf the ``pyramid.required_default_csrf`` setting is a :term:`truthy string` or\n``True`` then the default CSRF token parameter will be ``csrf_token``. If a\ndifferent token is desired, it may be passed as the value. Finally, a\n:term:`falsey string` or ``False`` will turn off automatic CSRF checking\nglobally on every POST request.\n\nNo matter what, CSRF checking may be explicitly enabled or disabled on a\nper-view basis using the ``require_csrf`` view option. This option is of the\nsame format as the ``pyramid.require_default_csrf`` setting, accepting strings\nor boolean values.\n\nIf ``require_csrf`` is ``True`` but does not explicitly define a token to\ncheck, then the token name is pulled from whatever was set in the\n``pyramid.require_default_csrf`` setting. Finally, if that setting does not\nexplicitly define a token, then ``csrf_token`` is the token required. This token\nname will be required in ``request.POST`` which is the submitted form body.\n\nIt is always possible to pass the token in the ``X-CSRF-Token`` header as well.\nThere is currently no way to define an alternate name for this header without\nperforming CSRF checking manually.\n\nIf CSRF checks fail then a :class:`pyramid.exceptions.BadCSRFToken` exception\nwill be raised. This exception may be caught and handled by an\n:term:`exception view` but, by default, will result in a ``400 Bad Request``\nresponse being sent to the client.\n\nChecking CSRF Tokens with a View Predicate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. deprecated:: 1.7\n   Use the ``require_csrf`` option or read :ref:`auto_csrf_checking` instead\n   to have :class:`pyramid.exceptions.BadCSRFToken` exceptions raised.\n\nA convenient way to require a valid CSRF token for a particular view is to\ninclude ``check_csrf=True`` as a view predicate. See\n:meth:`pyramid.config.Configurator.add_view`.\n\n.. code-block:: python\n\n    @view_config(request_method='POST', check_csrf=True, ...)\n    def myview(request):\n        ...\n\n.. note::\n   A mismatch of a CSRF token is treated like any other predicate miss, and the\n   predicate system, when it doesn't find a view, raises ``HTTPNotFound``\n   instead of ``HTTPBadRequest``, so ``check_csrf=True`` behavior is different\n   from calling :func:`pyramid.session.check_csrf_token`.\n",
            "new_file_content": ".. index::\n   single: session\n\n.. _sessions_chapter:\n\nSessions\n========\n\nA :term:`session` is a namespace which is valid for some period of continual\nactivity that can be used to represent a user's interaction with a web\napplication.\n\nThis chapter describes how to configure sessions, what session implementations\n:app:`Pyramid` provides out of the box, how to store and retrieve data from\nsessions, and two session-specific features: flash messages, and cross-site\nrequest forgery attack prevention.\n\n.. index::\n   single: session factory (default)\n\n.. _using_the_default_session_factory:\n\nUsing the Default Session Factory\n---------------------------------\n\nIn order to use sessions, you must set up a :term:`session factory` during your\n:app:`Pyramid` configuration.\n\nA very basic, insecure sample session factory implementation is provided in the\n:app:`Pyramid` core.  It uses a cookie to store session information.  This\nimplementation has the following limitations:\n\n- The session information in the cookies used by this implementation is *not*\n  encrypted, so it can be viewed by anyone with access to the cookie storage of\n  the user's browser or anyone with access to the network along which the\n  cookie travels.\n\n- The maximum number of bytes that are storable in a serialized representation\n  of the session is fewer than 4000.  This is suitable only for very small data\n  sets.\n\nIt is digitally signed, however, and thus its data cannot easily be tampered\nwith.\n\nYou can configure this session factory in your :app:`Pyramid` application by\nusing the :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.session import SignedCookieSessionFactory\n   my_session_factory = SignedCookieSessionFactory('itsaseekreet')\n\n   from pyramid.config import Configurator\n   config = Configurator()\n   config.set_session_factory(my_session_factory)\n\n.. warning::\n\n   By default the :func:`~pyramid.session.SignedCookieSessionFactory`\n   implementation is *unencrypted*.  You should not use it when you keep\n   sensitive information in the session object, as the information can be\n   easily read by both users of your application and third parties who have\n   access to your users' network traffic.  And, if you use this sessioning\n   implementation, and you inadvertently create a cross-site scripting\n   vulnerability in your application, because the session data is stored\n   unencrypted in a cookie, it will also be easier for evildoers to obtain the\n   current user's cross-site scripting token.  In short, use a different\n   session factory implementation (preferably one which keeps session data on\n   the server) for anything but the most basic of applications where \"session\n   security doesn't matter\", and you are sure your application has no\n   cross-site scripting vulnerabilities.\n\n.. index::\n   single: session object\n\nUsing a Session Object\n----------------------\n\nOnce a session factory has been configured for your application, you can access\nsession objects provided by the session factory via the ``session`` attribute\nof any :term:`request` object.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n\n   def myview(request):\n       session = request.session\n       if 'abc' in session:\n           session['fred'] = 'yes'\n       session['abc'] = '123'\n       if 'fred' in session:\n           return Response('Fred was in the session')\n       else:\n           return Response('Fred was not in the session')\n\nThe first time this view is invoked produces ``Fred was not in the session``.\nSubsequent invocations produce ``Fred was in the session``, assuming of course\nthat the client side maintains the session's identity across multiple requests.\n\nYou can use a session much like a Python dictionary.  It supports all\ndictionary methods, along with some extra attributes and methods.\n\nExtra attributes:\n\n``created``\n  An integer timestamp indicating the time that this session was created.\n\n``new``\n  A boolean.  If ``new`` is True, this session is new.  Otherwise, it has been\n  constituted from data that was already serialized.\n\nExtra methods:\n\n``changed()``\n  Call this when you mutate a mutable value in the session namespace. See the\n  gotchas below for details on when and why you should call this.\n\n``invalidate()``\n  Call this when you want to invalidate the session (dump all data, and perhaps\n  set a clearing cookie).\n\nThe formal definition of the methods and attributes supported by the session\nobject are in the :class:`pyramid.interfaces.ISession` documentation.\n\nSome gotchas:\n\n- Keys and values of session data must be *pickleable*.  This means, typically,\n  that they are instances of basic types of objects, such as strings, lists,\n  dictionaries, tuples, integers, etc.  If you place an object in a session\n  data key or value that is not pickleable, an error will be raised when the\n  session is serialized.\n\n- If you place a mutable value (for example, a list or a dictionary) in a\n  session object, and you subsequently mutate that value, you must call the\n  ``changed()`` method of the session object. In this case, the session has no\n  way to know that it was modified.  However, when you modify a session object\n  directly, such as setting a value (i.e., ``__setitem__``), or removing a key\n  (e.g., ``del`` or ``pop``), the session will automatically know that it needs\n  to re-serialize its data, thus calling ``changed()`` is unnecessary. There is\n  no harm in calling ``changed()`` in either case, so when in doubt, call it\n  after you've changed sessioning data.\n\n.. index::\n   single: pyramid_redis_sessions\n   single: session factory (alternates)\n\n.. _using_alternate_session_factories:\n\nUsing Alternate Session Factories\n---------------------------------\n\nThe following session factories exist at the time of this writing.\n\n======================= ======= =============================\nSession Factory         Backend   Description\n======================= ======= =============================\npyramid_redis_sessions_ Redis_  Server-side session library\n                                for Pyramid, using Redis for\n                                storage.\npyramid_beaker_         Beaker_ Session factory for Pyramid\n                                backed by the Beaker\n                                sessioning system.\n======================= ======= =============================\n\n.. _pyramid_redis_sessions: https://pypi.python.org/pypi/pyramid_redis_sessions\n.. _Redis: http://redis.io/\n\n.. _pyramid_beaker: https://pypi.python.org/pypi/pyramid_beaker\n.. _Beaker: http://beaker.readthedocs.org/en/latest/\n\n.. index::\n   single: session factory (custom)\n\nCreating Your Own Session Factory\n---------------------------------\n\nIf none of the default or otherwise available sessioning implementations for\n:app:`Pyramid` suit you, you may create your own session object by implementing\na :term:`session factory`.  Your session factory should return a\n:term:`session`.  The interfaces for both types are available in\n:class:`pyramid.interfaces.ISessionFactory` and\n:class:`pyramid.interfaces.ISession`. You might use the cookie implementation\nin the :mod:`pyramid.session` module as inspiration.\n\n.. index::\n   single: flash messages\n\n.. _flash_messages:\n\nFlash Messages\n--------------\n\n\"Flash messages\" are simply a queue of message strings stored in the\n:term:`session`.  To use flash messaging, you must enable a :term:`session\nfactory` as described in :ref:`using_the_default_session_factory` or\n:ref:`using_alternate_session_factories`.\n\nFlash messaging has two main uses: to display a status message only once to the\nuser after performing an internal redirect, and to allow generic code to log\nmessages for single-time display without having direct access to an HTML\ntemplate. The user interface consists of a number of methods of the\n:term:`session` object.\n\n.. index::\n   single: session.flash\n\nUsing the ``session.flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo add a message to a flash message queue, use a session object's ``flash()``\nmethod:\n\n.. code-block:: python\n\n   request.session.flash('mymessage')\n\nThe ``flash()`` method appends a message to a flash queue, creating the queue\nif necessary.\n\n``flash()`` accepts three arguments:\n\n.. method:: flash(message, queue='', allow_duplicate=True)\n\nThe ``message`` argument is required.  It represents a message you wish to\nlater display to a user.  It is usually a string but the ``message`` you\nprovide is not modified in any way.\n\nThe ``queue`` argument allows you to choose a queue to which to append the\nmessage you provide.  This can be used to push different kinds of messages into\nflash storage for later display in different places on a page.  You can pass\nany name for your queue, but it must be a string. Each queue is independent,\nand can be popped by ``pop_flash()`` or examined via ``peek_flash()``\nseparately.  ``queue`` defaults to the empty string.  The empty string\nrepresents the default flash message queue.\n\n.. code-block:: python\n\n   request.session.flash(msg, 'myappsqueue')\n\nThe ``allow_duplicate`` argument defaults to ``True``.  If this is ``False``,\nand you attempt to add a message value which is already present in the queue,\nit will not be added.\n\n.. index::\n   single: session.pop_flash\n\nUsing the ``session.pop_flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce one or more messages have been added to a flash queue by the\n``session.flash()`` API, the ``session.pop_flash()`` API can be used to pop an\nentire queue and return it for use.\n\nTo pop a particular queue of messages from the flash object, use the session\nobject's ``pop_flash()`` method. This returns a list of the messages that were\nadded to the flash queue, and empties the queue.\n\n.. method:: pop_flash(queue='')\n\n>>> request.session.flash('info message')\n>>> request.session.pop_flash()\n['info message']\n\nCalling ``session.pop_flash()`` again like above without a corresponding call\nto ``session.flash()`` will return an empty list, because the queue has already\nbeen popped.\n\n>>> request.session.flash('info message')\n>>> request.session.pop_flash()\n['info message']\n>>> request.session.pop_flash()\n[]\n\n.. index::\n   single: session.peek_flash\n\nUsing the ``session.peek_flash`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOnce one or more messages have been added to a flash queue by the\n``session.flash()`` API, the ``session.peek_flash()`` API can be used to \"peek\"\nat that queue.  Unlike ``session.pop_flash()``, the queue is not popped from\nflash storage.\n\n.. method:: peek_flash(queue='')\n\n>>> request.session.flash('info message')\n>>> request.session.peek_flash()\n['info message']\n>>> request.session.peek_flash()\n['info message']\n>>> request.session.pop_flash()\n['info message']\n>>> request.session.peek_flash()\n[]\n\n.. index::\n   single: preventing cross-site request forgery attacks\n   single: cross-site request forgery attacks, prevention\n\nPreventing Cross-Site Request Forgery Attacks\n---------------------------------------------\n\n`Cross-site request forgery\n<http://en.wikipedia.org/wiki/Cross-site_request_forgery>`_ attacks are a\nphenomenon whereby a user who is logged in to your website might inadvertantly\nload a URL because it is linked from, or embedded in, an attacker's website.\nIf the URL is one that may modify or delete data, the consequences can be dire.\n\nYou can avoid most of these attacks by issuing a unique token to the browser\nand then requiring that it be present in all potentially unsafe requests.\n:app:`Pyramid` sessions provide facilities to create and check CSRF tokens.\n\nTo use CSRF tokens, you must first enable a :term:`session factory` as\ndescribed in :ref:`using_the_default_session_factory` or\n:ref:`using_alternate_session_factories`.\n\n.. index::\n   single: session.get_csrf_token\n\nUsing the ``session.get_csrf_token`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo get the current CSRF token from the session, use the\n``session.get_csrf_token()`` method.\n\n.. code-block:: python\n\n   token = request.session.get_csrf_token()\n\nThe ``session.get_csrf_token()`` method accepts no arguments.  It returns a\nCSRF *token* string. If ``session.get_csrf_token()`` or\n``session.new_csrf_token()`` was invoked previously for this session, then the\nexisting token will be returned.  If no CSRF token previously existed for this\nsession, then a new token will be set into the session and returned.  The newly\ncreated token will be opaque and randomized.\n\nYou can use the returned token as the value of a hidden field in a form that\nposts to a method that requires elevated privileges, or supply it as a request\nheader in AJAX requests.\n\nFor example, include the CSRF token as a hidden field:\n\n.. code-block:: html\n\n    <form method=\"post\" action=\"/myview\">\n      <input type=\"hidden\" name=\"csrf_token\" value=\"${request.session.get_csrf_token()}\">\n      <input type=\"submit\" value=\"Delete Everything\">\n    </form>\n\nOr include it as a header in a jQuery AJAX request:\n\n.. code-block:: javascript\n\n    var csrfToken = ${request.session.get_csrf_token()};\n    $.ajax({\n      type: \"POST\",\n      url: \"/myview\",\n      headers: { 'X-CSRF-Token': csrfToken }\n    }).done(function() {\n      alert(\"Deleted\");\n    });\n\nThe handler for the URL that receives the request should then require that the\ncorrect CSRF token is supplied.\n\n.. index::\n   single: session.new_csrf_token\n\nUsing the ``session.new_csrf_token`` Method\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo explicitly create a new CSRF token, use the ``session.new_csrf_token()``\nmethod.  This differs only from ``session.get_csrf_token()`` inasmuch as it\nclears any existing CSRF token, creates a new CSRF token, sets the token into\nthe session, and returns the token.\n\n.. code-block:: python\n\n   token = request.session.new_csrf_token()\n\nChecking CSRF Tokens Manually\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn request handling code, you can check the presence and validity of a CSRF\ntoken with :func:`pyramid.session.check_csrf_token`. If the token is valid, it\nwill return ``True``, otherwise it will raise ``HTTPBadRequest``. Optionally,\nyou can specify ``raises=False`` to have the check return ``False`` instead of\nraising an exception.\n\nBy default, it checks for a POST parameter named ``csrf_token`` or a header\nnamed ``X-CSRF-Token``.\n\n.. code-block:: python\n\n    from pyramid.session import check_csrf_token\n\n    def myview(request):\n        # Require CSRF Token\n        check_csrf_token(request)\n\n        # ...\n\n.. _auto_csrf_checking:\n\nChecking CSRF Tokens Automatically\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. versionadded:: 1.7\n\n:app:`Pyramid` supports automatically checking CSRF tokens on requests with an\nunsafe method as defined by RFC2616. Any other request may be checked manually.\nThis feature can be turned on globally for an application using the\n``pyramid.require_default_csrf`` setting.\n\nIf the ``pyramid.required_default_csrf`` setting is a :term:`truthy string` or\n``True`` then the default CSRF token parameter will be ``csrf_token``. If a\ndifferent token is desired, it may be passed as the value. Finally, a\n:term:`falsey string` or ``False`` will turn off automatic CSRF checking\nglobally on every request.\n\nNo matter what, CSRF checking may be explicitly enabled or disabled on a\nper-view basis using the ``require_csrf`` view option. This option is of the\nsame format as the ``pyramid.require_default_csrf`` setting, accepting strings\nor boolean values.\n\nIf ``require_csrf`` is ``True`` but does not explicitly define a token to\ncheck, then the token name is pulled from whatever was set in the\n``pyramid.require_default_csrf`` setting. Finally, if that setting does not\nexplicitly define a token, then ``csrf_token`` is the token required. This token\nname will be required in ``request.POST`` which is the submitted form body.\n\nIt is always possible to pass the token in the ``X-CSRF-Token`` header as well.\nThere is currently no way to define an alternate name for this header without\nperforming CSRF checking manually.\n\nIf CSRF checks fail then a :class:`pyramid.exceptions.BadCSRFToken` exception\nwill be raised. This exception may be caught and handled by an\n:term:`exception view` but, by default, will result in a ``400 Bad Request``\nresponse being sent to the client.\n\nChecking CSRF Tokens with a View Predicate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. deprecated:: 1.7\n   Use the ``require_csrf`` option or read :ref:`auto_csrf_checking` instead\n   to have :class:`pyramid.exceptions.BadCSRFToken` exceptions raised.\n\nA convenient way to require a valid CSRF token for a particular view is to\ninclude ``check_csrf=True`` as a view predicate. See\n:meth:`pyramid.config.Configurator.add_view`.\n\n.. code-block:: python\n\n    @view_config(request_method='POST', check_csrf=True, ...)\n    def myview(request):\n        ...\n\n.. note::\n   A mismatch of a CSRF token is treated like any other predicate miss, and the\n   predicate system, when it doesn't find a view, raises ``HTTPNotFound``\n   instead of ``HTTPBadRequest``, so ``check_csrf=True`` behavior is different\n   from calling :func:`pyramid.session.check_csrf_token`.\n",
            "header": {
                "file": {
                    "path": "docs/narr/sessions.rst"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "ad086268b",
                "new_commit_hash": "0e895ff81",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/docs/narr/sessions.rst"
            },
            "plus_file": {
                "path": "b/docs/narr/sessions.rst"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 411,
                            "length": 15
                        },
                        "new_range": {
                            "start": 411,
                            "length": 16
                        },
                        "section": "Checking CSRF Tokens Automatically"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": ".. versionadded:: 1.7",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": ":app:`Pyramid` supports automatically checking CSRF tokens on POST requests.",
                                "type": "deleted"
                            },
                            {
                                "content": "Any other request may be checked manually. This feature can be turned on",
                                "type": "deleted"
                            },
                            {
                                "content": "globally for an application using the ``pyramid.require_default_csrf`` setting.",
                                "type": "deleted"
                            },
                            {
                                "content": ":app:`Pyramid` supports automatically checking CSRF tokens on requests with an",
                                "type": "added"
                            },
                            {
                                "content": "unsafe method as defined by RFC2616. Any other request may be checked manually.",
                                "type": "added"
                            },
                            {
                                "content": "This feature can be turned on globally for an application using the",
                                "type": "added"
                            },
                            {
                                "content": "``pyramid.require_default_csrf`` setting.",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "If the ``pyramid.required_default_csrf`` setting is a :term:`truthy string` or",
                                "type": "context"
                            },
                            {
                                "content": "``True`` then the default CSRF token parameter will be ``csrf_token``. If a",
                                "type": "context"
                            },
                            {
                                "content": "different token is desired, it may be passed as the value. Finally, a",
                                "type": "context"
                            },
                            {
                                "content": ":term:`falsey string` or ``False`` will turn off automatic CSRF checking",
                                "type": "context"
                            },
                            {
                                "content": "globally on every POST request.",
                                "type": "deleted"
                            },
                            {
                                "content": "globally on every request.",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "No matter what, CSRF checking may be explicitly enabled or disabled on a",
                                "type": "context"
                            },
                            {
                                "content": "per-view basis using the ``require_csrf`` view option. This option is of the",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": ".. _view_config_chapter:\n\n.. _view_configuration:\n\n.. _view_lookup:\n\nView Configuration\n==================\n\n.. index::\n   single: view lookup\n\n:term:`View lookup` is the :app:`Pyramid` subsystem responsible for finding and\ninvoking a :term:`view callable`.  :term:`View configuration` controls how\n:term:`view lookup` operates in your application.  During any given request,\nview configuration information is compared against request data by the view\nlookup subsystem in order to find the \"best\" view callable for that request.\n\nIn earlier chapters, you have been exposed to a few simple view configuration\ndeclarations without much explanation. In this chapter we will explore the\nsubject in detail.\n\n.. index::\n   pair: resource; mapping to view callable\n   pair: URL pattern; mapping to view callable\n\nMapping a Resource or URL Pattern to a View Callable\n----------------------------------------------------\n\nA developer makes a :term:`view callable` available for use within a\n:app:`Pyramid` application via :term:`view configuration`.  A view\nconfiguration associates a view callable with a set of statements that\ndetermine the set of circumstances which must be true for the view callable to\nbe invoked.\n\nA view configuration statement is made about information present in the\n:term:`context` resource and the :term:`request`.\n\nView configuration is performed in one of two ways:\n\n- By running a :term:`scan` against application source code which has a\n  :class:`pyramid.view.view_config` decorator attached to a Python object as\n  per :ref:`mapping_views_using_a_decorator_section`.\n\n- By using the :meth:`pyramid.config.Configurator.add_view` method as per\n  :ref:`mapping_views_using_imperative_config_section`.\n\n.. index::\n   single: view configuration parameters\n\n.. _view_configuration_parameters:\n\nView Configuration Parameters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAll forms of view configuration accept the same general types of arguments.\n\nMany arguments supplied during view configuration are :term:`view predicate`\narguments.  View predicate arguments used during view configuration are used to\nnarrow the set of circumstances in which :term:`view lookup` will find a\nparticular view callable.\n\n:term:`View predicate` attributes are an important part of view configuration\nthat enables the :term:`view lookup` subsystem to find and invoke the\nappropriate view.  The greater the number of predicate attributes possessed by\na view's configuration, the more specific the circumstances need to be before\nthe registered view callable will be invoked.  The fewer the number of\npredicates which are supplied to a particular view configuration, the more\nlikely it is that the associated view callable will be invoked.  A view with\nfive predicates will always be found and evaluated before a view with two, for\nexample.\n\nThis does not mean however, that :app:`Pyramid` \"stops looking\" when it finds a\nview registration with predicates that don't match.  If one set of view\npredicates does not match, the \"next most specific\" view (if any) is consulted\nfor predicates, and so on, until a view is found, or no view can be matched up\nwith the request.  The first view with a set of predicates all of which match\nthe request environment will be invoked.\n\nIf no view can be found with predicates which allow it to be matched up with\nthe request, :app:`Pyramid` will return an error to the user's browser,\nrepresenting a \"not found\" (404) page.  See :ref:`changing_the_notfound_view`\nfor more information about changing the default :term:`Not Found View`.\n\nOther view configuration arguments are non-predicate arguments.  These tend to\nmodify the response of the view callable or prevent the view callable from\nbeing invoked due to an authorization policy.  The presence of non-predicate\narguments in a view configuration does not narrow the circumstances in which\nthe view callable will be invoked.\n\n.. _nonpredicate_view_args:\n\nNon-Predicate Arguments\n+++++++++++++++++++++++\n\n``permission``\n  The name of a :term:`permission` that the user must possess in order to\n  invoke the :term:`view callable`.  See :ref:`view_security_section` for more\n  information about view security and permissions.\n\n  If ``permission`` is not supplied, no permission is registered for this view\n  (it's accessible by any caller).\n\n``attr``\n  The view machinery defaults to using the ``__call__`` method of the\n  :term:`view callable` (or the function itself, if the view callable is a\n  function) to obtain a response.  The ``attr`` value allows you to vary the\n  method attribute used to obtain the response.  For example, if your view was\n  a class, and the class has a method named ``index`` and you wanted to use\n  this method instead of the class's ``__call__`` method to return the\n  response, you'd say ``attr=\"index\"`` in the view configuration for the view.\n  This is most useful when the view definition is a class.\n\n  If ``attr`` is not supplied, ``None`` is used (implying the function itself\n  if the view is a function, or the ``__call__`` callable attribute if the view\n  is a class).\n\n``renderer``\n  Denotes the :term:`renderer` implementation which will be used to construct a\n  :term:`response` from the associated view callable's return value.\n\n  .. seealso:: See also :ref:`renderers_chapter`.\n\n  This is either a single string term (e.g., ``json``) or a string implying a\n  path or :term:`asset specification` (e.g., ``templates/views.pt``) naming a\n  :term:`renderer` implementation.  If the ``renderer`` value does not contain\n  a dot (``.``), the specified string will be used to look up a renderer\n  implementation, and that renderer implementation will be used to construct a\n  response from the view return value.  If the ``renderer`` value contains a\n  dot (``.``), the specified term will be treated as a path, and the filename\n  extension of the last element in the path will be used to look up the\n  renderer implementation, which will be passed the full path.\n\n  When the renderer is a path—although a path is usually just a simple relative\n  pathname (e.g., ``templates/foo.pt``, implying that a template named \"foo.pt\"\n  is in the \"templates\" directory relative to the directory of the current\n  :term:`package`)—the path can be absolute, starting with a slash on UNIX or a\n  drive letter prefix on Windows.  The path can alternatively be a :term:`asset\n  specification` in the form ``some.dotted.package_name:relative/path``, making\n  it possible to address template assets which live in a separate package.\n\n  The ``renderer`` attribute is optional.  If it is not defined, the \"null\"\n  renderer is assumed (no rendering is performed and the value is passed back\n  to the upstream :app:`Pyramid` machinery unchanged).  Note that if the view\n  callable itself returns a :term:`response` (see :ref:`the_response`), the\n  specified renderer implementation is never called.\n\n``http_cache``\n  When you supply an ``http_cache`` value to a view configuration, the\n  ``Expires`` and ``Cache-Control`` headers of a response generated by the\n  associated view callable are modified.  The value for ``http_cache`` may be\n  one of the following:\n\n  - A nonzero integer.  If it's a nonzero integer, it's treated as a number of\n    seconds.  This number of seconds will be used to compute the ``Expires``\n    header and the ``Cache-Control: max-age`` parameter of responses to\n    requests which call this view.  For example: ``http_cache=3600`` instructs\n    the requesting browser to 'cache this response for an hour, please'.\n\n  - A ``datetime.timedelta`` instance.  If it's a ``datetime.timedelta``\n    instance, it will be converted into a number of seconds, and that number of\n    seconds will be used to compute the ``Expires`` header and the\n    ``Cache-Control: max-age`` parameter of responses to requests which call\n    this view.  For example: ``http_cache=datetime.timedelta(days=1)``\n    instructs the requesting browser to 'cache this response for a day,\n    please'.\n\n  - Zero (``0``).  If the value is zero, the ``Cache-Control`` and ``Expires``\n    headers present in all responses from this view will be composed such that\n    client browser cache (and any intermediate caches) are instructed to never\n    cache the response.\n\n  - A two-tuple.  If it's a two-tuple (e.g., ``http_cache=(1,\n    {'public':True})``), the first value in the tuple may be a nonzero integer\n    or a ``datetime.timedelta`` instance. In either case this value will be\n    used as the number of seconds to cache the response.  The second value in\n    the tuple must be a dictionary.  The values present in the dictionary will\n    be used as input to the ``Cache-Control`` response header.  For example:\n    ``http_cache=(3600, {'public':True})`` means 'cache for an hour, and add\n    ``public`` to the Cache-Control header of the response'.  All keys and\n    values supported by the ``webob.cachecontrol.CacheControl`` interface may\n    be added to the dictionary.  Supplying ``{'public':True}`` is equivalent to\n    calling ``response.cache_control.public = True``.\n\n  Providing a non-tuple value as ``http_cache`` is equivalent to calling\n  ``response.cache_expires(value)`` within your view's body.\n\n  Providing a two-tuple value as ``http_cache`` is equivalent to calling\n  ``response.cache_expires(value[0], **value[1])`` within your view's body.\n\n  If you wish to avoid influencing the ``Expires`` header, and instead wish to\n  only influence ``Cache-Control`` headers, pass a tuple as ``http_cache`` with\n  the first element of ``None``, i.e., ``(None, {'public':True})``.\n\n\n``require_csrf``\n\n  CSRF checks only affect POST requests. Any other request methods will pass\n  untouched. This option is used in combination with the\n  ``pyramid.require_default_csrf`` setting to control which request parameters\n  are checked for CSRF tokens.\n\n  This feature requires a configured :term:`session factory`.\n\n  If this option is set to ``True`` then CSRF checks will be enabled for POST\n  requests to this view. The required token will be whatever was specified by\n  the ``pyramid.require_default_csrf`` setting, or will fallback to\n  ``csrf_token``.\n\n  If this option is set to a string then CSRF checks will be enabled and it\n  will be used as the required token regardless of the\n  ``pyramid.require_default_csrf`` setting.\n\n  If this option is set to ``False`` then CSRF checks will be disabled\n  regardless of the ``pyramid.require_default_csrf`` setting.\n\n  See :ref:`auto_csrf_checking` for more information.\n\n  .. versionadded:: 1.7\n\n``wrapper``\n  The :term:`view name` of a different :term:`view configuration` which will\n  receive the response body of this view as the ``request.wrapped_body``\n  attribute of its own :term:`request`, and the :term:`response` returned by\n  this view as the ``request.wrapped_response`` attribute of its own request.\n  Using a wrapper makes it possible to \"chain\" views together to form a\n  composite response.  The response of the outermost wrapper view will be\n  returned to the user.  The wrapper view will be found as any view is found.\n  See :ref:`view_lookup`.  The \"best\" wrapper view will be found based on the\n  lookup ordering. \"Under the hood\" this wrapper view is looked up via\n  ``pyramid.view.render_view_to_response(context, request,\n  'wrapper_viewname')``. The context and request of a wrapper view is the same\n  context and request of the inner view.\n\n  If ``wrapper`` is not supplied, no wrapper view is used.\n\n``decorator``\n  A :term:`dotted Python name` to a function (or the function itself) which\n  will be used to decorate the registered :term:`view callable`.  The decorator\n  function will be called with the view callable as a single argument.  The\n  view callable it is passed will accept ``(context, request)``.  The decorator\n  must return a replacement view callable which also accepts ``(context,\n  request)``. The ``decorator`` may also be an iterable of decorators, in which\n  case they will be applied one after the other to the view, in reverse order.\n  For example::\n\n    @view_config(..., decorator=(decorator2, decorator1))\n    def myview(request):\n      ...\n\n  Is similar to doing::\n\n    @view_config(...)\n    @decorator2\n    @decorator1\n    def myview(request):\n      ...\n\n  All view callables in the decorator chain must return a response object\n  implementing :class:`pyramid.interfaces.IResponse` or raise an exception:\n\n  .. code-block:: python\n\n     def log_timer(wrapped):\n         def wrapper(context, request):\n             start = time.time()\n             response = wrapped(context, request)\n             duration = time.time() - start\n             response.headers['X-View-Time'] = '%.3f' % (duration,)\n             log.info('view took %.3f seconds', duration)\n             return response\n         return wrapper\n\n``mapper``\n  A Python object or :term:`dotted Python name` which refers to a :term:`view\n  mapper`, or ``None``.  By default it is ``None``, which indicates that the\n  view should use the default view mapper.  This plug-point is useful for\n  Pyramid extension developers, but it's not very useful for \"civilians\" who\n  are just developing stock Pyramid applications. Pay no attention to the man\n  behind the curtain.\n\nPredicate Arguments\n+++++++++++++++++++\n\nThese arguments modify view lookup behavior. In general the more predicate\narguments that are supplied, the more specific and narrower the usage of the\nconfigured view.\n\n``name``\n  The :term:`view name` required to match this view callable.  A ``name``\n  argument is typically only used when your application uses :term:`traversal`.\n  Read :ref:`traversal_chapter` to understand the concept of a view name.\n\n  If ``name`` is not supplied, the empty string is used (implying the default\n  view).\n\n``context``\n  An object representing a Python class of which the :term:`context` resource\n  must be an instance *or* the :term:`interface` that the :term:`context`\n  resource must provide in order for this view to be found and called.  This\n  predicate is true when the :term:`context` resource is an instance of the\n  represented class or if the :term:`context` resource provides the represented\n  interface; it is otherwise false.\n\n  If ``context`` is not supplied, the value ``None``, which matches any\n  resource, is used.\n\n``route_name``\n  If ``route_name`` is supplied, the view callable will be invoked only when\n  the named route has matched.\n\n  This value must match the ``name`` of a :term:`route configuration`\n  declaration (see :ref:`urldispatch_chapter`) that must match before this view\n  will be called.  Note that the ``route`` configuration referred to by\n  ``route_name`` will usually have a ``*traverse`` token in the value of its\n  ``pattern``, representing a part of the path that will be used by\n  :term:`traversal` against the result of the route's :term:`root factory`.\n\n  If ``route_name`` is not supplied, the view callable will only have a chance\n  of being invoked if no other route was matched. This is when the\n  request/context pair found via :term:`resource location` does not indicate it\n  matched any configured route.\n\n``request_type``\n  This value should be an :term:`interface` that the :term:`request` must\n  provide in order for this view to be found and called.\n\n  If ``request_type`` is not supplied, the value ``None`` is used, implying any\n  request type.\n\n  *This is an advanced feature, not often used by \"civilians\"*.\n\n``request_method``\n  This value can be either a string (such as ``\"GET\"``, ``\"POST\"``,\n  ``\"PUT\"``, ``\"DELETE\"``, ``\"HEAD\"``, or ``\"OPTIONS\"``) representing an HTTP\n  ``REQUEST_METHOD`` or a tuple containing one or more of these strings.  A\n  view declaration with this argument ensures that the view will only be called\n  when the ``method`` attribute of the request (i.e., the ``REQUEST_METHOD`` of\n  the WSGI environment) matches a supplied value.\n\n  .. versionchanged:: 1.4\n    The use of ``\"GET\"`` also implies that the view will respond to ``\"HEAD\"``.\n\n  If ``request_method`` is not supplied, the view will be invoked regardless of\n  the ``REQUEST_METHOD`` of the :term:`WSGI` environment.\n\n``request_param``\n  This value can be any string or a sequence of strings.  A view declaration\n  with this argument ensures that the view will only be called when the\n  :term:`request` has a key in the ``request.params`` dictionary (an HTTP\n  ``GET`` or ``POST`` variable) that has a name which matches the supplied\n  value.\n\n  If any value supplied has an ``=`` sign in it, e.g.,\n  ``request_param=\"foo=123\"``, then the key (``foo``) must both exist in the\n  ``request.params`` dictionary, *and* the value must match the right hand side\n  of the expression (``123``) for the view to \"match\" the current request.\n\n  If ``request_param`` is not supplied, the view will be invoked without\n  consideration of keys and values in the ``request.params`` dictionary.\n\n``match_param``\n  This param may be either a single string of the format \"key=value\" or a tuple\n  containing one or more of these strings.\n\n  This argument ensures that the view will only be called when the\n  :term:`request` has key/value pairs in its :term:`matchdict` that equal those\n  supplied in the predicate.  For example, ``match_param=\"action=edit\"`` would\n  require the ``action`` parameter in the :term:`matchdict` match the right\n  hand side of the expression (``edit``) for the view to \"match\" the current\n  request.\n\n  If the ``match_param`` is a tuple, every key/value pair must match for the\n  predicate to pass.\n\n  If ``match_param`` is not supplied, the view will be invoked without\n  consideration of the keys and values in ``request.matchdict``.\n\n  .. versionadded:: 1.2\n\n``containment``\n  This value should be a reference to a Python class or :term:`interface` that\n  a parent object in the context resource's :term:`lineage` must provide in\n  order for this view to be found and called.  The resources in your resource\n  tree must be \"location-aware\" to use this feature.\n\n  If ``containment`` is not supplied, the interfaces and classes in the lineage\n  are not considered when deciding whether or not to invoke the view callable.\n\n  See :ref:`location_aware` for more information about location-awareness.\n\n``xhr``\n  This value should be either ``True`` or ``False``.  If this value is\n  specified and is ``True``, the :term:`WSGI` environment must possess an\n  ``HTTP_X_REQUESTED_WITH`` header (i.e., ``X-Requested-With``) that has the\n  value ``XMLHttpRequest`` for the associated view callable to be found and\n  called.  This is useful for detecting AJAX requests issued from jQuery,\n  Prototype, and other Javascript libraries.\n\n  If ``xhr`` is not specified, the ``HTTP_X_REQUESTED_WITH`` HTTP header is not\n  taken into consideration when deciding whether or not to invoke the\n  associated view callable.\n\n``accept``\n  The value of this argument represents a match query for one or more mimetypes\n  in the ``Accept`` HTTP request header.  If this value is specified, it must\n  be in one of the following forms: a mimetype match token in the form\n  ``text/plain``, a wildcard mimetype match token in the form ``text/*``, or a\n  match-all wildcard mimetype match token in the form ``*/*``.  If any of the\n  forms matches the ``Accept`` header of the request, this predicate will be\n  true.\n\n  If ``accept`` is not specified, the ``HTTP_ACCEPT`` HTTP header is not taken\n  into consideration when deciding whether or not to invoke the associated view\n  callable.\n\n``header``\n  This value represents an HTTP header name or a header name/value pair.\n\n  If ``header`` is specified, it must be a header name or a\n  ``headername:headervalue`` pair.\n\n  If ``header`` is specified without a value (a bare header name only, e.g.,\n  ``If-Modified-Since``), the view will only be invoked if the HTTP header\n  exists with any value in the request.\n\n  If ``header`` is specified, and possesses a name/value pair (e.g.,\n  ``User-Agent:Mozilla/.*``), the view will only be invoked if the HTTP header\n  exists *and* the HTTP header matches the value requested.  When the\n  ``headervalue`` contains a ``:`` (colon), it will be considered a name/value\n  pair (e.g., ``User-Agent:Mozilla/.*`` or ``Host:localhost``).  The value\n  portion should be a regular expression.\n\n  Whether or not the value represents a header name or a header name/value\n  pair, the case of the header name is not significant.\n\n  If ``header`` is not specified, the composition, presence, or absence of HTTP\n  headers is not taken into consideration when deciding whether or not to\n  invoke the associated view callable.\n\n``path_info``\n  This value represents a regular expression pattern that will be tested\n  against the ``PATH_INFO`` WSGI environment variable to decide whether or not\n  to call the associated view callable.  If the regex matches, this predicate\n  will be ``True``.\n\n  If ``path_info`` is not specified, the WSGI ``PATH_INFO`` is not taken into\n  consideration when deciding whether or not to invoke the associated view\n  callable.\n\n``check_csrf``\n  If specified, this value should be one of ``None``, ``True``, ``False``, or a\n  string representing the \"check name\".  If the value is ``True`` or a string,\n  CSRF checking will be performed.  If the value is ``False`` or ``None``, CSRF\n  checking will not be performed.\n\n  If the value provided is a string, that string will be used as the \"check\n  name\".  If the value provided is ``True``, ``csrf_token`` will be used as the\n  check name.\n\n  If CSRF checking is performed, the checked value will be the value of\n  ``request.POST[check_name]``.  This value will be compared against the\n  value of ``request.session.get_csrf_token()``, and the check will pass if\n  these two values are the same.  If the check passes, the associated view will\n  be permitted to execute.  If the check fails, the associated view will not be\n  permitted to execute.\n\n  Note that using this feature requires a :term:`session factory` to have been\n  configured.\n\n  .. versionadded:: 1.4a2\n\n``physical_path``\n  If specified, this value should be a string or a tuple representing the\n  :term:`physical path` of the context found via traversal for this predicate\n  to match as true.  For example, ``physical_path='/'``,\n  ``physical_path='/a/b/c'``, or ``physical_path=('', 'a', 'b', 'c')``.  This\n  is not a path prefix match or a regex, but a whole-path match.  It's useful\n  when you want to always potentially show a view when some object is traversed\n  to, but you can't be sure about what kind of object it will be, so you can't\n  use the ``context`` predicate.  The individual path elements between slash\n  characters or in tuple elements should be the Unicode representation of the\n  name of the resource and should not be encoded in any way.\n\n  .. versionadded:: 1.4a3\n\n``effective_principals``\n  If specified, this value should be a :term:`principal` identifier or a\n  sequence of principal identifiers.  If the\n  :meth:`pyramid.request.Request.effective_principals` method indicates that\n  every principal named in the argument list is present in the current request,\n  this predicate will return True; otherwise it will return False.  For\n  example: ``effective_principals=pyramid.security.Authenticated`` or\n  ``effective_principals=('fred', 'group:admins')``.\n\n  .. versionadded:: 1.4a4\n\n``custom_predicates``\n  If ``custom_predicates`` is specified, it must be a sequence of references to\n  custom predicate callables.  Use custom predicates when no set of predefined\n  predicates do what you need.  Custom predicates can be combined with\n  predefined predicates as necessary.  Each custom predicate callable should\n  accept two arguments, ``context`` and ``request``, and should return either\n  ``True`` or ``False`` after doing arbitrary evaluation of the context\n  resource and/or the request.  If all callables return ``True``, the\n  associated view callable will be considered viable for a given request.\n\n  If ``custom_predicates`` is not specified, no custom predicates are used.\n\n``predicates``\n  Pass a key/value pair here to use a third-party predicate registered via\n  :meth:`pyramid.config.Configurator.add_view_predicate`.  More than one\n  key/value pair can be used at the same time.  See\n  :ref:`view_and_route_predicates` for more information about third-party\n  predicates.\n\n  .. versionadded:: 1.4a1\n\nInverting Predicate Values\n++++++++++++++++++++++++++\n\nYou can invert the meaning of any predicate value by wrapping it in a call to\n:class:`pyramid.config.not_`.\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.config import not_\n\n   config.add_view(\n       'mypackage.views.my_view',\n       route_name='ok',\n       request_method=not_('POST')\n       )\n\nThe above example will ensure that the view is called if the request method is\n*not* ``POST``, at least if no other view is more specific.\n\nThis technique of wrapping a predicate value in ``not_`` can be used anywhere\npredicate values are accepted:\n\n- :meth:`pyramid.config.Configurator.add_view`\n\n- :meth:`pyramid.view.view_config`\n\n.. versionadded:: 1.5\n\n\n.. index::\n   single: view_config decorator\n\n.. _mapping_views_using_a_decorator_section:\n\nAdding View Configuration Using the ``@view_config`` Decorator\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. warning::\n\n   Using this feature tends to slow down application startup slightly, as more\n   work is performed at application startup to scan for view configuration\n   declarations.  For maximum startup performance, use the view configuration\n   method described in :ref:`mapping_views_using_imperative_config_section`\n   instead.\n\nThe :class:`~pyramid.view.view_config` decorator can be used to associate\n:term:`view configuration` information with a function, method, or class that\nacts as a :app:`Pyramid` view callable.\n\nHere's an example of the :class:`~pyramid.view.view_config` decorator that\nlives within a :app:`Pyramid` application module ``views.py``:\n\n.. code-block:: python\n   :linenos:\n\n   from resources import MyResource\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='ok', request_method='POST', permission='read')\n   def my_view(request):\n       return Response('OK')\n\nUsing this decorator as above replaces the need to add this imperative\nconfiguration stanza:\n\n.. code-block:: python\n   :linenos:\n\n   config.add_view('mypackage.views.my_view', route_name='ok',\n                   request_method='POST', permission='read')\n\nAll arguments to ``view_config`` may be omitted.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config()\n   def my_view(request):\n       \"\"\" My view \"\"\"\n       return Response()\n\nSuch a registration as the one directly above implies that the view name will\nbe ``my_view``, registered with a ``context`` argument that matches any\nresource type, using no permission, registered against requests with any\nrequest method, request type, request param, route name, or containment.\n\nThe mere existence of a ``@view_config`` decorator doesn't suffice to perform\nview configuration.  All that the decorator does is \"annotate\" the function\nwith your configuration declarations, it doesn't process them. To make\n:app:`Pyramid` process your :class:`pyramid.view.view_config` declarations, you\n*must* use the ``scan`` method of a :class:`pyramid.config.Configurator`:\n\n.. code-block:: python\n   :linenos:\n\n   # config is assumed to be an instance of the\n   # pyramid.config.Configurator class\n   config.scan()\n\nPlease see :ref:`decorations_and_code_scanning` for detailed information about\nwhat happens when code is scanned for configuration declarations resulting from\nuse of decorators like :class:`~pyramid.view.view_config`.\n\nSee :ref:`configuration_module` for additional API arguments to the\n:meth:`~pyramid.config.Configurator.scan` method.  For example, the method\nallows you to supply a ``package`` argument to better control exactly *which*\ncode will be scanned.\n\nAll arguments to the :class:`~pyramid.view.view_config` decorator mean\nprecisely the same thing as they would if they were passed as arguments to the\n:meth:`pyramid.config.Configurator.add_view` method save for the ``view``\nargument.  Usage of the :class:`~pyramid.view.view_config` decorator is a form\nof :term:`declarative configuration`, while\n:meth:`pyramid.config.Configurator.add_view` is a form of :term:`imperative\nconfiguration`.  However, they both do the same thing.\n\n.. index::\n   single: view_config placement\n\n.. _view_config_placement:\n\n``@view_config`` Placement\n++++++++++++++++++++++++++\n\nA :class:`~pyramid.view.view_config` decorator can be placed in various points\nin your application.\n\nIf your view callable is a function, it may be used as a function decorator:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='edit')\n   def edit(request):\n       return Response('edited!')\n\nIf your view callable is a class, the decorator can also be used as a class\ndecorator. All the arguments to the decorator are the same when applied against\na class as when they are applied against a function.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config(route_name='hello')\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def __call__(self):\n           return Response('hello')\n\nMore than one :class:`~pyramid.view.view_config` decorator can be stacked on\ntop of any number of others.  Each decorator creates a separate view\nregistration.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='edit')\n   @view_config(route_name='change')\n   def edit(request):\n       return Response('edited!')\n\nThis registers the same view under two different names.\n\nThe decorator can also be used against a method of a class:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(route_name='hello')\n       def amethod(self):\n           return Response('hello')\n\nWhen the decorator is used against a method of a class, a view is registered\nfor the *class*, so the class constructor must accept an argument list in one\nof two forms: either a single argument, ``request``, or two arguments,\n``context, request``.\n\nThe method which is decorated must return a :term:`response`.\n\nUsing the decorator against a particular method of a class is equivalent to\nusing the ``attr`` parameter in a decorator attached to the class itself. For\nexample, the above registration implied by the decorator being used against the\n``amethod`` method could be written equivalently as follows:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config(attr='amethod', route_name='hello')\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def amethod(self):\n           return Response('hello')\n\n\n.. index::\n   single: add_view\n\n.. _mapping_views_using_imperative_config_section:\n\nAdding View Configuration Using :meth:`~pyramid.config.Configurator.add_view`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe :meth:`pyramid.config.Configurator.add_view` method within\n:ref:`configuration_module` is used to configure a view \"imperatively\" (without\na :class:`~pyramid.view.view_config` decorator).  The arguments to this method\nare very similar to the arguments that you provide to the\n:class:`~pyramid.view.view_config` decorator.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n\n   def hello_world(request):\n       return Response('hello!')\n\n   # config is assumed to be an instance of the\n   # pyramid.config.Configurator class\n   config.add_view(hello_world, route_name='hello')\n\nThe first argument, a :term:`view callable`, is the only required argument. It\nmust either be a Python object which is the view itself or a :term:`dotted\nPython name` to such an object. In the above example, the ``view callable`` is\nthe ``hello_world`` function.\n\nWhen you use only :meth:`~pyramid.config.Configurator.add_view` to add view\nconfigurations, you don't need to issue a :term:`scan` in order for the view\nconfiguration to take effect.\n\n.. index::\n   single: view_defaults class decorator\n\n.. _view_defaults:\n\n``@view_defaults`` Class Decorator\n----------------------------------\n\n.. versionadded:: 1.3\n\nIf you use a class as a view, you can use the\n:class:`pyramid.view.view_defaults` class decorator on the class to provide\ndefaults to the view configuration information used by every ``@view_config``\ndecorator that decorates a method of that class.\n\nFor instance, if you've got a class that has methods that represent \"REST\nactions\", all of which are mapped to the same route but different request\nmethods, instead of this:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(route_name='rest', request_method='GET')\n       def get(self):\n           return Response('get')\n\n       @view_config(route_name='rest', request_method='POST')\n       def post(self):\n           return Response('post')\n\n       @view_config(route_name='rest', request_method='DELETE')\n       def delete(self):\n           return Response('delete')\n\nYou can do this:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_defaults\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_defaults(route_name='rest')\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(request_method='GET')\n       def get(self):\n           return Response('get')\n\n       @view_config(request_method='POST')\n       def post(self):\n           return Response('post')\n\n       @view_config(request_method='DELETE')\n       def delete(self):\n           return Response('delete')\n\nIn the above example, we were able to take the ``route_name='rest'`` argument\nout of the call to each individual ``@view_config`` statement because we used a\n``@view_defaults`` class decorator to provide the argument as a default to each\nview method it possessed.\n\nArguments passed to ``@view_config`` will override any default passed to\n``@view_defaults``.\n\nThe ``view_defaults`` class decorator can also provide defaults to the\n:meth:`pyramid.config.Configurator.add_view` directive when a decorated class\nis passed to that directive as its ``view`` argument.  For example, instead of\nthis:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.config import Configurator\n\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def get(self):\n           return Response('get')\n\n       def post(self):\n           return Response('post')\n\n       def delete(self):\n           return Response('delete')\n\n   def main(global_config, **settings):\n       config = Configurator()\n       config.add_route('rest', '/rest')\n       config.add_view(\n           RESTView, route_name='rest', attr='get', request_method='GET')\n       config.add_view(\n           RESTView, route_name='rest', attr='post', request_method='POST')\n       config.add_view(\n           RESTView, route_name='rest', attr='delete', request_method='DELETE')\n       return config.make_wsgi_app()\n\nTo reduce the amount of repetition in the ``config.add_view`` statements, we\ncan move the ``route_name='rest'`` argument to a ``@view_defaults`` class\ndecorator on the ``RESTView`` class:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_defaults\n   from pyramid.response import Response\n   from pyramid.config import Configurator\n\n   @view_defaults(route_name='rest')\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def get(self):\n           return Response('get')\n\n       def post(self):\n           return Response('post')\n\n       def delete(self):\n           return Response('delete')\n\n   def main(global_config, **settings):\n       config = Configurator()\n       config.add_route('rest', '/rest')\n       config.add_view(RESTView, attr='get', request_method='GET')\n       config.add_view(RESTView, attr='post', request_method='POST')\n       config.add_view(RESTView, attr='delete', request_method='DELETE')\n       return config.make_wsgi_app()\n\n:class:`pyramid.view.view_defaults` accepts the same set of arguments that\n:class:`pyramid.view.view_config` does, and they have the same meaning.  Each\nargument passed to ``view_defaults`` provides a default for the view\nconfigurations of methods of the class it's decorating.\n\nNormal Python inheritance rules apply to defaults added via ``view_defaults``.\nFor example:\n\n.. code-block:: python\n   :linenos:\n\n   @view_defaults(route_name='rest')\n   class Foo(object):\n       pass\n\n   class Bar(Foo):\n       pass\n\nThe ``Bar`` class above will inherit its view defaults from the arguments\npassed to the ``view_defaults`` decorator of the ``Foo`` class.  To prevent\nthis from happening, use a ``view_defaults`` decorator without any arguments on\nthe subclass:\n\n.. code-block:: python\n   :linenos:\n\n   @view_defaults(route_name='rest')\n   class Foo(object):\n       pass\n\n   @view_defaults()\n   class Bar(Foo):\n       pass\n\nThe ``view_defaults`` decorator only works as a class decorator; using it\nagainst a function or a method will produce nonsensical results.\n\n.. index::\n   single: view security\n   pair: security; view\n\n.. _view_security_section:\n\nConfiguring View Security\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf an :term:`authorization policy` is active, any :term:`permission` attached\nto a :term:`view configuration` found during view lookup will be verified. This\nwill ensure that the currently authenticated user possesses that permission\nagainst the :term:`context` resource before the view function is actually\ncalled.  Here's an example of specifying a permission in a view configuration\nusing :meth:`~pyramid.config.Configurator.add_view`:\n\n.. code-block:: python\n   :linenos:\n\n   # config is an instance of pyramid.config.Configurator\n\n   config.add_route('add', '/add.html', factory='mypackage.Blog')\n   config.add_view('myproject.views.add_entry', route_name='add',\n                   permission='add')\n\nWhen an :term:`authorization policy` is enabled, this view will be protected\nwith the ``add`` permission.  The view will *not be called* if the user does\nnot possess the ``add`` permission relative to the current :term:`context`.\nInstead the :term:`forbidden view` result will be returned to the client as per\n:ref:`protecting_views`.\n\n.. index::\n   single: debugging not found errors\n   single: not found error (debugging)\n\n.. _debug_notfound_section:\n\n:exc:`~pyramid.exceptions.NotFound` Errors\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt's useful to be able to debug :exc:`~pyramid.exceptions.NotFound` error\nresponses when they occur unexpectedly due to an application registry\nmisconfiguration.  To debug these errors, use the ``PYRAMID_DEBUG_NOTFOUND``\nenvironment variable or the ``pyramid.debug_notfound`` configuration file\nsetting.  Details of why a view was not found will be printed to ``stderr``,\nand the browser representation of the error will include the same information.\nSee :ref:`environment_chapter` for more information about how, and where to set\nthese values.\n\n.. index::\n   single: HTTP caching\n\n.. _influencing_http_caching:\n\nInfluencing HTTP Caching\n------------------------\n\n.. versionadded:: 1.1\n\nWhen a non-``None`` ``http_cache`` argument is passed to a view configuration,\nPyramid will set ``Expires`` and ``Cache-Control`` response headers in the\nresulting response, causing browsers to cache the response data for some time.\nSee ``http_cache`` in :ref:`nonpredicate_view_args` for the allowable values\nand what they mean.\n\nSometimes it's undesirable to have these headers set as the result of returning\na response from a view, even though you'd like to decorate the view with a view\nconfiguration decorator that has ``http_cache``.  Perhaps there's an\nalternative branch in your view code that returns a response that should never\nbe cacheable, while the \"normal\" branch returns something that should always be\ncacheable.  If this is the case, set the ``prevent_auto`` attribute of the\n``response.cache_control`` object to a non-``False`` value.  For example, the\nbelow view callable is configured with a ``@view_config`` decorator that\nindicates any response from the view should be cached for 3600 seconds.\nHowever, the view itself prevents caching from taking place unless there's a\n``should_cache`` GET or POST variable:\n\n.. code-block:: python\n\n   from pyramid.view import view_config\n\n   @view_config(http_cache=3600)\n   def view(request):\n       response = Response()\n       if 'should_cache' not in request.params:\n           response.cache_control.prevent_auto = True\n       return response\n\nNote that the ``http_cache`` machinery will overwrite or add to caching headers\nyou set within the view itself, unless you use ``prevent_auto``.\n\nYou can also turn off the effect of ``http_cache`` entirely for the duration of\na Pyramid application lifetime.  To do so, set the\n``PYRAMID_PREVENT_HTTP_CACHE`` environment variable or the\n``pyramid.prevent_http_cache`` configuration value setting to a true value. For\nmore information, see :ref:`preventing_http_caching`.\n\nNote that setting ``pyramid.prevent_http_cache`` will have no effect on caching\nheaders that your application code itself sets.  It will only prevent caching\nheaders that would have been set by the Pyramid HTTP caching machinery invoked\nas the result of the ``http_cache`` argument to view configuration.\n\n.. index::\n   pair: view configuration; debugging\n\n.. _debugging_view_configuration:\n\nDebugging View Configuration\n----------------------------\n\nSee :ref:`displaying_matching_views` for information about how to display\neach of the view callables that might match for a given URL.  This can be an\neffective way to figure out why a particular view callable is being called\ninstead of the one you'd like to be called.\n",
            "new_file_content": ".. _view_config_chapter:\n\n.. _view_configuration:\n\n.. _view_lookup:\n\nView Configuration\n==================\n\n.. index::\n   single: view lookup\n\n:term:`View lookup` is the :app:`Pyramid` subsystem responsible for finding and\ninvoking a :term:`view callable`.  :term:`View configuration` controls how\n:term:`view lookup` operates in your application.  During any given request,\nview configuration information is compared against request data by the view\nlookup subsystem in order to find the \"best\" view callable for that request.\n\nIn earlier chapters, you have been exposed to a few simple view configuration\ndeclarations without much explanation. In this chapter we will explore the\nsubject in detail.\n\n.. index::\n   pair: resource; mapping to view callable\n   pair: URL pattern; mapping to view callable\n\nMapping a Resource or URL Pattern to a View Callable\n----------------------------------------------------\n\nA developer makes a :term:`view callable` available for use within a\n:app:`Pyramid` application via :term:`view configuration`.  A view\nconfiguration associates a view callable with a set of statements that\ndetermine the set of circumstances which must be true for the view callable to\nbe invoked.\n\nA view configuration statement is made about information present in the\n:term:`context` resource and the :term:`request`.\n\nView configuration is performed in one of two ways:\n\n- By running a :term:`scan` against application source code which has a\n  :class:`pyramid.view.view_config` decorator attached to a Python object as\n  per :ref:`mapping_views_using_a_decorator_section`.\n\n- By using the :meth:`pyramid.config.Configurator.add_view` method as per\n  :ref:`mapping_views_using_imperative_config_section`.\n\n.. index::\n   single: view configuration parameters\n\n.. _view_configuration_parameters:\n\nView Configuration Parameters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAll forms of view configuration accept the same general types of arguments.\n\nMany arguments supplied during view configuration are :term:`view predicate`\narguments.  View predicate arguments used during view configuration are used to\nnarrow the set of circumstances in which :term:`view lookup` will find a\nparticular view callable.\n\n:term:`View predicate` attributes are an important part of view configuration\nthat enables the :term:`view lookup` subsystem to find and invoke the\nappropriate view.  The greater the number of predicate attributes possessed by\na view's configuration, the more specific the circumstances need to be before\nthe registered view callable will be invoked.  The fewer the number of\npredicates which are supplied to a particular view configuration, the more\nlikely it is that the associated view callable will be invoked.  A view with\nfive predicates will always be found and evaluated before a view with two, for\nexample.\n\nThis does not mean however, that :app:`Pyramid` \"stops looking\" when it finds a\nview registration with predicates that don't match.  If one set of view\npredicates does not match, the \"next most specific\" view (if any) is consulted\nfor predicates, and so on, until a view is found, or no view can be matched up\nwith the request.  The first view with a set of predicates all of which match\nthe request environment will be invoked.\n\nIf no view can be found with predicates which allow it to be matched up with\nthe request, :app:`Pyramid` will return an error to the user's browser,\nrepresenting a \"not found\" (404) page.  See :ref:`changing_the_notfound_view`\nfor more information about changing the default :term:`Not Found View`.\n\nOther view configuration arguments are non-predicate arguments.  These tend to\nmodify the response of the view callable or prevent the view callable from\nbeing invoked due to an authorization policy.  The presence of non-predicate\narguments in a view configuration does not narrow the circumstances in which\nthe view callable will be invoked.\n\n.. _nonpredicate_view_args:\n\nNon-Predicate Arguments\n+++++++++++++++++++++++\n\n``permission``\n  The name of a :term:`permission` that the user must possess in order to\n  invoke the :term:`view callable`.  See :ref:`view_security_section` for more\n  information about view security and permissions.\n\n  If ``permission`` is not supplied, no permission is registered for this view\n  (it's accessible by any caller).\n\n``attr``\n  The view machinery defaults to using the ``__call__`` method of the\n  :term:`view callable` (or the function itself, if the view callable is a\n  function) to obtain a response.  The ``attr`` value allows you to vary the\n  method attribute used to obtain the response.  For example, if your view was\n  a class, and the class has a method named ``index`` and you wanted to use\n  this method instead of the class's ``__call__`` method to return the\n  response, you'd say ``attr=\"index\"`` in the view configuration for the view.\n  This is most useful when the view definition is a class.\n\n  If ``attr`` is not supplied, ``None`` is used (implying the function itself\n  if the view is a function, or the ``__call__`` callable attribute if the view\n  is a class).\n\n``renderer``\n  Denotes the :term:`renderer` implementation which will be used to construct a\n  :term:`response` from the associated view callable's return value.\n\n  .. seealso:: See also :ref:`renderers_chapter`.\n\n  This is either a single string term (e.g., ``json``) or a string implying a\n  path or :term:`asset specification` (e.g., ``templates/views.pt``) naming a\n  :term:`renderer` implementation.  If the ``renderer`` value does not contain\n  a dot (``.``), the specified string will be used to look up a renderer\n  implementation, and that renderer implementation will be used to construct a\n  response from the view return value.  If the ``renderer`` value contains a\n  dot (``.``), the specified term will be treated as a path, and the filename\n  extension of the last element in the path will be used to look up the\n  renderer implementation, which will be passed the full path.\n\n  When the renderer is a path—although a path is usually just a simple relative\n  pathname (e.g., ``templates/foo.pt``, implying that a template named \"foo.pt\"\n  is in the \"templates\" directory relative to the directory of the current\n  :term:`package`)—the path can be absolute, starting with a slash on UNIX or a\n  drive letter prefix on Windows.  The path can alternatively be a :term:`asset\n  specification` in the form ``some.dotted.package_name:relative/path``, making\n  it possible to address template assets which live in a separate package.\n\n  The ``renderer`` attribute is optional.  If it is not defined, the \"null\"\n  renderer is assumed (no rendering is performed and the value is passed back\n  to the upstream :app:`Pyramid` machinery unchanged).  Note that if the view\n  callable itself returns a :term:`response` (see :ref:`the_response`), the\n  specified renderer implementation is never called.\n\n``http_cache``\n  When you supply an ``http_cache`` value to a view configuration, the\n  ``Expires`` and ``Cache-Control`` headers of a response generated by the\n  associated view callable are modified.  The value for ``http_cache`` may be\n  one of the following:\n\n  - A nonzero integer.  If it's a nonzero integer, it's treated as a number of\n    seconds.  This number of seconds will be used to compute the ``Expires``\n    header and the ``Cache-Control: max-age`` parameter of responses to\n    requests which call this view.  For example: ``http_cache=3600`` instructs\n    the requesting browser to 'cache this response for an hour, please'.\n\n  - A ``datetime.timedelta`` instance.  If it's a ``datetime.timedelta``\n    instance, it will be converted into a number of seconds, and that number of\n    seconds will be used to compute the ``Expires`` header and the\n    ``Cache-Control: max-age`` parameter of responses to requests which call\n    this view.  For example: ``http_cache=datetime.timedelta(days=1)``\n    instructs the requesting browser to 'cache this response for a day,\n    please'.\n\n  - Zero (``0``).  If the value is zero, the ``Cache-Control`` and ``Expires``\n    headers present in all responses from this view will be composed such that\n    client browser cache (and any intermediate caches) are instructed to never\n    cache the response.\n\n  - A two-tuple.  If it's a two-tuple (e.g., ``http_cache=(1,\n    {'public':True})``), the first value in the tuple may be a nonzero integer\n    or a ``datetime.timedelta`` instance. In either case this value will be\n    used as the number of seconds to cache the response.  The second value in\n    the tuple must be a dictionary.  The values present in the dictionary will\n    be used as input to the ``Cache-Control`` response header.  For example:\n    ``http_cache=(3600, {'public':True})`` means 'cache for an hour, and add\n    ``public`` to the Cache-Control header of the response'.  All keys and\n    values supported by the ``webob.cachecontrol.CacheControl`` interface may\n    be added to the dictionary.  Supplying ``{'public':True}`` is equivalent to\n    calling ``response.cache_control.public = True``.\n\n  Providing a non-tuple value as ``http_cache`` is equivalent to calling\n  ``response.cache_expires(value)`` within your view's body.\n\n  Providing a two-tuple value as ``http_cache`` is equivalent to calling\n  ``response.cache_expires(value[0], **value[1])`` within your view's body.\n\n  If you wish to avoid influencing the ``Expires`` header, and instead wish to\n  only influence ``Cache-Control`` headers, pass a tuple as ``http_cache`` with\n  the first element of ``None``, i.e., ``(None, {'public':True})``.\n\n\n``require_csrf``\n\n  CSRF checks will affect any request method that is not defined as a \"safe\"\n  method by RFC2616. In pratice this means that GET, HEAD, OPTIONS, and TRACE\n  methods will pass untouched and all others methods will require CSRF. This\n  option is used in combination with the ``pyramid.require_default_csrf``\n  setting to control which request parameters are checked for CSRF tokens.\n\n  This feature requires a configured :term:`session factory`.\n\n  If this option is set to ``True`` then CSRF checks will be enabled for POST\n  requests to this view. The required token will be whatever was specified by\n  the ``pyramid.require_default_csrf`` setting, or will fallback to\n  ``csrf_token``.\n\n  If this option is set to a string then CSRF checks will be enabled and it\n  will be used as the required token regardless of the\n  ``pyramid.require_default_csrf`` setting.\n\n  If this option is set to ``False`` then CSRF checks will be disabled\n  regardless of the ``pyramid.require_default_csrf`` setting.\n\n  See :ref:`auto_csrf_checking` for more information.\n\n  .. versionadded:: 1.7\n\n``wrapper``\n  The :term:`view name` of a different :term:`view configuration` which will\n  receive the response body of this view as the ``request.wrapped_body``\n  attribute of its own :term:`request`, and the :term:`response` returned by\n  this view as the ``request.wrapped_response`` attribute of its own request.\n  Using a wrapper makes it possible to \"chain\" views together to form a\n  composite response.  The response of the outermost wrapper view will be\n  returned to the user.  The wrapper view will be found as any view is found.\n  See :ref:`view_lookup`.  The \"best\" wrapper view will be found based on the\n  lookup ordering. \"Under the hood\" this wrapper view is looked up via\n  ``pyramid.view.render_view_to_response(context, request,\n  'wrapper_viewname')``. The context and request of a wrapper view is the same\n  context and request of the inner view.\n\n  If ``wrapper`` is not supplied, no wrapper view is used.\n\n``decorator``\n  A :term:`dotted Python name` to a function (or the function itself) which\n  will be used to decorate the registered :term:`view callable`.  The decorator\n  function will be called with the view callable as a single argument.  The\n  view callable it is passed will accept ``(context, request)``.  The decorator\n  must return a replacement view callable which also accepts ``(context,\n  request)``. The ``decorator`` may also be an iterable of decorators, in which\n  case they will be applied one after the other to the view, in reverse order.\n  For example::\n\n    @view_config(..., decorator=(decorator2, decorator1))\n    def myview(request):\n      ...\n\n  Is similar to doing::\n\n    @view_config(...)\n    @decorator2\n    @decorator1\n    def myview(request):\n      ...\n\n  All view callables in the decorator chain must return a response object\n  implementing :class:`pyramid.interfaces.IResponse` or raise an exception:\n\n  .. code-block:: python\n\n     def log_timer(wrapped):\n         def wrapper(context, request):\n             start = time.time()\n             response = wrapped(context, request)\n             duration = time.time() - start\n             response.headers['X-View-Time'] = '%.3f' % (duration,)\n             log.info('view took %.3f seconds', duration)\n             return response\n         return wrapper\n\n``mapper``\n  A Python object or :term:`dotted Python name` which refers to a :term:`view\n  mapper`, or ``None``.  By default it is ``None``, which indicates that the\n  view should use the default view mapper.  This plug-point is useful for\n  Pyramid extension developers, but it's not very useful for \"civilians\" who\n  are just developing stock Pyramid applications. Pay no attention to the man\n  behind the curtain.\n\nPredicate Arguments\n+++++++++++++++++++\n\nThese arguments modify view lookup behavior. In general the more predicate\narguments that are supplied, the more specific and narrower the usage of the\nconfigured view.\n\n``name``\n  The :term:`view name` required to match this view callable.  A ``name``\n  argument is typically only used when your application uses :term:`traversal`.\n  Read :ref:`traversal_chapter` to understand the concept of a view name.\n\n  If ``name`` is not supplied, the empty string is used (implying the default\n  view).\n\n``context``\n  An object representing a Python class of which the :term:`context` resource\n  must be an instance *or* the :term:`interface` that the :term:`context`\n  resource must provide in order for this view to be found and called.  This\n  predicate is true when the :term:`context` resource is an instance of the\n  represented class or if the :term:`context` resource provides the represented\n  interface; it is otherwise false.\n\n  If ``context`` is not supplied, the value ``None``, which matches any\n  resource, is used.\n\n``route_name``\n  If ``route_name`` is supplied, the view callable will be invoked only when\n  the named route has matched.\n\n  This value must match the ``name`` of a :term:`route configuration`\n  declaration (see :ref:`urldispatch_chapter`) that must match before this view\n  will be called.  Note that the ``route`` configuration referred to by\n  ``route_name`` will usually have a ``*traverse`` token in the value of its\n  ``pattern``, representing a part of the path that will be used by\n  :term:`traversal` against the result of the route's :term:`root factory`.\n\n  If ``route_name`` is not supplied, the view callable will only have a chance\n  of being invoked if no other route was matched. This is when the\n  request/context pair found via :term:`resource location` does not indicate it\n  matched any configured route.\n\n``request_type``\n  This value should be an :term:`interface` that the :term:`request` must\n  provide in order for this view to be found and called.\n\n  If ``request_type`` is not supplied, the value ``None`` is used, implying any\n  request type.\n\n  *This is an advanced feature, not often used by \"civilians\"*.\n\n``request_method``\n  This value can be either a string (such as ``\"GET\"``, ``\"POST\"``,\n  ``\"PUT\"``, ``\"DELETE\"``, ``\"HEAD\"``, or ``\"OPTIONS\"``) representing an HTTP\n  ``REQUEST_METHOD`` or a tuple containing one or more of these strings.  A\n  view declaration with this argument ensures that the view will only be called\n  when the ``method`` attribute of the request (i.e., the ``REQUEST_METHOD`` of\n  the WSGI environment) matches a supplied value.\n\n  .. versionchanged:: 1.4\n    The use of ``\"GET\"`` also implies that the view will respond to ``\"HEAD\"``.\n\n  If ``request_method`` is not supplied, the view will be invoked regardless of\n  the ``REQUEST_METHOD`` of the :term:`WSGI` environment.\n\n``request_param``\n  This value can be any string or a sequence of strings.  A view declaration\n  with this argument ensures that the view will only be called when the\n  :term:`request` has a key in the ``request.params`` dictionary (an HTTP\n  ``GET`` or ``POST`` variable) that has a name which matches the supplied\n  value.\n\n  If any value supplied has an ``=`` sign in it, e.g.,\n  ``request_param=\"foo=123\"``, then the key (``foo``) must both exist in the\n  ``request.params`` dictionary, *and* the value must match the right hand side\n  of the expression (``123``) for the view to \"match\" the current request.\n\n  If ``request_param`` is not supplied, the view will be invoked without\n  consideration of keys and values in the ``request.params`` dictionary.\n\n``match_param``\n  This param may be either a single string of the format \"key=value\" or a tuple\n  containing one or more of these strings.\n\n  This argument ensures that the view will only be called when the\n  :term:`request` has key/value pairs in its :term:`matchdict` that equal those\n  supplied in the predicate.  For example, ``match_param=\"action=edit\"`` would\n  require the ``action`` parameter in the :term:`matchdict` match the right\n  hand side of the expression (``edit``) for the view to \"match\" the current\n  request.\n\n  If the ``match_param`` is a tuple, every key/value pair must match for the\n  predicate to pass.\n\n  If ``match_param`` is not supplied, the view will be invoked without\n  consideration of the keys and values in ``request.matchdict``.\n\n  .. versionadded:: 1.2\n\n``containment``\n  This value should be a reference to a Python class or :term:`interface` that\n  a parent object in the context resource's :term:`lineage` must provide in\n  order for this view to be found and called.  The resources in your resource\n  tree must be \"location-aware\" to use this feature.\n\n  If ``containment`` is not supplied, the interfaces and classes in the lineage\n  are not considered when deciding whether or not to invoke the view callable.\n\n  See :ref:`location_aware` for more information about location-awareness.\n\n``xhr``\n  This value should be either ``True`` or ``False``.  If this value is\n  specified and is ``True``, the :term:`WSGI` environment must possess an\n  ``HTTP_X_REQUESTED_WITH`` header (i.e., ``X-Requested-With``) that has the\n  value ``XMLHttpRequest`` for the associated view callable to be found and\n  called.  This is useful for detecting AJAX requests issued from jQuery,\n  Prototype, and other Javascript libraries.\n\n  If ``xhr`` is not specified, the ``HTTP_X_REQUESTED_WITH`` HTTP header is not\n  taken into consideration when deciding whether or not to invoke the\n  associated view callable.\n\n``accept``\n  The value of this argument represents a match query for one or more mimetypes\n  in the ``Accept`` HTTP request header.  If this value is specified, it must\n  be in one of the following forms: a mimetype match token in the form\n  ``text/plain``, a wildcard mimetype match token in the form ``text/*``, or a\n  match-all wildcard mimetype match token in the form ``*/*``.  If any of the\n  forms matches the ``Accept`` header of the request, this predicate will be\n  true.\n\n  If ``accept`` is not specified, the ``HTTP_ACCEPT`` HTTP header is not taken\n  into consideration when deciding whether or not to invoke the associated view\n  callable.\n\n``header``\n  This value represents an HTTP header name or a header name/value pair.\n\n  If ``header`` is specified, it must be a header name or a\n  ``headername:headervalue`` pair.\n\n  If ``header`` is specified without a value (a bare header name only, e.g.,\n  ``If-Modified-Since``), the view will only be invoked if the HTTP header\n  exists with any value in the request.\n\n  If ``header`` is specified, and possesses a name/value pair (e.g.,\n  ``User-Agent:Mozilla/.*``), the view will only be invoked if the HTTP header\n  exists *and* the HTTP header matches the value requested.  When the\n  ``headervalue`` contains a ``:`` (colon), it will be considered a name/value\n  pair (e.g., ``User-Agent:Mozilla/.*`` or ``Host:localhost``).  The value\n  portion should be a regular expression.\n\n  Whether or not the value represents a header name or a header name/value\n  pair, the case of the header name is not significant.\n\n  If ``header`` is not specified, the composition, presence, or absence of HTTP\n  headers is not taken into consideration when deciding whether or not to\n  invoke the associated view callable.\n\n``path_info``\n  This value represents a regular expression pattern that will be tested\n  against the ``PATH_INFO`` WSGI environment variable to decide whether or not\n  to call the associated view callable.  If the regex matches, this predicate\n  will be ``True``.\n\n  If ``path_info`` is not specified, the WSGI ``PATH_INFO`` is not taken into\n  consideration when deciding whether or not to invoke the associated view\n  callable.\n\n``check_csrf``\n  If specified, this value should be one of ``None``, ``True``, ``False``, or a\n  string representing the \"check name\".  If the value is ``True`` or a string,\n  CSRF checking will be performed.  If the value is ``False`` or ``None``, CSRF\n  checking will not be performed.\n\n  If the value provided is a string, that string will be used as the \"check\n  name\".  If the value provided is ``True``, ``csrf_token`` will be used as the\n  check name.\n\n  If CSRF checking is performed, the checked value will be the value of\n  ``request.POST[check_name]``.  This value will be compared against the\n  value of ``request.session.get_csrf_token()``, and the check will pass if\n  these two values are the same.  If the check passes, the associated view will\n  be permitted to execute.  If the check fails, the associated view will not be\n  permitted to execute.\n\n  Note that using this feature requires a :term:`session factory` to have been\n  configured.\n\n  .. versionadded:: 1.4a2\n\n``physical_path``\n  If specified, this value should be a string or a tuple representing the\n  :term:`physical path` of the context found via traversal for this predicate\n  to match as true.  For example, ``physical_path='/'``,\n  ``physical_path='/a/b/c'``, or ``physical_path=('', 'a', 'b', 'c')``.  This\n  is not a path prefix match or a regex, but a whole-path match.  It's useful\n  when you want to always potentially show a view when some object is traversed\n  to, but you can't be sure about what kind of object it will be, so you can't\n  use the ``context`` predicate.  The individual path elements between slash\n  characters or in tuple elements should be the Unicode representation of the\n  name of the resource and should not be encoded in any way.\n\n  .. versionadded:: 1.4a3\n\n``effective_principals``\n  If specified, this value should be a :term:`principal` identifier or a\n  sequence of principal identifiers.  If the\n  :meth:`pyramid.request.Request.effective_principals` method indicates that\n  every principal named in the argument list is present in the current request,\n  this predicate will return True; otherwise it will return False.  For\n  example: ``effective_principals=pyramid.security.Authenticated`` or\n  ``effective_principals=('fred', 'group:admins')``.\n\n  .. versionadded:: 1.4a4\n\n``custom_predicates``\n  If ``custom_predicates`` is specified, it must be a sequence of references to\n  custom predicate callables.  Use custom predicates when no set of predefined\n  predicates do what you need.  Custom predicates can be combined with\n  predefined predicates as necessary.  Each custom predicate callable should\n  accept two arguments, ``context`` and ``request``, and should return either\n  ``True`` or ``False`` after doing arbitrary evaluation of the context\n  resource and/or the request.  If all callables return ``True``, the\n  associated view callable will be considered viable for a given request.\n\n  If ``custom_predicates`` is not specified, no custom predicates are used.\n\n``predicates``\n  Pass a key/value pair here to use a third-party predicate registered via\n  :meth:`pyramid.config.Configurator.add_view_predicate`.  More than one\n  key/value pair can be used at the same time.  See\n  :ref:`view_and_route_predicates` for more information about third-party\n  predicates.\n\n  .. versionadded:: 1.4a1\n\nInverting Predicate Values\n++++++++++++++++++++++++++\n\nYou can invert the meaning of any predicate value by wrapping it in a call to\n:class:`pyramid.config.not_`.\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.config import not_\n\n   config.add_view(\n       'mypackage.views.my_view',\n       route_name='ok',\n       request_method=not_('POST')\n       )\n\nThe above example will ensure that the view is called if the request method is\n*not* ``POST``, at least if no other view is more specific.\n\nThis technique of wrapping a predicate value in ``not_`` can be used anywhere\npredicate values are accepted:\n\n- :meth:`pyramid.config.Configurator.add_view`\n\n- :meth:`pyramid.view.view_config`\n\n.. versionadded:: 1.5\n\n\n.. index::\n   single: view_config decorator\n\n.. _mapping_views_using_a_decorator_section:\n\nAdding View Configuration Using the ``@view_config`` Decorator\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. warning::\n\n   Using this feature tends to slow down application startup slightly, as more\n   work is performed at application startup to scan for view configuration\n   declarations.  For maximum startup performance, use the view configuration\n   method described in :ref:`mapping_views_using_imperative_config_section`\n   instead.\n\nThe :class:`~pyramid.view.view_config` decorator can be used to associate\n:term:`view configuration` information with a function, method, or class that\nacts as a :app:`Pyramid` view callable.\n\nHere's an example of the :class:`~pyramid.view.view_config` decorator that\nlives within a :app:`Pyramid` application module ``views.py``:\n\n.. code-block:: python\n   :linenos:\n\n   from resources import MyResource\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='ok', request_method='POST', permission='read')\n   def my_view(request):\n       return Response('OK')\n\nUsing this decorator as above replaces the need to add this imperative\nconfiguration stanza:\n\n.. code-block:: python\n   :linenos:\n\n   config.add_view('mypackage.views.my_view', route_name='ok',\n                   request_method='POST', permission='read')\n\nAll arguments to ``view_config`` may be omitted.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config()\n   def my_view(request):\n       \"\"\" My view \"\"\"\n       return Response()\n\nSuch a registration as the one directly above implies that the view name will\nbe ``my_view``, registered with a ``context`` argument that matches any\nresource type, using no permission, registered against requests with any\nrequest method, request type, request param, route name, or containment.\n\nThe mere existence of a ``@view_config`` decorator doesn't suffice to perform\nview configuration.  All that the decorator does is \"annotate\" the function\nwith your configuration declarations, it doesn't process them. To make\n:app:`Pyramid` process your :class:`pyramid.view.view_config` declarations, you\n*must* use the ``scan`` method of a :class:`pyramid.config.Configurator`:\n\n.. code-block:: python\n   :linenos:\n\n   # config is assumed to be an instance of the\n   # pyramid.config.Configurator class\n   config.scan()\n\nPlease see :ref:`decorations_and_code_scanning` for detailed information about\nwhat happens when code is scanned for configuration declarations resulting from\nuse of decorators like :class:`~pyramid.view.view_config`.\n\nSee :ref:`configuration_module` for additional API arguments to the\n:meth:`~pyramid.config.Configurator.scan` method.  For example, the method\nallows you to supply a ``package`` argument to better control exactly *which*\ncode will be scanned.\n\nAll arguments to the :class:`~pyramid.view.view_config` decorator mean\nprecisely the same thing as they would if they were passed as arguments to the\n:meth:`pyramid.config.Configurator.add_view` method save for the ``view``\nargument.  Usage of the :class:`~pyramid.view.view_config` decorator is a form\nof :term:`declarative configuration`, while\n:meth:`pyramid.config.Configurator.add_view` is a form of :term:`imperative\nconfiguration`.  However, they both do the same thing.\n\n.. index::\n   single: view_config placement\n\n.. _view_config_placement:\n\n``@view_config`` Placement\n++++++++++++++++++++++++++\n\nA :class:`~pyramid.view.view_config` decorator can be placed in various points\nin your application.\n\nIf your view callable is a function, it may be used as a function decorator:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='edit')\n   def edit(request):\n       return Response('edited!')\n\nIf your view callable is a class, the decorator can also be used as a class\ndecorator. All the arguments to the decorator are the same when applied against\na class as when they are applied against a function.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config(route_name='hello')\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def __call__(self):\n           return Response('hello')\n\nMore than one :class:`~pyramid.view.view_config` decorator can be stacked on\ntop of any number of others.  Each decorator creates a separate view\nregistration.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_config(route_name='edit')\n   @view_config(route_name='change')\n   def edit(request):\n       return Response('edited!')\n\nThis registers the same view under two different names.\n\nThe decorator can also be used against a method of a class:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(route_name='hello')\n       def amethod(self):\n           return Response('hello')\n\nWhen the decorator is used against a method of a class, a view is registered\nfor the *class*, so the class constructor must accept an argument list in one\nof two forms: either a single argument, ``request``, or two arguments,\n``context, request``.\n\nThe method which is decorated must return a :term:`response`.\n\nUsing the decorator against a particular method of a class is equivalent to\nusing the ``attr`` parameter in a decorator attached to the class itself. For\nexample, the above registration implied by the decorator being used against the\n``amethod`` method could be written equivalently as follows:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.view import view_config\n\n   @view_config(attr='amethod', route_name='hello')\n   class MyView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def amethod(self):\n           return Response('hello')\n\n\n.. index::\n   single: add_view\n\n.. _mapping_views_using_imperative_config_section:\n\nAdding View Configuration Using :meth:`~pyramid.config.Configurator.add_view`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe :meth:`pyramid.config.Configurator.add_view` method within\n:ref:`configuration_module` is used to configure a view \"imperatively\" (without\na :class:`~pyramid.view.view_config` decorator).  The arguments to this method\nare very similar to the arguments that you provide to the\n:class:`~pyramid.view.view_config` decorator.  For example:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n\n   def hello_world(request):\n       return Response('hello!')\n\n   # config is assumed to be an instance of the\n   # pyramid.config.Configurator class\n   config.add_view(hello_world, route_name='hello')\n\nThe first argument, a :term:`view callable`, is the only required argument. It\nmust either be a Python object which is the view itself or a :term:`dotted\nPython name` to such an object. In the above example, the ``view callable`` is\nthe ``hello_world`` function.\n\nWhen you use only :meth:`~pyramid.config.Configurator.add_view` to add view\nconfigurations, you don't need to issue a :term:`scan` in order for the view\nconfiguration to take effect.\n\n.. index::\n   single: view_defaults class decorator\n\n.. _view_defaults:\n\n``@view_defaults`` Class Decorator\n----------------------------------\n\n.. versionadded:: 1.3\n\nIf you use a class as a view, you can use the\n:class:`pyramid.view.view_defaults` class decorator on the class to provide\ndefaults to the view configuration information used by every ``@view_config``\ndecorator that decorates a method of that class.\n\nFor instance, if you've got a class that has methods that represent \"REST\nactions\", all of which are mapped to the same route but different request\nmethods, instead of this:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(route_name='rest', request_method='GET')\n       def get(self):\n           return Response('get')\n\n       @view_config(route_name='rest', request_method='POST')\n       def post(self):\n           return Response('post')\n\n       @view_config(route_name='rest', request_method='DELETE')\n       def delete(self):\n           return Response('delete')\n\nYou can do this:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_defaults\n   from pyramid.view import view_config\n   from pyramid.response import Response\n\n   @view_defaults(route_name='rest')\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       @view_config(request_method='GET')\n       def get(self):\n           return Response('get')\n\n       @view_config(request_method='POST')\n       def post(self):\n           return Response('post')\n\n       @view_config(request_method='DELETE')\n       def delete(self):\n           return Response('delete')\n\nIn the above example, we were able to take the ``route_name='rest'`` argument\nout of the call to each individual ``@view_config`` statement because we used a\n``@view_defaults`` class decorator to provide the argument as a default to each\nview method it possessed.\n\nArguments passed to ``@view_config`` will override any default passed to\n``@view_defaults``.\n\nThe ``view_defaults`` class decorator can also provide defaults to the\n:meth:`pyramid.config.Configurator.add_view` directive when a decorated class\nis passed to that directive as its ``view`` argument.  For example, instead of\nthis:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.response import Response\n   from pyramid.config import Configurator\n\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def get(self):\n           return Response('get')\n\n       def post(self):\n           return Response('post')\n\n       def delete(self):\n           return Response('delete')\n\n   def main(global_config, **settings):\n       config = Configurator()\n       config.add_route('rest', '/rest')\n       config.add_view(\n           RESTView, route_name='rest', attr='get', request_method='GET')\n       config.add_view(\n           RESTView, route_name='rest', attr='post', request_method='POST')\n       config.add_view(\n           RESTView, route_name='rest', attr='delete', request_method='DELETE')\n       return config.make_wsgi_app()\n\nTo reduce the amount of repetition in the ``config.add_view`` statements, we\ncan move the ``route_name='rest'`` argument to a ``@view_defaults`` class\ndecorator on the ``RESTView`` class:\n\n.. code-block:: python\n   :linenos:\n\n   from pyramid.view import view_defaults\n   from pyramid.response import Response\n   from pyramid.config import Configurator\n\n   @view_defaults(route_name='rest')\n   class RESTView(object):\n       def __init__(self, request):\n           self.request = request\n\n       def get(self):\n           return Response('get')\n\n       def post(self):\n           return Response('post')\n\n       def delete(self):\n           return Response('delete')\n\n   def main(global_config, **settings):\n       config = Configurator()\n       config.add_route('rest', '/rest')\n       config.add_view(RESTView, attr='get', request_method='GET')\n       config.add_view(RESTView, attr='post', request_method='POST')\n       config.add_view(RESTView, attr='delete', request_method='DELETE')\n       return config.make_wsgi_app()\n\n:class:`pyramid.view.view_defaults` accepts the same set of arguments that\n:class:`pyramid.view.view_config` does, and they have the same meaning.  Each\nargument passed to ``view_defaults`` provides a default for the view\nconfigurations of methods of the class it's decorating.\n\nNormal Python inheritance rules apply to defaults added via ``view_defaults``.\nFor example:\n\n.. code-block:: python\n   :linenos:\n\n   @view_defaults(route_name='rest')\n   class Foo(object):\n       pass\n\n   class Bar(Foo):\n       pass\n\nThe ``Bar`` class above will inherit its view defaults from the arguments\npassed to the ``view_defaults`` decorator of the ``Foo`` class.  To prevent\nthis from happening, use a ``view_defaults`` decorator without any arguments on\nthe subclass:\n\n.. code-block:: python\n   :linenos:\n\n   @view_defaults(route_name='rest')\n   class Foo(object):\n       pass\n\n   @view_defaults()\n   class Bar(Foo):\n       pass\n\nThe ``view_defaults`` decorator only works as a class decorator; using it\nagainst a function or a method will produce nonsensical results.\n\n.. index::\n   single: view security\n   pair: security; view\n\n.. _view_security_section:\n\nConfiguring View Security\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf an :term:`authorization policy` is active, any :term:`permission` attached\nto a :term:`view configuration` found during view lookup will be verified. This\nwill ensure that the currently authenticated user possesses that permission\nagainst the :term:`context` resource before the view function is actually\ncalled.  Here's an example of specifying a permission in a view configuration\nusing :meth:`~pyramid.config.Configurator.add_view`:\n\n.. code-block:: python\n   :linenos:\n\n   # config is an instance of pyramid.config.Configurator\n\n   config.add_route('add', '/add.html', factory='mypackage.Blog')\n   config.add_view('myproject.views.add_entry', route_name='add',\n                   permission='add')\n\nWhen an :term:`authorization policy` is enabled, this view will be protected\nwith the ``add`` permission.  The view will *not be called* if the user does\nnot possess the ``add`` permission relative to the current :term:`context`.\nInstead the :term:`forbidden view` result will be returned to the client as per\n:ref:`protecting_views`.\n\n.. index::\n   single: debugging not found errors\n   single: not found error (debugging)\n\n.. _debug_notfound_section:\n\n:exc:`~pyramid.exceptions.NotFound` Errors\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIt's useful to be able to debug :exc:`~pyramid.exceptions.NotFound` error\nresponses when they occur unexpectedly due to an application registry\nmisconfiguration.  To debug these errors, use the ``PYRAMID_DEBUG_NOTFOUND``\nenvironment variable or the ``pyramid.debug_notfound`` configuration file\nsetting.  Details of why a view was not found will be printed to ``stderr``,\nand the browser representation of the error will include the same information.\nSee :ref:`environment_chapter` for more information about how, and where to set\nthese values.\n\n.. index::\n   single: HTTP caching\n\n.. _influencing_http_caching:\n\nInfluencing HTTP Caching\n------------------------\n\n.. versionadded:: 1.1\n\nWhen a non-``None`` ``http_cache`` argument is passed to a view configuration,\nPyramid will set ``Expires`` and ``Cache-Control`` response headers in the\nresulting response, causing browsers to cache the response data for some time.\nSee ``http_cache`` in :ref:`nonpredicate_view_args` for the allowable values\nand what they mean.\n\nSometimes it's undesirable to have these headers set as the result of returning\na response from a view, even though you'd like to decorate the view with a view\nconfiguration decorator that has ``http_cache``.  Perhaps there's an\nalternative branch in your view code that returns a response that should never\nbe cacheable, while the \"normal\" branch returns something that should always be\ncacheable.  If this is the case, set the ``prevent_auto`` attribute of the\n``response.cache_control`` object to a non-``False`` value.  For example, the\nbelow view callable is configured with a ``@view_config`` decorator that\nindicates any response from the view should be cached for 3600 seconds.\nHowever, the view itself prevents caching from taking place unless there's a\n``should_cache`` GET or POST variable:\n\n.. code-block:: python\n\n   from pyramid.view import view_config\n\n   @view_config(http_cache=3600)\n   def view(request):\n       response = Response()\n       if 'should_cache' not in request.params:\n           response.cache_control.prevent_auto = True\n       return response\n\nNote that the ``http_cache`` machinery will overwrite or add to caching headers\nyou set within the view itself, unless you use ``prevent_auto``.\n\nYou can also turn off the effect of ``http_cache`` entirely for the duration of\na Pyramid application lifetime.  To do so, set the\n``PYRAMID_PREVENT_HTTP_CACHE`` environment variable or the\n``pyramid.prevent_http_cache`` configuration value setting to a true value. For\nmore information, see :ref:`preventing_http_caching`.\n\nNote that setting ``pyramid.prevent_http_cache`` will have no effect on caching\nheaders that your application code itself sets.  It will only prevent caching\nheaders that would have been set by the Pyramid HTTP caching machinery invoked\nas the result of the ``http_cache`` argument to view configuration.\n\n.. index::\n   pair: view configuration; debugging\n\n.. _debugging_view_configuration:\n\nDebugging View Configuration\n----------------------------\n\nSee :ref:`displaying_matching_views` for information about how to display\neach of the view callables that might match for a given URL.  This can be an\neffective way to figure out why a particular view callable is being called\ninstead of the one you'd like to be called.\n",
            "header": {
                "file": {
                    "path": "docs/narr/viewconfig.rst"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "40db5fbeb",
                "new_commit_hash": "3b8f0353a",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/docs/narr/viewconfig.rst"
            },
            "plus_file": {
                "path": "b/docs/narr/viewconfig.rst"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 195,
                            "length": 10
                        },
                        "new_range": {
                            "start": 195,
                            "length": 11
                        },
                        "section": "Non-Predicate Arguments"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "``require_csrf``",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "  CSRF checks only affect POST requests. Any other request methods will pass",
                                "type": "deleted"
                            },
                            {
                                "content": "  untouched. This option is used in combination with the",
                                "type": "deleted"
                            },
                            {
                                "content": "  ``pyramid.require_default_csrf`` setting to control which request parameters",
                                "type": "deleted"
                            },
                            {
                                "content": "  are checked for CSRF tokens.",
                                "type": "deleted"
                            },
                            {
                                "content": "  CSRF checks will affect any request method that is not defined as a \"safe\"",
                                "type": "added"
                            },
                            {
                                "content": "  method by RFC2616. In pratice this means that GET, HEAD, OPTIONS, and TRACE",
                                "type": "added"
                            },
                            {
                                "content": "  methods will pass untouched and all others methods will require CSRF. This",
                                "type": "added"
                            },
                            {
                                "content": "  option is used in combination with the ``pyramid.require_default_csrf``",
                                "type": "added"
                            },
                            {
                                "content": "  setting to control which request parameters are checked for CSRF tokens.",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "  This feature requires a configured :term:`session factory`.",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "What's New in Pyramid 1.7\n=========================\n\nThis article explains the new features in :app:`Pyramid` version 1.7 as\ncompared to its predecessor, :app:`Pyramid` 1.6. It also documents backwards\nincompatibilities between the two versions and deprecations added to\n:app:`Pyramid` 1.7, as well as software dependency changes and notable\ndocumentation additions.\n\nBackwards Incompatibilities\n---------------------------\n\n- The default hash algorithm for\n  :class:`pyramid.authentication.AuthTktAuthenticationPolicy` has changed from\n  ``md5`` to ``sha512``. If you are using the authentication policy and need to\n  continue using ``md5``, please explicitly set ``hashalg='md5'``.\n\n  If you are not currently specifying the ``hashalg`` option in your apps, then\n  this change means any existing auth tickets (and associated cookies) will no\n  longer be valid, users will be logged out, and have to login to their\n  accounts again.\n\n  This change has been issuing a DeprecationWarning since :app:`Pyramid` 1.4.\n\n  See https://github.com/Pylons/pyramid/pull/2496\n\n- Python 2.6 and 3.2 are no longer supported by Pyramid. See\n  https://github.com/Pylons/pyramid/issues/2368 and\n  https://github.com/Pylons/pyramid/pull/2256\n\nFeature Additions\n-----------------\n\n- A new :ref:`view_derivers` concept has been added to Pyramid to allow\n  framework authors to inject elements into the standard Pyramid view pipeline\n  and affect all views in an application. This is similar to a decorator except\n  that it has access to options passed to ``config.add_view`` and can affect\n  other stages of the pipeline such as the raw response from a view or prior\n  to security checks. See https://github.com/Pylons/pyramid/pull/2021\n\n- Added a new setting, ``pyramid.require_default_csrf`` which may be used\n  to turn on CSRF checks globally for every POST request in the application.\n  This should be considered a good default for websites built on Pyramid.\n  It is possible to opt-out of CSRF checks on a per-view basis by setting\n  ``require_csrf=False`` on those views.\n  See :ref:`auto_csrf_checking` and\n  https://github.com/Pylons/pyramid/pull/2413\n\n- Added a ``require_csrf`` view option which will enforce CSRF checks on POST\n  requests. If the CSRF check fails a ``BadCSRFToken`` exception will be\n  raised and may be caught by exception views (the default response is a\n  ``400 Bad Request``). This option should be used in place of the deprecated\n  ``check_csrf`` view predicate which would normally result in unexpected\n  ``404 Not Found`` response to the client instead of a catchable exception.\n  See :ref:`auto_csrf_checking` and\n  https://github.com/Pylons/pyramid/pull/2413\n\n- Subclasses of :class:`pyramid.httpexceptions.HTTPException` will now take\n  into account the best match for the clients ``Accept`` header, and depending\n  on what is requested will return ``text/html``, ``application/json`` or\n  ``text/plain``. The default for ``*/*`` is still ``text/html``, but if\n  ``application/json`` is explicitly mentioned it will now receive a valid\n  JSON response. See https://github.com/Pylons/pyramid/pull/2489\n\n- A new event, :class:`pyramid.events.BeforeTraversal`, and interface\n  :class:`pyramid.interfaces.IBeforeTraversal` have been introduced that will\n  notify listeners before traversal starts in the router.\n  See :ref:`router_chapter` as well as\n  https://github.com/Pylons/pyramid/pull/2469 and\n  https://github.com/Pylons/pyramid/pull/1876\n\n- A new method, :meth:`pyramid.request.Request.invoke_exception_view`, which\n  can be used to invoke an exception view and get back a response. This is\n  useful for rendering an exception view outside of the context of the\n  ``EXCVIEW`` tween where you may need more control over the request.\n  See https://github.com/Pylons/pyramid/pull/2393\n\n- Allow a leading ``=`` on the key of the request param predicate.\n  For example, ``'=abc=1'`` is equivalent down to\n  ``request.params['=abc'] == '1'``.\n  See https://github.com/Pylons/pyramid/pull/1370\n\n- Allow using variable substitutions like ``%(LOGGING_LOGGER_ROOT_LEVEL)s``\n  for logging sections of the .ini file and populate these variables from\n  the ``pserve`` command line -- e.g.:\n\n  ``pserve development.ini LOGGING_LOGGER_ROOT_LEVEL=DEBUG``\n\n  This support is thanks to the new ``global_conf`` option on\n  :func:`pyramid.paster.setup_logging`.\n  See https://github.com/Pylons/pyramid/pull/2399\n\nDeprecations\n------------\n\n- The ``check_csrf`` view predicate has been deprecated. Use the\n  new ``require_csrf`` option or the ``pyramid.require_default_csrf`` setting\n  to ensure that the :class:`pyramid.exceptions.BadCSRFToken` exception is\n  raised. See https://github.com/Pylons/pyramid/pull/2413\n\n- Support for Python 3.3 will be removed in Pyramid 1.8.\n  https://github.com/Pylons/pyramid/issues/2477\n\nScaffolding Enhancements\n------------------------\n\n- A complete overhaul of the ``alchemy`` scaffold to show more modern best\n  practices with regards to SQLAlchemy session management, as well as a more\n  modular approach to configuration, separating routes into a separate module\n  to illustrate uses of :meth:`pyramid.config.Configurator.include`.\n  See https://github.com/Pylons/pyramid/pull/2024\n\nDocumentation Enhancements\n--------------------------\n\nA massive overhaul of the packaging and tools used in the documentation\nwas completed in https://github.com/Pylons/pyramid/pull/2468. A summary\nfollows:\n\n- All docs now recommend using ``pip`` instead of ``easy_install``.\n\n- The installation docs now expect the user to be using Python 3.4 or\n  greater with access to the ``python3 -m venv`` tool to create virtual\n  environments.\n\n- Tutorials now use ``py.test`` and ``pytest-cov`` instead of ``nose`` and\n  ``coverage``.\n\n- Further updates to the scaffolds as well as tutorials and their src files.\n\nAlong with the overhaul of the ``alchemy`` scaffold came a total overhaul\nof the :ref:`bfg_sql_wiki_tutorial` tutorial to introduce more modern\nfeatures into the usage of SQLAlchemy with Pyramid and provide a better\nstarting point for new projects. See\nhttps://github.com/Pylons/pyramid/pull/2024 for more. Highlights were:\n\n- New SQLAlchemy session management without any global ``DBSession``. Replaced\n  by a per-request ``request.dbsession`` property.\n\n- A new authentication chapter demonstrating how to get simple authentication\n  bootstrapped quickly in an application.\n\n- Authorization was overhauled to show the use of per-route context factories\n  which demonstrate object-level authorization on top of simple group-level\n  authorization. Did you want to restrict page edits to only the owner but\n  couldn't figure it out before? Here you go!\n\n- The users and groups are stored in the database now instead of within\n  tutorial-specific global variables.\n\n- User passwords are stored using ``bcrypt``.\n",
            "new_file_content": "What's New in Pyramid 1.7\n=========================\n\nThis article explains the new features in :app:`Pyramid` version 1.7 as\ncompared to its predecessor, :app:`Pyramid` 1.6. It also documents backwards\nincompatibilities between the two versions and deprecations added to\n:app:`Pyramid` 1.7, as well as software dependency changes and notable\ndocumentation additions.\n\nBackwards Incompatibilities\n---------------------------\n\n- The default hash algorithm for\n  :class:`pyramid.authentication.AuthTktAuthenticationPolicy` has changed from\n  ``md5`` to ``sha512``. If you are using the authentication policy and need to\n  continue using ``md5``, please explicitly set ``hashalg='md5'``.\n\n  If you are not currently specifying the ``hashalg`` option in your apps, then\n  this change means any existing auth tickets (and associated cookies) will no\n  longer be valid, users will be logged out, and have to login to their\n  accounts again.\n\n  This change has been issuing a DeprecationWarning since :app:`Pyramid` 1.4.\n\n  See https://github.com/Pylons/pyramid/pull/2496\n\n- Python 2.6 and 3.2 are no longer supported by Pyramid. See\n  https://github.com/Pylons/pyramid/issues/2368 and\n  https://github.com/Pylons/pyramid/pull/2256\n\nFeature Additions\n-----------------\n\n- A new :ref:`view_derivers` concept has been added to Pyramid to allow\n  framework authors to inject elements into the standard Pyramid view pipeline\n  and affect all views in an application. This is similar to a decorator except\n  that it has access to options passed to ``config.add_view`` and can affect\n  other stages of the pipeline such as the raw response from a view or prior\n  to security checks. See https://github.com/Pylons/pyramid/pull/2021\n\n- Added a new setting, ``pyramid.require_default_csrf`` which may be used\n  to turn on CSRF checks globally for every request in the application.\n  This should be considered a good default for websites built on Pyramid.\n  It is possible to opt-out of CSRF checks on a per-view basis by setting\n  ``require_csrf=False`` on those views.\n  See :ref:`auto_csrf_checking` and\n  https://github.com/Pylons/pyramid/pull/2413\n\n- Added a ``require_csrf`` view option which will enforce CSRF checks on\n  requests. If the CSRF check fails a ``BadCSRFToken`` exception will be\n  raised and may be caught by exception views (the default response is a\n  ``400 Bad Request``). This option should be used in place of the deprecated\n  ``check_csrf`` view predicate which would normally result in unexpected\n  ``404 Not Found`` response to the client instead of a catchable exception.\n  See :ref:`auto_csrf_checking` and\n  https://github.com/Pylons/pyramid/pull/2413\n\n- Subclasses of :class:`pyramid.httpexceptions.HTTPException` will now take\n  into account the best match for the clients ``Accept`` header, and depending\n  on what is requested will return ``text/html``, ``application/json`` or\n  ``text/plain``. The default for ``*/*`` is still ``text/html``, but if\n  ``application/json`` is explicitly mentioned it will now receive a valid\n  JSON response. See https://github.com/Pylons/pyramid/pull/2489\n\n- A new event, :class:`pyramid.events.BeforeTraversal`, and interface\n  :class:`pyramid.interfaces.IBeforeTraversal` have been introduced that will\n  notify listeners before traversal starts in the router.\n  See :ref:`router_chapter` as well as\n  https://github.com/Pylons/pyramid/pull/2469 and\n  https://github.com/Pylons/pyramid/pull/1876\n\n- A new method, :meth:`pyramid.request.Request.invoke_exception_view`, which\n  can be used to invoke an exception view and get back a response. This is\n  useful for rendering an exception view outside of the context of the\n  ``EXCVIEW`` tween where you may need more control over the request.\n  See https://github.com/Pylons/pyramid/pull/2393\n\n- Allow a leading ``=`` on the key of the request param predicate.\n  For example, ``'=abc=1'`` is equivalent down to\n  ``request.params['=abc'] == '1'``.\n  See https://github.com/Pylons/pyramid/pull/1370\n\n- Allow using variable substitutions like ``%(LOGGING_LOGGER_ROOT_LEVEL)s``\n  for logging sections of the .ini file and populate these variables from\n  the ``pserve`` command line -- e.g.:\n\n  ``pserve development.ini LOGGING_LOGGER_ROOT_LEVEL=DEBUG``\n\n  This support is thanks to the new ``global_conf`` option on\n  :func:`pyramid.paster.setup_logging`.\n  See https://github.com/Pylons/pyramid/pull/2399\n\nDeprecations\n------------\n\n- The ``check_csrf`` view predicate has been deprecated. Use the\n  new ``require_csrf`` option or the ``pyramid.require_default_csrf`` setting\n  to ensure that the :class:`pyramid.exceptions.BadCSRFToken` exception is\n  raised. See https://github.com/Pylons/pyramid/pull/2413\n\n- Support for Python 3.3 will be removed in Pyramid 1.8.\n  https://github.com/Pylons/pyramid/issues/2477\n\nScaffolding Enhancements\n------------------------\n\n- A complete overhaul of the ``alchemy`` scaffold to show more modern best\n  practices with regards to SQLAlchemy session management, as well as a more\n  modular approach to configuration, separating routes into a separate module\n  to illustrate uses of :meth:`pyramid.config.Configurator.include`.\n  See https://github.com/Pylons/pyramid/pull/2024\n\nDocumentation Enhancements\n--------------------------\n\nA massive overhaul of the packaging and tools used in the documentation\nwas completed in https://github.com/Pylons/pyramid/pull/2468. A summary\nfollows:\n\n- All docs now recommend using ``pip`` instead of ``easy_install``.\n\n- The installation docs now expect the user to be using Python 3.4 or\n  greater with access to the ``python3 -m venv`` tool to create virtual\n  environments.\n\n- Tutorials now use ``py.test`` and ``pytest-cov`` instead of ``nose`` and\n  ``coverage``.\n\n- Further updates to the scaffolds as well as tutorials and their src files.\n\nAlong with the overhaul of the ``alchemy`` scaffold came a total overhaul\nof the :ref:`bfg_sql_wiki_tutorial` tutorial to introduce more modern\nfeatures into the usage of SQLAlchemy with Pyramid and provide a better\nstarting point for new projects. See\nhttps://github.com/Pylons/pyramid/pull/2024 for more. Highlights were:\n\n- New SQLAlchemy session management without any global ``DBSession``. Replaced\n  by a per-request ``request.dbsession`` property.\n\n- A new authentication chapter demonstrating how to get simple authentication\n  bootstrapped quickly in an application.\n\n- Authorization was overhauled to show the use of per-route context factories\n  which demonstrate object-level authorization on top of simple group-level\n  authorization. Did you want to restrict page edits to only the owner but\n  couldn't figure it out before? Here you go!\n\n- The users and groups are stored in the database now instead of within\n  tutorial-specific global variables.\n\n- User passwords are stored using ``bcrypt``.\n",
            "header": {
                "file": {
                    "path": "docs/whatsnew-1.7.rst"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "83ece690e",
                "new_commit_hash": "b85e65ec1",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/docs/whatsnew-1.7.rst"
            },
            "plus_file": {
                "path": "b/docs/whatsnew-1.7.rst"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 39,
                            "length": 14
                        },
                        "new_range": {
                            "start": 39,
                            "length": 14
                        },
                        "section": "Feature Additions"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "  to security checks. See https://github.com/Pylons/pyramid/pull/2021",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- Added a new setting, ``pyramid.require_default_csrf`` which may be used",
                                "type": "context"
                            },
                            {
                                "content": "  to turn on CSRF checks globally for every POST request in the application.",
                                "type": "deleted"
                            },
                            {
                                "content": "  to turn on CSRF checks globally for every request in the application.",
                                "type": "added"
                            },
                            {
                                "content": "  This should be considered a good default for websites built on Pyramid.",
                                "type": "context"
                            },
                            {
                                "content": "  It is possible to opt-out of CSRF checks on a per-view basis by setting",
                                "type": "context"
                            },
                            {
                                "content": "  ``require_csrf=False`` on those views.",
                                "type": "context"
                            },
                            {
                                "content": "  See :ref:`auto_csrf_checking` and",
                                "type": "context"
                            },
                            {
                                "content": "  https://github.com/Pylons/pyramid/pull/2413",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- Added a ``require_csrf`` view option which will enforce CSRF checks on POST",
                                "type": "deleted"
                            },
                            {
                                "content": "- Added a ``require_csrf`` view option which will enforce CSRF checks on",
                                "type": "added"
                            },
                            {
                                "content": "  requests. If the CSRF check fails a ``BadCSRFToken`` exception will be",
                                "type": "context"
                            },
                            {
                                "content": "  raised and may be caught by exception views (the default response is a",
                                "type": "context"
                            },
                            {
                                "content": "  ``400 Bad Request``). This option should be used in place of the deprecated",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "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_csrf_default\" 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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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_csrf_default\" 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.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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_viewderivers.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "bd5b3f2de",
                "new_commit_hash": "4613762f5",
                "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": 1170,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1170,
                            "length": 17
                        },
                        "section": "class TestDeriveView(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        view = self.config._derive_view(inner_view, require_csrf='DUMMY')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertRaises(BadCSRFToken, lambda: view(None, request))",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_csrf_view_fails_on_bad_PUT_header(self):",
                                "type": "added"
                            },
                            {
                                "content": "        from pyramid.exceptions import BadCSRFToken",
                                "type": "added"
                            },
                            {
                                "content": "        def inner_view(request): pass",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        request.method = 'PUT'",
                                "type": "added"
                            },
                            {
                                "content": "        request.POST = {}",
                                "type": "added"
                            },
                            {
                                "content": "        request.session = DummySession({'csrf_token': 'foo'})",
                                "type": "added"
                            },
                            {
                                "content": "        request.headers = {'X-CSRF-Token': 'bar'}",
                                "type": "added"
                            },
                            {
                                "content": "        view = self.config._derive_view(inner_view, require_csrf='DUMMY')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(BadCSRFToken, lambda: view(None, request))",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_csrf_view_uses_config_setting_truthy(self):",
                                "type": "context"
                            },
                            {
                                "content": "        response = DummyResponse()",
                                "type": "context"
                            },
                            {
                                "content": "        def inner_view(request):",
                                "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_csrf_default\" 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.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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 11,
                            "end_lineno": 1247,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_viewderivers.py",
                            "type": "method",
                            "name": "TestDeriveView.test_csrf_view_fails_on_bad_PUT_header",
                            "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_csrf_default\" 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.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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1173,
                            "end_lineno": 1182,
                            "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_csrf_default\" 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.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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 11,
                                "end_lineno": 1247,
                                "parent": null
                            }
                        }
                    ],
                    "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 check_csrf_token\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\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_csrf_default\"')\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            if request.method == 'POST':\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 check_csrf_token\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\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_csrf_default\"')\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 {\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"}:\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",
            "header": {
                "file": {
                    "path": "pyramid/viewderivers.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "41102319d",
                "new_commit_hash": "e9ff09416",
                "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": 488,
                            "length": 7
                        },
                        "new_range": {
                            "start": 488,
                            "length": 9
                        },
                        "section": "def csrf_view(view, info):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "    wrapped_view = view",
                                "type": "context"
                            },
                            {
                                "content": "    if val:",
                                "type": "context"
                            },
                            {
                                "content": "        def csrf_view(context, request):",
                                "type": "context"
                            },
                            {
                                "content": "            if request.method == 'POST':",
                                "type": "deleted"
                            },
                            {
                                "content": "            # Assume that anything not defined as 'safe' by RFC2616 needs",
                                "type": "added"
                            },
                            {
                                "content": "            # protection",
                                "type": "added"
                            },
                            {
                                "content": "            if request.method not in {\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"}:",
                                "type": "added"
                            },
                            {
                                "content": "                check_csrf_token(request, val, raises=True)",
                                "type": "context"
                            },
                            {
                                "content": "            return view(context, request)",
                                "type": "context"
                            },
                            {
                                "content": "        wrapped_view = csrf_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_csrf_default\"')\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            if request.method == 'POST':\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": 477,
                            "end_lineno": 495,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173^",
    "new_commit_hash": "21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173",
    "commit_message": "Have Automatic CSRF on all unsafe HTTP methods\n\nInstead of only protecting against unsafe POST requests, have the automatic\nCSRF protect on all methods which are not defined as \"safe\" by RFC2616.",
    "commit_date": "2016-04-15T18:31:23-04:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173",
    "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_csrf_default\" 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.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.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.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.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.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_uses_config_setting_truthy(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.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.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.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.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"
    ],
    "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 735ms\nPrepared 1 package in 981ms\nInstalled 9 packages in 12ms\n + pastedeploy==3.1.0\n + pyramid==1.7.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173)\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 22ms\nInstalled 10 packages in 10ms\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 7ms\nInstalled 12 packages in 10ms\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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173\ncollected 980 items\n\nr2e_tests/test_1.py ....F...............................FF.........F...F [  5%]\n....F...............................                                     [  8%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 11%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 14%]\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 ..................................... [ 28%]\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 ........................            [ 48%]\nr2e_tests/test_config/test_security.py ..........                        [ 49%]\nr2e_tests/test_config/test_settings.py ........................          [ 52%]\nr2e_tests/test_config/test_testing.py ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\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:416: 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:416: 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 0x7be37550f4f0> 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:416: 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 0x7be375498df0>\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:416: 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 0x7be375644a90>\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:416: 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 0x7be3754cfbb0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7be3754cfbb0>)\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 0x7be3754cfbb0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7be3754cfbb0>), <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 0x7be375554e80>\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 0x7be375554e80>, <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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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 0x7be375b69cd0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]b3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]1173/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]1173/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]f50ab1ab3c481b1c8f3ad1173/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 0x7be3753f5820>, 'discriminat...e3753f5d30>, '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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]be375ae92b0>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]be375ae92b0>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]7be375ae92b0>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]7be375ae92b0>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x7be375ae92b0>,\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:1901: 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:2980: 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:3151: 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_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_ignores_GET\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_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, 914 passed in 5.49s ========================\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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173\ncollected 980 items\n\nr2e_tests/test_1.py ....F...............F...............FF.........F...F [  5%]\n....F...............................                                     [  8%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 11%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 14%]\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 ..................................... [ 28%]\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 ........................            [ 48%]\nr2e_tests/test_config/test_security.py ..........                        [ 49%]\nr2e_tests/test_config/test_settings.py ........................          [ 52%]\nr2e_tests/test_config/test_testing.py ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\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_fails_on_bad_PUT_header _____________\n\nself = <r2e_tests.test_1.TestDeriveView testMethod=test_csrf_view_fails_on_bad_PUT_header>\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.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\nr2e_tests/test_1.py:1182: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:1182: in <lambda>\n    self.assertRaises(BadCSRFToken, lambda: view(None, request))\npyramid/viewderivers.py:493: in csrf_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \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.inner_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:416: ValueError\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:416: 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:416: 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 0x72023fedd160> 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:416: 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 0x72023ffec1c0>\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:416: 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 0x72023fc816a0>\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:416: 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 0x72023ffffb80>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x72023ffffb80>)\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 0x72023ffffb80>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x72023ffffb80>), <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 0x72023fb91340>\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 0x72023fb91340>, <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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]1173/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]b1ab3c481b1c8f3ad1173/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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 0x72024046cfd0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]b3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]b3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]1173/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]1f50ab1ab3c481b1c8f3ad1173/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]1173/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]1173/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]f50ab1ab3c481b1c8f3ad1173/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]f50ab1ab3c481b1c8f3ad1173/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 0x72023ff31280>, 'discriminat...023ff31a60>, '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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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_21d5beaed1641e1f50ab1ab3c481b1c8f3ad1173/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]2023fce32e0>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]2023fce32e0>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]72023fce32e0>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]72023fce32e0>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x72023fce32e0>,\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:1901: 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:2980: 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:3151: 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_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_ignores_GET\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_fails_on_bad_PUT_header\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, 913 passed in 4.75s ========================\n",
    "old_commit_res_stderr": ""
}
docs/narr/sessions.rst docs/narr/viewconfig.rst docs/whatsnew-1.7.rst 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 Protection Only Applied to POST Requests, Leaving Other Unsafe Methods Unprotected

**Description:**
Currently, the application applies CSRF protection exclusively to POST requests. This oversight means that other HTTP methods considered unsafe, such as PUT, DELETE, and PATCH, do not have CSRF protection enabled. As a result, these methods are vulnerable to CSRF attacks, potentially allowing malicious actions without proper verification.

**Example Buggy Code:**
```python
def csrf_view(context, request):
    if request.method == 'POST':
        check_csrf_token(request, val, raises=True)
    return view(context, request)
```

**Test Scenario:**
When a PUT request is made with an invalid CSRF token, the application fails to block the request as expected. Instead of raising a `BadCSRFToken` exception, the view proceeds without validation, potentially allowing unauthorized actions.

```python
def test_csrf_view_fails_on_bad_PUT_header(self):
    from pyramid.exceptions import BadCSRFToken

    def inner_view(request):
        pass

    request = self._makeRequest()
    request.method = 'PUT'
    request.POST = {}
    request.session = DummySession({'csrf_token': 'foo'})
    request.headers = {'X-CSRF-Token': 'bar'}
    view = self.config._derive_view(inner_view, require_csrf='DUMMY')
    self.assertRaises(BadCSRFToken, lambda: view(None, request))
```

**Expected Behavior:**
The application should validate the CSRF token for all HTTP methods that are not defined as "safe" by RFC2616 (i.e., methods other than GET, HEAD, OPTIONS, TRACE). Specifically, when a PUT request is made with an invalid CSRF token, the application should raise a `BadCSRFToken` exception, preventing the execution of the requested action.

**Actual Behavior:**
The PUT request with an invalid CSRF token does not raise the `BadCSRFToken` exception as expected. Instead, the view callable returns `None`, leading to a `ValueError` because the response conversion fails. This indicates that the CSRF token check is not being enforced for PUT requests, leaving them unprotected against CSRF attacks.

[/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_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

def csrf_view(view, info):
    default_val = _parse_csrf_setting(
        info.settings.get('pyramid.require_default_csrf'),
        'Config setting "pyramid.require_csrf_default"')
    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):
            if request.method == 'POST':
                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 Protection Only Applied to POST Requests, Leaving Other Unsafe Methods Unprotected

**Description:**
Currently, the application applies CSRF protection exclusively to POST requests. This oversight means that other HTTP methods considered unsafe, such as PUT, DELETE, and PATCH, do not have CSRF protection enabled. As a result, these methods are vulnerable to CSRF attacks, potentially allowing malicious actions without proper verification.

**Example Buggy Code:**
```python
def csrf_view(context, request):
    if request.method == 'POST':
        check_csrf_token(request, val, raises=True)
    return view(context, request)
```

**Test Scenario:**
When a PUT request is made with an invalid CSRF token, the application fails to block the request as expected. Instead of raising a `BadCSRFToken` exception, the view proceeds without validation, potentially allowing unauthorized actions.

```python
def test_csrf_view_fails_on_bad_PUT_header(self):
    from pyramid.exceptions import BadCSRFToken

    def inner_view(request):
        pass

    request = self._makeRequest()
    request.method = 'PUT'
    request.POST = {}
    request.session = DummySession({'csrf_token': 'foo'})
    request.headers = {'X-CSRF-Token': 'bar'}
    view = self.config._derive_view(inner_view, require_csrf='DUMMY')
    self.assertRaises(BadCSRFToken, lambda: view(None, request))
```

**Expected Behavior:**
The application should validate the CSRF token for all HTTP methods that are not defined as "safe" by RFC2616 (i.e., methods other than GET, HEAD, OPTIONS, TRACE). Specifically, when a PUT request is made with an invalid CSRF token, the application should raise a `BadCSRFToken` exception, preventing the execution of the requested action.

**Actual Behavior:**
The PUT request with an invalid CSRF token does not raise the `BadCSRFToken` exception as expected. Instead, the view callable returns `None`, leading to a `ValueError` because the response conversion fails. This indicates that the CSRF token check is not being enforced for PUT requests, leaving them unprotected against CSRF attacks.

[/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_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_ignores_GET": "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_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 41102319d..e9ff09416 100644
--- a/pyramid/viewderivers.py
+++ b/pyramid/viewderivers.py
@@ -488,7 +488,9 @@ def csrf_view(view, info):
     wrapped_view = view
     if val:
         def csrf_view(context, request):
-            if request.method == 'POST':
+            # Assume that anything not defined as 'safe' by RFC2616 needs
+            # protection
+            if request.method not in {"GET", "HEAD", "OPTIONS", "TRACE"}:
                 check_csrf_token(request, val, raises=True)
             return view(context, request)
         wrapped_view = csrf_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 check_csrf_token\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\ndef csrf_view(view, info):\n    default_val = _parse_csrf_setting(\n        info.settings.get('pyramid.require_default_csrf'),\n        'Config setting \"pyramid.require_csrf_default\"')\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            if request.method == 'POST':\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 Protection Only Applied to POST Requests, Leaving Other Unsafe Methods Unprotected

**Description:**
Currently, the application applies CSRF protection exclusively to POST requests. This oversight means that other HTTP methods considered unsafe, such as PUT, DELETE, and PATCH, do not have CSRF protection enabled. As a result, these methods are vulnerable to CSRF attacks, potentially allowing malicious actions without proper verification.

**Example Buggy Code:**
```python
def csrf_view(context, request):
    if request.method == 'POST':
        check_csrf_token(request, val, raises=True)
    return view(context, request)
```

**Test Scenario:**
When a PUT request is made with an invalid CSRF token, the application fails to block the request as expected. Instead of raising a `BadCSRFToken` exception, the view proceeds without validation, potentially allowing unauthorized actions.

```python
def test_csrf_view_fails_on_bad_PUT_header(self):
    from pyramid.exceptions import BadCSRFToken

    def inner_view(request):
        pass

    request = self._makeRequest()
    request.method = 'PUT'
    request.POST = {}
    request.session = DummySession({'csrf_token': 'foo'})
    request.headers = {'X-CSRF-Token': 'bar'}
    view = self.config._derive_view(inner_view, require_csrf='DUMMY')
    self.assertRaises(BadCSRFToken, lambda: view(None, request))
```

**Expected Behavior:**
The application should validate the CSRF token for all HTTP methods that are not defined as "safe" by RFC2616 (i.e., methods other than GET, HEAD, OPTIONS, TRACE). Specifically, when a PUT request is made with an invalid CSRF token, the application should raise a `BadCSRFToken` exception, preventing the execution of the requested action.

**Actual Behavior:**
The PUT request with an invalid CSRF token does not raise the `BadCSRFToken` exception as expected. Instead, the view callable returns `None`, leading to a `ValueError` because the response conversion fails. This indicates that the CSRF token check is not being enforced for PUT requests, leaving them unprotected against CSRF attacks.

[/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_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

def csrf_view(view, info):
    default_val = _parse_csrf_setting(
        info.settings.get('pyramid.require_default_csrf'),
        'Config setting "pyramid.require_csrf_default"')
    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):
            if request.method == 'POST':
                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