{
    "file_diffs": [
        {
            "old_file_content": "unreleased\n==========\n\nFeatures\n--------\n\nBug Fixes\n---------\n\nDeprecations\n------------\n\nBackward Incompatibilities\n--------------------------\n\nDocumentation Changes\n---------------------\n",
            "new_file_content": "unreleased\n==========\n\nFeatures\n--------\n\nBug Fixes\n---------\n\n- HTTPException's accepts a detail kwarg that may be used to pass additional\n  details to the exception. You may now pass objects so long as they have a\n  valid __str__ method. See https://github.com/Pylons/pyramid/pull/2951 \n\nDeprecations\n------------\n\nBackward Incompatibilities\n--------------------------\n\nDocumentation Changes\n---------------------\n",
            "header": {
                "file": {
                    "path": "CHANGES.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "218fea289",
                "new_commit_hash": "59a733bcd",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/CHANGES.txt"
            },
            "plus_file": {
                "path": "b/CHANGES.txt"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 7,
                            "length": 6
                        },
                        "new_range": {
                            "start": 7,
                            "length": 10
                        },
                        "section": "Features"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "Bug Fixes",
                                "type": "context"
                            },
                            {
                                "content": "---------",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- HTTPException's accepts a detail kwarg that may be used to pass additional",
                                "type": "added"
                            },
                            {
                                "content": "  details to the exception. You may now pass objects so long as they have a",
                                "type": "added"
                            },
                            {
                                "content": "  valid __str__ method. See https://github.com/Pylons/pyramid/pull/2951 ",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "Deprecations",
                                "type": "context"
                            },
                            {
                                "content": "------------",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "\"\"\"\nHTTP Exceptions\n---------------\n\nThis module contains Pyramid HTTP exception classes.  Each class relates to a\nsingle HTTP status code.  Each class is a subclass of the\n:class:`~HTTPException`.  Each exception class is also a :term:`response`\nobject.\n\nEach exception class has a status code according to :rfc:`2068`:\ncodes with 100-300 are not really errors; 400s are client errors,\nand 500s are server errors.\n\nException\n  HTTPException\n    HTTPSuccessful\n      * 200 - HTTPOk\n      * 201 - HTTPCreated\n      * 202 - HTTPAccepted\n      * 203 - HTTPNonAuthoritativeInformation\n      * 204 - HTTPNoContent\n      * 205 - HTTPResetContent\n      * 206 - HTTPPartialContent\n    HTTPRedirection\n      * 300 - HTTPMultipleChoices\n      * 301 - HTTPMovedPermanently\n      * 302 - HTTPFound\n      * 303 - HTTPSeeOther\n      * 304 - HTTPNotModified\n      * 305 - HTTPUseProxy\n      * 307 - HTTPTemporaryRedirect\n    HTTPError\n      HTTPClientError\n        * 400 - HTTPBadRequest\n        * 401 - HTTPUnauthorized\n        * 402 - HTTPPaymentRequired\n        * 403 - HTTPForbidden\n        * 404 - HTTPNotFound\n        * 405 - HTTPMethodNotAllowed\n        * 406 - HTTPNotAcceptable\n        * 407 - HTTPProxyAuthenticationRequired\n        * 408 - HTTPRequestTimeout\n        * 409 - HTTPConflict\n        * 410 - HTTPGone\n        * 411 - HTTPLengthRequired\n        * 412 - HTTPPreconditionFailed\n        * 413 - HTTPRequestEntityTooLarge\n        * 414 - HTTPRequestURITooLong\n        * 415 - HTTPUnsupportedMediaType\n        * 416 - HTTPRequestRangeNotSatisfiable\n        * 417 - HTTPExpectationFailed\n        * 422 - HTTPUnprocessableEntity\n        * 423 - HTTPLocked\n        * 424 - HTTPFailedDependency\n        * 428 - HTTPPreconditionRequired\n        * 429 - HTTPTooManyRequests\n        * 431 - HTTPRequestHeaderFieldsTooLarge\n      HTTPServerError\n        * 500 - HTTPInternalServerError\n        * 501 - HTTPNotImplemented\n        * 502 - HTTPBadGateway\n        * 503 - HTTPServiceUnavailable\n        * 504 - HTTPGatewayTimeout\n        * 505 - HTTPVersionNotSupported\n        * 507 - HTTPInsufficientStorage\n\nHTTP exceptions are also :term:`response` objects, thus they accept most of\nthe same parameters that can be passed to a regular\n:class:`~pyramid.response.Response`. Each HTTP exception also has the\nfollowing attributes:\n\n   ``code``\n       the HTTP status code for the exception\n\n   ``title``\n       remainder of the status line (stuff after the code)\n\n   ``explanation``\n       a plain-text explanation of the error message that is\n       not subject to environment or header substitutions;\n       it is accessible in the template via ${explanation}\n\n   ``detail``\n       a plain-text message customization that is not subject\n       to environment or header substitutions; accessible in\n       the template via ${detail}\n\n   ``body_template``\n       a ``String.template``-format content fragment used for environment\n       and header substitution; the default template includes both\n       the explanation and further detail provided in the\n       message.\n\nEach HTTP exception accepts the following parameters, any others will\nbe forwarded to its :class:`~pyramid.response.Response` superclass:\n\n   ``detail``\n     a plain-text override of the default ``detail``\n\n   ``headers``\n     a list of (k,v) header pairs, or a dict, to be added to the\n     response; use the content_type='application/json' kwarg and other\n     similar kwargs to to change properties of the response supported by the\n     :class:`pyramid.response.Response` superclass\n\n   ``comment``\n     a plain-text additional information which is\n     usually stripped/hidden for end-users\n\n   ``body_template``\n     a ``string.Template`` object containing a content fragment in HTML\n     that frames the explanation and further detail\n\n   ``body``\n     a string that will override the ``body_template`` and be used as the\n     body of the response.\n\nSubstitution of response headers into template values is always performed.\nSubstitution of WSGI environment values is performed if a ``request`` is\npassed to the exception's constructor.\n\nThe subclasses of :class:`~_HTTPMove`\n(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,\n:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and\n:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``\nfield. Reflecting this, these subclasses have one additional keyword argument:\n``location``, which indicates the location to which to redirect.\n\"\"\"\nimport json\n\nfrom string import Template\n\nfrom zope.interface import implementer\n\nfrom webob import html_escape as _html_escape\nfrom webob.acceptparse import MIMEAccept\n\nfrom pyramid.compat import (\n    class_types,\n    text_type,\n    binary_type,\n    text_,\n    )\n\nfrom pyramid.interfaces import IExceptionResponse\nfrom pyramid.response import Response\n\ndef _no_escape(value):\n    if value is None:\n        return ''\n    if not isinstance(value, text_type):\n        if hasattr(value, '__unicode__'):\n            value = value.__unicode__()\n        if isinstance(value, binary_type):\n            value = text_(value, 'utf-8')\n        else:\n            value = text_type(value)\n    return value\n\n@implementer(IExceptionResponse)\nclass HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return self.detail or self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)\n\nWSGIHTTPException = HTTPException # b/c post 1.5\n\nclass HTTPError(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 400s and 500s\n\n    This is an exception which indicates that an error has occurred,\n    and that any work in progress should not be committed.\n    \"\"\"\n\nclass HTTPRedirection(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 300s (redirections)\n\n    This is an abstract base class for 3xx redirection.  It indicates\n    that further action needs to be taken by the user agent in order\n    to fulfill the request.  It does not necessarly signal an error\n    condition.\n    \"\"\"\n\nclass HTTPSuccessful(HTTPException):\n    \"\"\"\n    Base class for exceptions with status codes in the 200s (successful\n    responses)\n    \"\"\"\n\n############################################################\n## 2xx success\n############################################################\n\nclass HTTPOk(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    Indicates that the request has succeeded.\n\n    code: 200, title: OK\n    \"\"\"\n    code = 200\n    title = 'OK'\n\nclass HTTPCreated(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that request has been fulfilled and resulted in a new\n    resource being created.\n\n    code: 201, title: Created\n    \"\"\"\n    code = 201\n    title = 'Created'\n\nclass HTTPAccepted(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the request has been accepted for processing, but the\n    processing has not been completed.\n\n    code: 202, title: Accepted\n    \"\"\"\n    code = 202\n    title = 'Accepted'\n    explanation = 'The request is accepted for processing.'\n\nclass HTTPNonAuthoritativeInformation(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the returned metainformation in the entity-header is\n    not the definitive set as available from the origin server, but is\n    gathered from a local or a third-party copy.\n\n    code: 203, title: Non-Authoritative Information\n    \"\"\"\n    code = 203\n    title = 'Non-Authoritative Information'\n\nclass HTTPNoContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request but does\n    not need to return an entity-body, and might want to return updated\n    metainformation.\n\n    code: 204, title: No Content\n    \"\"\"\n    code = 204\n    title = 'No Content'\n    empty_body = True\n\nclass HTTPResetContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request and\n    the user agent SHOULD reset the document view which caused the\n    request to be sent.\n\n    code: 205, title: Reset Content\n    \"\"\"\n    code = 205\n    title = 'Reset Content'\n    empty_body = True\n\nclass HTTPPartialContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the partial GET\n    request for the resource.\n\n    code: 206, title: Partial Content\n    \"\"\"\n    code = 206\n    title = 'Partial Content'\n\n## FIXME: add 207 Multi-Status (but it's complicated)\n\n############################################################\n## 3xx redirection\n############################################################\n\nclass _HTTPMove(HTTPRedirection):\n    \"\"\"\n    redirections which require a Location field\n\n    Since a 'Location' header is a required attribute of 301, 302, 303,\n    305 and 307 (but not 304), this base class provides the mechanics to\n    make this easy.\n\n    You must provide a ``location`` keyword argument.\n    \"\"\"\n    # differences from webob.exc._HTTPMove:\n    #\n    # - ${location} isn't wrapped in an <a> tag in body\n    #\n    # - location keyword arg defaults to ''\n    #\n    # - location isn't prepended with req.path_url when adding it as\n    #   a header\n    #\n    # - ``location`` is first keyword (and positional) argument\n    #\n    # - ``add_slash`` argument is no longer accepted:  code that passes\n    #   add_slash argument to the constructor will receive an exception.\n    explanation = 'The resource has been moved to'\n    body_template_obj = Template('''\\\n${explanation} ${location}; you should be redirected automatically.\n${detail}\n${html_comment}''')\n\n    def __init__(self, location='', detail=None, headers=None, comment=None,\n                 body_template=None, **kw):\n        if location is None:\n            raise ValueError(\"HTTP redirects need a location to redirect to.\")\n        super(_HTTPMove, self).__init__(\n            detail=detail, headers=headers, comment=comment,\n            body_template=body_template, location=location, **kw)\n\nclass HTTPMultipleChoices(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource corresponds to any one\n    of a set of representations, each with its own specific location,\n    and agent-driven negotiation information is being provided so that\n    the user can select a preferred representation and redirect its\n    request to that location.\n\n    code: 300, title: Multiple Choices\n    \"\"\"\n    code = 300\n    title = 'Multiple Choices'\n\nclass HTTPMovedPermanently(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource has been assigned a new\n    permanent URI and any future references to this resource SHOULD use\n    one of the returned URIs.\n\n    code: 301, title: Moved Permanently\n    \"\"\"\n    code = 301\n    title = 'Moved Permanently'\n\nclass HTTPFound(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily under\n    a different URI.\n\n    code: 302, title: Found\n    \"\"\"\n    code = 302\n    title = 'Found'\n    explanation = 'The resource was found at'\n\n# This one is safe after a POST (the redirected location will be\n# retrieved with GET):\nclass HTTPSeeOther(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the response to the request can be found under\n    a different URI and SHOULD be retrieved using a GET method on that\n    resource.\n\n    code: 303, title: See Other\n    \"\"\"\n    code = 303\n    title = 'See Other'\n\nclass HTTPNotModified(HTTPRedirection):\n    \"\"\"\n    subclass of :class:`~HTTPRedirection`\n\n    This indicates that if the client has performed a conditional GET\n    request and access is allowed, but the document has not been\n    modified, the server SHOULD respond with this status code.\n\n    code: 304, title: Not Modified\n    \"\"\"\n    # FIXME: this should include a date or etag header\n    code = 304\n    title = 'Not Modified'\n    empty_body = True\n\nclass HTTPUseProxy(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource MUST be accessed through\n    the proxy given by the Location field.\n\n    code: 305, title: Use Proxy\n    \"\"\"\n    # Not a move, but looks a little like one\n    code = 305\n    title = 'Use Proxy'\n    explanation = (\n        'The resource must be accessed through a proxy located at')\n\nclass HTTPTemporaryRedirect(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily\n    under a different URI.\n\n    code: 307, title: Temporary Redirect\n    \"\"\"\n    code = 307\n    title = 'Temporary Redirect'\n\n############################################################\n## 4xx client error\n############################################################\n\nclass HTTPClientError(HTTPError):\n    \"\"\"\n    base class for the 400s, where the client is in error\n\n    This is an error condition in which the client is presumed to be\n    in-error.  This is an expected problem, and thus is not considered\n    a bug.  A server-side traceback is not warranted.  Unless specialized,\n    this is a '400 Bad Request'\n    \"\"\"\n    pass\n\nclass HTTPBadRequest(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the body or headers failed validity checks,\n    preventing the server from being able to continue processing.\n\n    code: 400, title: Bad Request\n    \"\"\"\n    code = 400\n    title = 'Bad Request'\n    explanation = ('The server could not comply with the request since '\n                   'it is either malformed or otherwise incorrect.')\n\nclass HTTPUnauthorized(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request requires user authentication.\n\n    code: 401, title: Unauthorized\n    \"\"\"\n    code = 401\n    title = 'Unauthorized'\n    explanation = (\n        'This server could not verify that you are authorized to '\n        'access the document you requested.  Either you supplied the '\n        'wrong credentials (e.g., bad password), or your browser '\n        'does not understand how to supply the credentials required.')\n\nclass HTTPPaymentRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    code: 402, title: Payment Required\n    \"\"\"\n    code = 402\n    title = 'Payment Required'\n    explanation = ('Access was denied for financial reasons.')\n\nclass HTTPForbidden(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server understood the request, but is\n    refusing to fulfill it.\n\n    code: 403, title: Forbidden\n\n    Raise this exception within :term:`view` code to immediately return the\n    :term:`forbidden view` to the invoking user.  Usually this is a basic\n    ``403`` page, but the forbidden view can be customized as necessary.  See\n    :ref:`changing_the_forbidden_view`.  A ``Forbidden`` exception will be\n    the ``context`` of a :term:`Forbidden View`.\n\n    This exception's constructor treats two arguments specially.  The first\n    argument, ``detail``, should be a string.  The value of this string will\n    be used as the ``message`` attribute of the exception object.  The second\n    special keyword argument, ``result`` is usually an instance of\n    :class:`pyramid.security.Denied` or :class:`pyramid.security.ACLDenied`\n    each of which indicates a reason for the forbidden error.  However,\n    ``result`` is also permitted to be just a plain boolean ``False`` object\n    or ``None``.  The ``result`` value will be used as the ``result``\n    attribute of the exception object.  It defaults to ``None``.\n\n    The :term:`Forbidden View` can use the attributes of a Forbidden\n    exception as necessary to provide extended information in an error\n    report shown to a user.\n    \"\"\"\n    # differences from webob.exc.HTTPForbidden:\n    #\n    # - accepts a ``result`` keyword argument\n    #\n    # - overrides constructor to set ``self.result``\n    #\n    # differences from older ``pyramid.exceptions.Forbidden``:\n    #\n    # - ``result`` must be passed as a keyword argument.\n    #\n    code = 403\n    title = 'Forbidden'\n    explanation = ('Access was denied to this resource.')\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, result=None, **kw):\n        HTTPClientError.__init__(self, detail=detail, headers=headers,\n                                 comment=comment, body_template=body_template,\n                                 **kw)\n        self.result = result\n\nclass HTTPNotFound(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server did not find anything matching the\n    Request-URI.\n\n    code: 404, title: Not Found\n\n    Raise this exception within :term:`view` code to immediately\n    return the :term:`Not Found View` to the invoking user.  Usually\n    this is a basic ``404`` page, but the Not Found View can be\n    customized as necessary.  See :ref:`changing_the_notfound_view`.\n\n    This exception's constructor accepts a ``detail`` argument\n    (the first argument), which should be a string.  The value of this\n    string will be available as the ``message`` attribute of this exception,\n    for availability to the :term:`Not Found View`.\n    \"\"\"\n    code = 404\n    title = 'Not Found'\n    explanation = ('The resource could not be found.')\n\nclass HTTPMethodNotAllowed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method specified in the Request-Line is\n    not allowed for the resource identified by the Request-URI.\n\n    code: 405, title: Method Not Allowed\n    \"\"\"\n    # differences from webob.exc.HTTPMethodNotAllowed:\n    #\n    # - body_template_obj uses ${br} instead of <br />\n    code = 405\n    title = 'Method Not Allowed'\n    body_template_obj = Template('''\\\nThe method ${REQUEST_METHOD} is not allowed for this resource. ${br}${br}\n${detail}''')\n\nclass HTTPNotAcceptable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates the resource identified by the request is only\n    capable of generating response entities which have content\n    characteristics not acceptable according to the accept headers\n    sent in the request.\n\n    code: 406, title: Not Acceptable\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attribute left off (useless, bug in webob?)\n    code = 406\n    title = 'Not Acceptable'\n\nclass HTTPProxyAuthenticationRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This is similar to 401, but indicates that the client must first\n    authenticate itself with the proxy.\n\n    code: 407, title: Proxy Authentication Required\n    \"\"\"\n    code = 407\n    title = 'Proxy Authentication Required'\n    explanation = ('Authentication with a local proxy is needed.')\n\nclass HTTPRequestTimeout(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the client did not produce a request within\n    the time that the server was prepared to wait.\n\n    code: 408, title: Request Timeout\n    \"\"\"\n    code = 408\n    title = 'Request Timeout'\n    explanation = ('The server has waited too long for the request to '\n                   'be sent by the client.')\n\nclass HTTPConflict(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request could not be completed due to a\n    conflict with the current state of the resource.\n\n    code: 409, title: Conflict\n    \"\"\"\n    code = 409\n    title = 'Conflict'\n    explanation = ('There was a conflict when trying to complete '\n                   'your request.')\n\nclass HTTPGone(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the requested resource is no longer available\n    at the server and no forwarding address is known.\n\n    code: 410, title: Gone\n    \"\"\"\n    code = 410\n    title = 'Gone'\n    explanation = ('This resource is no longer available.  No forwarding '\n                   'address is given.')\n\nclass HTTPLengthRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server refuses to accept the request\n    without a defined Content-Length.\n\n    code: 411, title: Length Required\n    \"\"\"\n    code = 411\n    title = 'Length Required'\n    explanation = ('Content-Length header required.')\n\nclass HTTPPreconditionFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the precondition given in one or more of the\n    request-header fields evaluated to false when it was tested on the\n    server.\n\n    code: 412, title: Precondition Failed\n    \"\"\"\n    code = 412\n    title = 'Precondition Failed'\n    explanation = ('Request precondition failed.')\n\nclass HTTPRequestEntityTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to process a request\n    because the request entity is larger than the server is willing or\n    able to process.\n\n    code: 413, title: Request Entity Too Large\n    \"\"\"\n    code = 413\n    title = 'Request Entity Too Large'\n    explanation = ('The body of your request was too large for this server.')\n\nclass HTTPRequestURITooLong(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the Request-URI is longer than the server is willing to\n    interpret.\n\n    code: 414, title: Request-URI Too Long\n    \"\"\"\n    code = 414\n    title = 'Request-URI Too Long'\n    explanation = ('The request URI was too long for this server.')\n\nclass HTTPUnsupportedMediaType(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the entity of the request is in a format not supported by\n    the requested resource for the requested method.\n\n    code: 415, title: Unsupported Media Type\n    \"\"\"\n    # differences from webob.exc.HTTPUnsupportedMediaType:\n    #\n    # - \"template_obj\" attribute left off (useless, bug in webob?)\n    code = 415\n    title = 'Unsupported Media Type'\n\nclass HTTPRequestRangeNotSatisfiable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    The server SHOULD return a response with this status code if a\n    request included a Range request-header field, and none of the\n    range-specifier values in this field overlap the current extent\n    of the selected resource, and the request did not include an\n    If-Range request-header field.\n\n    code: 416, title: Request Range Not Satisfiable\n    \"\"\"\n    code = 416\n    title = 'Request Range Not Satisfiable'\n    explanation = ('The Range requested is not available.')\n\nclass HTTPExpectationFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indidcates that the expectation given in an Expect\n    request-header field could not be met by this server.\n\n    code: 417, title: Expectation Failed\n    \"\"\"\n    code = 417\n    title = 'Expectation Failed'\n    explanation = ('Expectation failed.')\n\nclass HTTPUnprocessableEntity(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unable to process the contained\n    instructions.\n\n    May be used to notify the client that their JSON/XML is well formed, but\n    not correct for the current request.\n\n    See RFC4918 section 11 for more information.\n\n    code: 422, title: Unprocessable Entity\n    \"\"\"\n    ## Note: from WebDAV\n    code = 422\n    title = 'Unprocessable Entity'\n    explanation = 'Unable to process the contained instructions'\n\nclass HTTPLocked(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the resource is locked.\n\n    code: 423, title: Locked\n    \"\"\"\n    ## Note: from WebDAV\n    code = 423\n    title = 'Locked'\n    explanation = ('The resource is locked')\n\nclass HTTPFailedDependency(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method could not be performed because the\n    requested action depended on another action and that action failed.\n\n    code: 424, title: Failed Dependency\n    \"\"\"\n    ## Note: from WebDAV\n    code = 424\n    title = 'Failed Dependency'\n    explanation = (\n        'The method could not be performed because the requested '\n        'action dependended on another action and that action failed')\n\nclass HTTPPreconditionRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the origin server requires the\n    request to be conditional.\n\n    Its typical use is to avoid the \"lost update\" problem, where a client\n    GETs a resource's state, modifies it, and PUTs it back to the server,\n    when meanwhile a third party has modified the state on the server,\n    leading to a conflict.  By requiring requests to be conditional, the\n    server can assure that clients are working with the correct copies.\n\n    RFC 6585.3\n\n    code: 428, title: Precondition Required\n    \"\"\"\n    code = 428\n    title = 'Precondition Required'\n    explanation = (\n        'The origin server requires the request to be conditional.')\n\nclass HTTPTooManyRequests(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the user has sent too many\n    requests in a given amount of time (\"rate limiting\").\n\n    RFC 6585.4\n\n    code: 429, title: Too Many Requests\n    \"\"\"\n    code = 429\n    title = 'Too Many Requests'\n    explanation = (\n        'The action could not be performed because there were too '\n        'many requests by the client.')\n\nclass HTTPRequestHeaderFieldsTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unwilling to process\n    the request because its header fields are too large.  The request MAY\n    be resubmitted after reducing the size of the request header fields.\n\n    RFC 6585.5\n\n    code: 431, title: Request Header Fields Too Large\n    \"\"\"\n    code = 431\n    title = 'Request Header Fields Too Large'\n    explanation = (\n        'The requests header fields were too large.')\n\n############################################################\n## 5xx Server Error\n############################################################\n#  Response status codes beginning with the digit \"5\" indicate cases in\n#  which the server is aware that it has erred or is incapable of\n#  performing the request. Except when responding to a HEAD request, the\n#  server SHOULD include an entity containing an explanation of the error\n#  situation, and whether it is a temporary or permanent condition. User\n#  agents SHOULD display any included entity to the user. These response\n#  codes are applicable to any request method.\n\nclass HTTPServerError(HTTPError):\n    \"\"\"\n    base class for the 500s, where the server is in-error\n\n    This is an error condition in which the server is presumed to be\n    in-error.  Unless specialized, this is a '500 Internal Server Error'.\n    \"\"\"\n    pass\n\nclass HTTPInternalServerError(HTTPServerError):\n    code = 500\n    title = 'Internal Server Error'\n    explanation = (\n        'The server has either erred or is incapable of performing '\n        'the requested operation.')\n\nclass HTTPNotImplemented(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support the functionality\n    required to fulfill the request.\n\n    code: 501, title: Not Implemented\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attr left off (useless, bug in webob?)\n    code = 501\n    title = 'Not Implemented'\n\nclass HTTPBadGateway(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    received an invalid response from the upstream server it accessed\n    in attempting to fulfill the request.\n\n    code: 502, title: Bad Gateway\n    \"\"\"\n    code = 502\n    title = 'Bad Gateway'\n    explanation = ('Bad gateway.')\n\nclass HTTPServiceUnavailable(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server is currently unable to handle the\n    request due to a temporary overloading or maintenance of the server.\n\n    code: 503, title: Service Unavailable\n    \"\"\"\n    code = 503\n    title = 'Service Unavailable'\n    explanation = ('The server is currently unavailable. '\n                   'Please try again at a later time.')\n\nclass HTTPGatewayTimeout(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    did not receive a timely response from the upstream server specified\n    by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server\n    (e.g. DNS) it needed to access in attempting to complete the request.\n\n    code: 504, title: Gateway Timeout\n    \"\"\"\n    code = 504\n    title = 'Gateway Timeout'\n    explanation = ('The gateway has timed out.')\n\nclass HTTPVersionNotSupported(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support, or refuses to\n    support, the HTTP protocol version that was used in the request\n    message.\n\n    code: 505, title: HTTP Version Not Supported\n    \"\"\"\n    code = 505\n    title = 'HTTP Version Not Supported'\n    explanation = ('The HTTP version is not supported.')\n\nclass HTTPInsufficientStorage(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not have enough space to save\n    the resource.\n\n    code: 507, title: Insufficient Storage\n    \"\"\"\n    code = 507\n    title = 'Insufficient Storage'\n    explanation = ('There was not enough space to save the resource')\n\ndef exception_response(status_code, **kw):\n    \"\"\"Creates an HTTP exception based on a status code. Example::\n\n        raise exception_response(404) # raises an HTTPNotFound exception.\n\n    The values passed as ``kw`` are provided to the exception's constructor.\n    \"\"\"\n    exc = status_map[status_code](**kw)\n    return exc\n\ndef default_exceptionresponse_view(context, request):\n    if not isinstance(context, Exception):\n        # backwards compat for an exception response view registered via\n        # config.set_notfound_view or config.set_forbidden_view\n        # instead of as a proper exception view\n        context = request.exception or context\n    return context # assumed to be an IResponse\n\nstatus_map = {}\ncode = None\nfor name, value in list(globals().items()):\n    if (\n            isinstance(value, class_types) and\n            issubclass(value, HTTPException) and\n            not name.startswith('_')\n    ):\n        code = getattr(value, 'code', None)\n        if code:\n            status_map[code] = value\ndel name, value, code\n",
            "new_file_content": "\"\"\"\nHTTP Exceptions\n---------------\n\nThis module contains Pyramid HTTP exception classes.  Each class relates to a\nsingle HTTP status code.  Each class is a subclass of the\n:class:`~HTTPException`.  Each exception class is also a :term:`response`\nobject.\n\nEach exception class has a status code according to :rfc:`2068`:\ncodes with 100-300 are not really errors; 400s are client errors,\nand 500s are server errors.\n\nException\n  HTTPException\n    HTTPSuccessful\n      * 200 - HTTPOk\n      * 201 - HTTPCreated\n      * 202 - HTTPAccepted\n      * 203 - HTTPNonAuthoritativeInformation\n      * 204 - HTTPNoContent\n      * 205 - HTTPResetContent\n      * 206 - HTTPPartialContent\n    HTTPRedirection\n      * 300 - HTTPMultipleChoices\n      * 301 - HTTPMovedPermanently\n      * 302 - HTTPFound\n      * 303 - HTTPSeeOther\n      * 304 - HTTPNotModified\n      * 305 - HTTPUseProxy\n      * 307 - HTTPTemporaryRedirect\n    HTTPError\n      HTTPClientError\n        * 400 - HTTPBadRequest\n        * 401 - HTTPUnauthorized\n        * 402 - HTTPPaymentRequired\n        * 403 - HTTPForbidden\n        * 404 - HTTPNotFound\n        * 405 - HTTPMethodNotAllowed\n        * 406 - HTTPNotAcceptable\n        * 407 - HTTPProxyAuthenticationRequired\n        * 408 - HTTPRequestTimeout\n        * 409 - HTTPConflict\n        * 410 - HTTPGone\n        * 411 - HTTPLengthRequired\n        * 412 - HTTPPreconditionFailed\n        * 413 - HTTPRequestEntityTooLarge\n        * 414 - HTTPRequestURITooLong\n        * 415 - HTTPUnsupportedMediaType\n        * 416 - HTTPRequestRangeNotSatisfiable\n        * 417 - HTTPExpectationFailed\n        * 422 - HTTPUnprocessableEntity\n        * 423 - HTTPLocked\n        * 424 - HTTPFailedDependency\n        * 428 - HTTPPreconditionRequired\n        * 429 - HTTPTooManyRequests\n        * 431 - HTTPRequestHeaderFieldsTooLarge\n      HTTPServerError\n        * 500 - HTTPInternalServerError\n        * 501 - HTTPNotImplemented\n        * 502 - HTTPBadGateway\n        * 503 - HTTPServiceUnavailable\n        * 504 - HTTPGatewayTimeout\n        * 505 - HTTPVersionNotSupported\n        * 507 - HTTPInsufficientStorage\n\nHTTP exceptions are also :term:`response` objects, thus they accept most of\nthe same parameters that can be passed to a regular\n:class:`~pyramid.response.Response`. Each HTTP exception also has the\nfollowing attributes:\n\n   ``code``\n       the HTTP status code for the exception\n\n   ``title``\n       remainder of the status line (stuff after the code)\n\n   ``explanation``\n       a plain-text explanation of the error message that is\n       not subject to environment or header substitutions;\n       it is accessible in the template via ${explanation}\n\n   ``detail``\n       a plain-text message customization that is not subject\n       to environment or header substitutions; accessible in\n       the template via ${detail}\n\n   ``body_template``\n       a ``String.template``-format content fragment used for environment\n       and header substitution; the default template includes both\n       the explanation and further detail provided in the\n       message.\n\nEach HTTP exception accepts the following parameters, any others will\nbe forwarded to its :class:`~pyramid.response.Response` superclass:\n\n   ``detail``\n     a plain-text override of the default ``detail``\n\n   ``headers``\n     a list of (k,v) header pairs, or a dict, to be added to the\n     response; use the content_type='application/json' kwarg and other\n     similar kwargs to to change properties of the response supported by the\n     :class:`pyramid.response.Response` superclass\n\n   ``comment``\n     a plain-text additional information which is\n     usually stripped/hidden for end-users\n\n   ``body_template``\n     a ``string.Template`` object containing a content fragment in HTML\n     that frames the explanation and further detail\n\n   ``body``\n     a string that will override the ``body_template`` and be used as the\n     body of the response.\n\nSubstitution of response headers into template values is always performed.\nSubstitution of WSGI environment values is performed if a ``request`` is\npassed to the exception's constructor.\n\nThe subclasses of :class:`~_HTTPMove`\n(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,\n:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and\n:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``\nfield. Reflecting this, these subclasses have one additional keyword argument:\n``location``, which indicates the location to which to redirect.\n\"\"\"\nimport json\n\nfrom string import Template\n\nfrom zope.interface import implementer\n\nfrom webob import html_escape as _html_escape\nfrom webob.acceptparse import MIMEAccept\n\nfrom pyramid.compat import (\n    class_types,\n    text_type,\n    binary_type,\n    text_,\n    )\n\nfrom pyramid.interfaces import IExceptionResponse\nfrom pyramid.response import Response\n\ndef _no_escape(value):\n    if value is None:\n        return ''\n    if not isinstance(value, text_type):\n        if hasattr(value, '__unicode__'):\n            value = value.__unicode__()\n        if isinstance(value, binary_type):\n            value = text_(value, 'utf-8')\n        else:\n            value = text_type(value)\n    return value\n\n@implementer(IExceptionResponse)\nclass HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return str(self.detail) if self.detail else self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)\n\nWSGIHTTPException = HTTPException # b/c post 1.5\n\nclass HTTPError(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 400s and 500s\n\n    This is an exception which indicates that an error has occurred,\n    and that any work in progress should not be committed.\n    \"\"\"\n\nclass HTTPRedirection(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 300s (redirections)\n\n    This is an abstract base class for 3xx redirection.  It indicates\n    that further action needs to be taken by the user agent in order\n    to fulfill the request.  It does not necessarly signal an error\n    condition.\n    \"\"\"\n\nclass HTTPSuccessful(HTTPException):\n    \"\"\"\n    Base class for exceptions with status codes in the 200s (successful\n    responses)\n    \"\"\"\n\n############################################################\n## 2xx success\n############################################################\n\nclass HTTPOk(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    Indicates that the request has succeeded.\n\n    code: 200, title: OK\n    \"\"\"\n    code = 200\n    title = 'OK'\n\nclass HTTPCreated(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that request has been fulfilled and resulted in a new\n    resource being created.\n\n    code: 201, title: Created\n    \"\"\"\n    code = 201\n    title = 'Created'\n\nclass HTTPAccepted(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the request has been accepted for processing, but the\n    processing has not been completed.\n\n    code: 202, title: Accepted\n    \"\"\"\n    code = 202\n    title = 'Accepted'\n    explanation = 'The request is accepted for processing.'\n\nclass HTTPNonAuthoritativeInformation(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the returned metainformation in the entity-header is\n    not the definitive set as available from the origin server, but is\n    gathered from a local or a third-party copy.\n\n    code: 203, title: Non-Authoritative Information\n    \"\"\"\n    code = 203\n    title = 'Non-Authoritative Information'\n\nclass HTTPNoContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request but does\n    not need to return an entity-body, and might want to return updated\n    metainformation.\n\n    code: 204, title: No Content\n    \"\"\"\n    code = 204\n    title = 'No Content'\n    empty_body = True\n\nclass HTTPResetContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request and\n    the user agent SHOULD reset the document view which caused the\n    request to be sent.\n\n    code: 205, title: Reset Content\n    \"\"\"\n    code = 205\n    title = 'Reset Content'\n    empty_body = True\n\nclass HTTPPartialContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the partial GET\n    request for the resource.\n\n    code: 206, title: Partial Content\n    \"\"\"\n    code = 206\n    title = 'Partial Content'\n\n## FIXME: add 207 Multi-Status (but it's complicated)\n\n############################################################\n## 3xx redirection\n############################################################\n\nclass _HTTPMove(HTTPRedirection):\n    \"\"\"\n    redirections which require a Location field\n\n    Since a 'Location' header is a required attribute of 301, 302, 303,\n    305 and 307 (but not 304), this base class provides the mechanics to\n    make this easy.\n\n    You must provide a ``location`` keyword argument.\n    \"\"\"\n    # differences from webob.exc._HTTPMove:\n    #\n    # - ${location} isn't wrapped in an <a> tag in body\n    #\n    # - location keyword arg defaults to ''\n    #\n    # - location isn't prepended with req.path_url when adding it as\n    #   a header\n    #\n    # - ``location`` is first keyword (and positional) argument\n    #\n    # - ``add_slash`` argument is no longer accepted:  code that passes\n    #   add_slash argument to the constructor will receive an exception.\n    explanation = 'The resource has been moved to'\n    body_template_obj = Template('''\\\n${explanation} ${location}; you should be redirected automatically.\n${detail}\n${html_comment}''')\n\n    def __init__(self, location='', detail=None, headers=None, comment=None,\n                 body_template=None, **kw):\n        if location is None:\n            raise ValueError(\"HTTP redirects need a location to redirect to.\")\n        super(_HTTPMove, self).__init__(\n            detail=detail, headers=headers, comment=comment,\n            body_template=body_template, location=location, **kw)\n\nclass HTTPMultipleChoices(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource corresponds to any one\n    of a set of representations, each with its own specific location,\n    and agent-driven negotiation information is being provided so that\n    the user can select a preferred representation and redirect its\n    request to that location.\n\n    code: 300, title: Multiple Choices\n    \"\"\"\n    code = 300\n    title = 'Multiple Choices'\n\nclass HTTPMovedPermanently(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource has been assigned a new\n    permanent URI and any future references to this resource SHOULD use\n    one of the returned URIs.\n\n    code: 301, title: Moved Permanently\n    \"\"\"\n    code = 301\n    title = 'Moved Permanently'\n\nclass HTTPFound(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily under\n    a different URI.\n\n    code: 302, title: Found\n    \"\"\"\n    code = 302\n    title = 'Found'\n    explanation = 'The resource was found at'\n\n# This one is safe after a POST (the redirected location will be\n# retrieved with GET):\nclass HTTPSeeOther(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the response to the request can be found under\n    a different URI and SHOULD be retrieved using a GET method on that\n    resource.\n\n    code: 303, title: See Other\n    \"\"\"\n    code = 303\n    title = 'See Other'\n\nclass HTTPNotModified(HTTPRedirection):\n    \"\"\"\n    subclass of :class:`~HTTPRedirection`\n\n    This indicates that if the client has performed a conditional GET\n    request and access is allowed, but the document has not been\n    modified, the server SHOULD respond with this status code.\n\n    code: 304, title: Not Modified\n    \"\"\"\n    # FIXME: this should include a date or etag header\n    code = 304\n    title = 'Not Modified'\n    empty_body = True\n\nclass HTTPUseProxy(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource MUST be accessed through\n    the proxy given by the Location field.\n\n    code: 305, title: Use Proxy\n    \"\"\"\n    # Not a move, but looks a little like one\n    code = 305\n    title = 'Use Proxy'\n    explanation = (\n        'The resource must be accessed through a proxy located at')\n\nclass HTTPTemporaryRedirect(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily\n    under a different URI.\n\n    code: 307, title: Temporary Redirect\n    \"\"\"\n    code = 307\n    title = 'Temporary Redirect'\n\n############################################################\n## 4xx client error\n############################################################\n\nclass HTTPClientError(HTTPError):\n    \"\"\"\n    base class for the 400s, where the client is in error\n\n    This is an error condition in which the client is presumed to be\n    in-error.  This is an expected problem, and thus is not considered\n    a bug.  A server-side traceback is not warranted.  Unless specialized,\n    this is a '400 Bad Request'\n    \"\"\"\n    pass\n\nclass HTTPBadRequest(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the body or headers failed validity checks,\n    preventing the server from being able to continue processing.\n\n    code: 400, title: Bad Request\n    \"\"\"\n    code = 400\n    title = 'Bad Request'\n    explanation = ('The server could not comply with the request since '\n                   'it is either malformed or otherwise incorrect.')\n\nclass HTTPUnauthorized(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request requires user authentication.\n\n    code: 401, title: Unauthorized\n    \"\"\"\n    code = 401\n    title = 'Unauthorized'\n    explanation = (\n        'This server could not verify that you are authorized to '\n        'access the document you requested.  Either you supplied the '\n        'wrong credentials (e.g., bad password), or your browser '\n        'does not understand how to supply the credentials required.')\n\nclass HTTPPaymentRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    code: 402, title: Payment Required\n    \"\"\"\n    code = 402\n    title = 'Payment Required'\n    explanation = ('Access was denied for financial reasons.')\n\nclass HTTPForbidden(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server understood the request, but is\n    refusing to fulfill it.\n\n    code: 403, title: Forbidden\n\n    Raise this exception within :term:`view` code to immediately return the\n    :term:`forbidden view` to the invoking user.  Usually this is a basic\n    ``403`` page, but the forbidden view can be customized as necessary.  See\n    :ref:`changing_the_forbidden_view`.  A ``Forbidden`` exception will be\n    the ``context`` of a :term:`Forbidden View`.\n\n    This exception's constructor treats two arguments specially.  The first\n    argument, ``detail``, should be a string.  The value of this string will\n    be used as the ``message`` attribute of the exception object.  The second\n    special keyword argument, ``result`` is usually an instance of\n    :class:`pyramid.security.Denied` or :class:`pyramid.security.ACLDenied`\n    each of which indicates a reason for the forbidden error.  However,\n    ``result`` is also permitted to be just a plain boolean ``False`` object\n    or ``None``.  The ``result`` value will be used as the ``result``\n    attribute of the exception object.  It defaults to ``None``.\n\n    The :term:`Forbidden View` can use the attributes of a Forbidden\n    exception as necessary to provide extended information in an error\n    report shown to a user.\n    \"\"\"\n    # differences from webob.exc.HTTPForbidden:\n    #\n    # - accepts a ``result`` keyword argument\n    #\n    # - overrides constructor to set ``self.result``\n    #\n    # differences from older ``pyramid.exceptions.Forbidden``:\n    #\n    # - ``result`` must be passed as a keyword argument.\n    #\n    code = 403\n    title = 'Forbidden'\n    explanation = ('Access was denied to this resource.')\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, result=None, **kw):\n        HTTPClientError.__init__(self, detail=detail, headers=headers,\n                                 comment=comment, body_template=body_template,\n                                 **kw)\n        self.result = result\n\nclass HTTPNotFound(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server did not find anything matching the\n    Request-URI.\n\n    code: 404, title: Not Found\n\n    Raise this exception within :term:`view` code to immediately\n    return the :term:`Not Found View` to the invoking user.  Usually\n    this is a basic ``404`` page, but the Not Found View can be\n    customized as necessary.  See :ref:`changing_the_notfound_view`.\n\n    This exception's constructor accepts a ``detail`` argument\n    (the first argument), which should be a string.  The value of this\n    string will be available as the ``message`` attribute of this exception,\n    for availability to the :term:`Not Found View`.\n    \"\"\"\n    code = 404\n    title = 'Not Found'\n    explanation = ('The resource could not be found.')\n\nclass HTTPMethodNotAllowed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method specified in the Request-Line is\n    not allowed for the resource identified by the Request-URI.\n\n    code: 405, title: Method Not Allowed\n    \"\"\"\n    # differences from webob.exc.HTTPMethodNotAllowed:\n    #\n    # - body_template_obj uses ${br} instead of <br />\n    code = 405\n    title = 'Method Not Allowed'\n    body_template_obj = Template('''\\\nThe method ${REQUEST_METHOD} is not allowed for this resource. ${br}${br}\n${detail}''')\n\nclass HTTPNotAcceptable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates the resource identified by the request is only\n    capable of generating response entities which have content\n    characteristics not acceptable according to the accept headers\n    sent in the request.\n\n    code: 406, title: Not Acceptable\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attribute left off (useless, bug in webob?)\n    code = 406\n    title = 'Not Acceptable'\n\nclass HTTPProxyAuthenticationRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This is similar to 401, but indicates that the client must first\n    authenticate itself with the proxy.\n\n    code: 407, title: Proxy Authentication Required\n    \"\"\"\n    code = 407\n    title = 'Proxy Authentication Required'\n    explanation = ('Authentication with a local proxy is needed.')\n\nclass HTTPRequestTimeout(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the client did not produce a request within\n    the time that the server was prepared to wait.\n\n    code: 408, title: Request Timeout\n    \"\"\"\n    code = 408\n    title = 'Request Timeout'\n    explanation = ('The server has waited too long for the request to '\n                   'be sent by the client.')\n\nclass HTTPConflict(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request could not be completed due to a\n    conflict with the current state of the resource.\n\n    code: 409, title: Conflict\n    \"\"\"\n    code = 409\n    title = 'Conflict'\n    explanation = ('There was a conflict when trying to complete '\n                   'your request.')\n\nclass HTTPGone(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the requested resource is no longer available\n    at the server and no forwarding address is known.\n\n    code: 410, title: Gone\n    \"\"\"\n    code = 410\n    title = 'Gone'\n    explanation = ('This resource is no longer available.  No forwarding '\n                   'address is given.')\n\nclass HTTPLengthRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server refuses to accept the request\n    without a defined Content-Length.\n\n    code: 411, title: Length Required\n    \"\"\"\n    code = 411\n    title = 'Length Required'\n    explanation = ('Content-Length header required.')\n\nclass HTTPPreconditionFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the precondition given in one or more of the\n    request-header fields evaluated to false when it was tested on the\n    server.\n\n    code: 412, title: Precondition Failed\n    \"\"\"\n    code = 412\n    title = 'Precondition Failed'\n    explanation = ('Request precondition failed.')\n\nclass HTTPRequestEntityTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to process a request\n    because the request entity is larger than the server is willing or\n    able to process.\n\n    code: 413, title: Request Entity Too Large\n    \"\"\"\n    code = 413\n    title = 'Request Entity Too Large'\n    explanation = ('The body of your request was too large for this server.')\n\nclass HTTPRequestURITooLong(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the Request-URI is longer than the server is willing to\n    interpret.\n\n    code: 414, title: Request-URI Too Long\n    \"\"\"\n    code = 414\n    title = 'Request-URI Too Long'\n    explanation = ('The request URI was too long for this server.')\n\nclass HTTPUnsupportedMediaType(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the entity of the request is in a format not supported by\n    the requested resource for the requested method.\n\n    code: 415, title: Unsupported Media Type\n    \"\"\"\n    # differences from webob.exc.HTTPUnsupportedMediaType:\n    #\n    # - \"template_obj\" attribute left off (useless, bug in webob?)\n    code = 415\n    title = 'Unsupported Media Type'\n\nclass HTTPRequestRangeNotSatisfiable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    The server SHOULD return a response with this status code if a\n    request included a Range request-header field, and none of the\n    range-specifier values in this field overlap the current extent\n    of the selected resource, and the request did not include an\n    If-Range request-header field.\n\n    code: 416, title: Request Range Not Satisfiable\n    \"\"\"\n    code = 416\n    title = 'Request Range Not Satisfiable'\n    explanation = ('The Range requested is not available.')\n\nclass HTTPExpectationFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indidcates that the expectation given in an Expect\n    request-header field could not be met by this server.\n\n    code: 417, title: Expectation Failed\n    \"\"\"\n    code = 417\n    title = 'Expectation Failed'\n    explanation = ('Expectation failed.')\n\nclass HTTPUnprocessableEntity(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unable to process the contained\n    instructions.\n\n    May be used to notify the client that their JSON/XML is well formed, but\n    not correct for the current request.\n\n    See RFC4918 section 11 for more information.\n\n    code: 422, title: Unprocessable Entity\n    \"\"\"\n    ## Note: from WebDAV\n    code = 422\n    title = 'Unprocessable Entity'\n    explanation = 'Unable to process the contained instructions'\n\nclass HTTPLocked(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the resource is locked.\n\n    code: 423, title: Locked\n    \"\"\"\n    ## Note: from WebDAV\n    code = 423\n    title = 'Locked'\n    explanation = ('The resource is locked')\n\nclass HTTPFailedDependency(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method could not be performed because the\n    requested action depended on another action and that action failed.\n\n    code: 424, title: Failed Dependency\n    \"\"\"\n    ## Note: from WebDAV\n    code = 424\n    title = 'Failed Dependency'\n    explanation = (\n        'The method could not be performed because the requested '\n        'action dependended on another action and that action failed')\n\nclass HTTPPreconditionRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the origin server requires the\n    request to be conditional.\n\n    Its typical use is to avoid the \"lost update\" problem, where a client\n    GETs a resource's state, modifies it, and PUTs it back to the server,\n    when meanwhile a third party has modified the state on the server,\n    leading to a conflict.  By requiring requests to be conditional, the\n    server can assure that clients are working with the correct copies.\n\n    RFC 6585.3\n\n    code: 428, title: Precondition Required\n    \"\"\"\n    code = 428\n    title = 'Precondition Required'\n    explanation = (\n        'The origin server requires the request to be conditional.')\n\nclass HTTPTooManyRequests(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the user has sent too many\n    requests in a given amount of time (\"rate limiting\").\n\n    RFC 6585.4\n\n    code: 429, title: Too Many Requests\n    \"\"\"\n    code = 429\n    title = 'Too Many Requests'\n    explanation = (\n        'The action could not be performed because there were too '\n        'many requests by the client.')\n\nclass HTTPRequestHeaderFieldsTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unwilling to process\n    the request because its header fields are too large.  The request MAY\n    be resubmitted after reducing the size of the request header fields.\n\n    RFC 6585.5\n\n    code: 431, title: Request Header Fields Too Large\n    \"\"\"\n    code = 431\n    title = 'Request Header Fields Too Large'\n    explanation = (\n        'The requests header fields were too large.')\n\n############################################################\n## 5xx Server Error\n############################################################\n#  Response status codes beginning with the digit \"5\" indicate cases in\n#  which the server is aware that it has erred or is incapable of\n#  performing the request. Except when responding to a HEAD request, the\n#  server SHOULD include an entity containing an explanation of the error\n#  situation, and whether it is a temporary or permanent condition. User\n#  agents SHOULD display any included entity to the user. These response\n#  codes are applicable to any request method.\n\nclass HTTPServerError(HTTPError):\n    \"\"\"\n    base class for the 500s, where the server is in-error\n\n    This is an error condition in which the server is presumed to be\n    in-error.  Unless specialized, this is a '500 Internal Server Error'.\n    \"\"\"\n    pass\n\nclass HTTPInternalServerError(HTTPServerError):\n    code = 500\n    title = 'Internal Server Error'\n    explanation = (\n        'The server has either erred or is incapable of performing '\n        'the requested operation.')\n\nclass HTTPNotImplemented(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support the functionality\n    required to fulfill the request.\n\n    code: 501, title: Not Implemented\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attr left off (useless, bug in webob?)\n    code = 501\n    title = 'Not Implemented'\n\nclass HTTPBadGateway(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    received an invalid response from the upstream server it accessed\n    in attempting to fulfill the request.\n\n    code: 502, title: Bad Gateway\n    \"\"\"\n    code = 502\n    title = 'Bad Gateway'\n    explanation = ('Bad gateway.')\n\nclass HTTPServiceUnavailable(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server is currently unable to handle the\n    request due to a temporary overloading or maintenance of the server.\n\n    code: 503, title: Service Unavailable\n    \"\"\"\n    code = 503\n    title = 'Service Unavailable'\n    explanation = ('The server is currently unavailable. '\n                   'Please try again at a later time.')\n\nclass HTTPGatewayTimeout(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    did not receive a timely response from the upstream server specified\n    by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server\n    (e.g. DNS) it needed to access in attempting to complete the request.\n\n    code: 504, title: Gateway Timeout\n    \"\"\"\n    code = 504\n    title = 'Gateway Timeout'\n    explanation = ('The gateway has timed out.')\n\nclass HTTPVersionNotSupported(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support, or refuses to\n    support, the HTTP protocol version that was used in the request\n    message.\n\n    code: 505, title: HTTP Version Not Supported\n    \"\"\"\n    code = 505\n    title = 'HTTP Version Not Supported'\n    explanation = ('The HTTP version is not supported.')\n\nclass HTTPInsufficientStorage(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not have enough space to save\n    the resource.\n\n    code: 507, title: Insufficient Storage\n    \"\"\"\n    code = 507\n    title = 'Insufficient Storage'\n    explanation = ('There was not enough space to save the resource')\n\ndef exception_response(status_code, **kw):\n    \"\"\"Creates an HTTP exception based on a status code. Example::\n\n        raise exception_response(404) # raises an HTTPNotFound exception.\n\n    The values passed as ``kw`` are provided to the exception's constructor.\n    \"\"\"\n    exc = status_map[status_code](**kw)\n    return exc\n\ndef default_exceptionresponse_view(context, request):\n    if not isinstance(context, Exception):\n        # backwards compat for an exception response view registered via\n        # config.set_notfound_view or config.set_forbidden_view\n        # instead of as a proper exception view\n        context = request.exception or context\n    return context # assumed to be an IResponse\n\nstatus_map = {}\ncode = None\nfor name, value in list(globals().items()):\n    if (\n            isinstance(value, class_types) and\n            issubclass(value, HTTPException) and\n            not name.startswith('_')\n    ):\n        code = getattr(value, 'code', None)\n        if code:\n            status_map[code] = value\ndel name, value, code\n",
            "header": {
                "file": {
                    "path": "pyramid/httpexceptions.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "a22b088c6",
                "new_commit_hash": "1f3934fdc",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/httpexceptions.py"
            },
            "plus_file": {
                "path": "b/pyramid/httpexceptions.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 238,
                            "length": 7
                        },
                        "new_range": {
                            "start": 238,
                            "length": 7
                        },
                        "section": "${body}''')"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "            del self.content_length",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def __str__(self):",
                                "type": "context"
                            },
                            {
                                "content": "        return self.detail or self.explanation",
                                "type": "deleted"
                            },
                            {
                                "content": "        return str(self.detail) if self.detail else self.explanation",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def _json_formatter(self, status, body, title, environ):",
                                "type": "context"
                            },
                            {
                                "content": "        return {'message': body,",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/httpexceptions.py",
                            "type": "method",
                            "name": "HTTPException.__str__",
                            "content": "class HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return self.detail or self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 240,
                            "end_lineno": 241,
                            "parent": {
                                "file_name": "pyramid/httpexceptions.py",
                                "type": "class",
                                "name": "HTTPException",
                                "content": "class HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return self.detail or self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 161,
                                "end_lineno": 334,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/httpexceptions.py",
                            "type": "class",
                            "name": "HTTPException",
                            "content": "class HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return self.detail or self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 161,
                            "end_lineno": 334,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import unittest\n\nfrom pyramid.compat import (\n    bytes_,\n    text_,\n    )\n\nclass Test_exception_response(unittest.TestCase):\n    def _callFUT(self, *arg, **kw):\n        from pyramid.httpexceptions import exception_response\n        return exception_response(*arg, **kw)\n\n    def test_status_400(self):\n        from pyramid.httpexceptions import HTTPBadRequest\n        self.assertTrue(isinstance(self._callFUT(400), HTTPBadRequest))\n\n    def test_status_404(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        self.assertTrue(isinstance(self._callFUT(404), HTTPNotFound))\n\n    def test_status_500(self):\n        from pyramid.httpexceptions import HTTPInternalServerError\n        self.assertTrue(isinstance(self._callFUT(500),\n                        HTTPInternalServerError))\n\n    def test_status_201(self):\n        from pyramid.httpexceptions import HTTPCreated\n        self.assertTrue(isinstance(self._callFUT(201), HTTPCreated))\n\n    def test_extra_kw(self):\n        resp = self._callFUT(404, headers=[('abc', 'def')])\n        self.assertEqual(resp.headers['abc'], 'def')\n\nclass Test_default_exceptionresponse_view(unittest.TestCase):\n    def _callFUT(self, context, request):\n        from pyramid.httpexceptions import default_exceptionresponse_view\n        return default_exceptionresponse_view(context, request)\n\n    def test_call_with_exception(self):\n        context = Exception()\n        result = self._callFUT(context, None)\n        self.assertEqual(result, context)\n\n    def test_call_with_nonexception(self):\n        request = DummyRequest()\n        context = Exception()\n        request.exception = context\n        result = self._callFUT(None, request)\n        self.assertEqual(result, context)\n\nclass Test__no_escape(unittest.TestCase):\n    def _callFUT(self, val):\n        from pyramid.httpexceptions import _no_escape\n        return _no_escape(val)\n\n    def test_null(self):\n        self.assertEqual(self._callFUT(None), '')\n\n    def test_not_basestring(self):\n        self.assertEqual(self._callFUT(42), '42')\n\n    def test_unicode(self):\n        class DummyUnicodeObject(object):\n            def __unicode__(self):\n                return text_('42')\n        duo = DummyUnicodeObject()\n        self.assertEqual(self._callFUT(duo), text_('42'))\n\nclass TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\nclass TestRenderAllExceptionsWithoutArguments(unittest.TestCase):\n    def _doit(self, content_type):\n        from pyramid.httpexceptions import status_map\n        L = []\n        self.assertTrue(status_map)\n        for v in status_map.values():\n            environ = _makeEnviron()\n            start_response = DummyStartResponse()\n            exc = v()\n            exc.content_type = content_type\n            result = list(exc(environ, start_response))[0]\n            if exc.empty_body:\n                self.assertEqual(result, b'')\n            else:\n                self.assertTrue(bytes_(exc.status) in result)\n            L.append(result)\n        self.assertEqual(len(L), len(status_map))\n\n    def test_it_plain(self):\n        self._doit('text/plain')\n\n    def test_it_html(self):\n        self._doit('text/html')\n\nclass Test_HTTPMove(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import _HTTPMove\n        return _HTTPMove(*arg, **kw)\n\n    def test_it_location_none_valueerrors(self):\n        # Constructing a HTTPMove instance with location=None should\n        # throw a ValueError from __init__ so that a more-confusing\n        # exception won't be thrown later from .prepare(environ)\n        self.assertRaises(ValueError, self._makeOne, location=None)\n\n    def test_it_location_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.location, '')\n\n    def test_it_location_passed(self):\n        exc = self._makeOne(location='foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_location_firstarg(self):\n        exc = self._makeOne('foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_call_with_default_body_tmpl(self):\n        exc = self._makeOne(location='foo')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'520 Unknown Error\\n\\nThe resource has been moved to foo; '\n                          b'you should be redirected automatically.\\n\\n'))\n\nclass TestHTTPForbidden(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPForbidden\n        return HTTPForbidden(*arg, **kw)\n\n    def test_it_result_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.result, None)\n\n    def test_it_result_passed(self):\n        exc = self._makeOne(result='foo')\n        self.assertEqual(exc.result, 'foo')\n\nclass TestHTTPMethodNotAllowed(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPMethodNotAllowed\n        return HTTPMethodNotAllowed(*arg, **kw)\n\n    def test_it_with_default_body_tmpl(self):\n        exc = self._makeOne()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'405 Method Not Allowed\\n\\nThe method GET is not '\n                          b'allowed for this resource. \\n\\n\\n'))\n\n\nclass DummyRequest(object):\n    exception = None\n\nclass DummyStartResponse(object):\n    def __call__(self, status, headerlist):\n        self.status = status\n        self.headerlist = headerlist\n\ndef _makeEnviron(**kw):\n    environ = {'REQUEST_METHOD': 'GET',\n               'wsgi.url_scheme': 'http',\n               'SERVER_NAME': 'localhost',\n               'SERVER_PORT': '80'}\n    environ.update(kw)\n    return environ\n",
            "new_file_content": "import unittest\n\nfrom pyramid.compat import (\n    bytes_,\n    string_types,\n    text_,\n    )\n\nclass Test_exception_response(unittest.TestCase):\n    def _callFUT(self, *arg, **kw):\n        from pyramid.httpexceptions import exception_response\n        return exception_response(*arg, **kw)\n\n    def test_status_400(self):\n        from pyramid.httpexceptions import HTTPBadRequest\n        self.assertTrue(isinstance(self._callFUT(400), HTTPBadRequest))\n\n    def test_status_404(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        self.assertTrue(isinstance(self._callFUT(404), HTTPNotFound))\n\n    def test_status_500(self):\n        from pyramid.httpexceptions import HTTPInternalServerError\n        self.assertTrue(isinstance(self._callFUT(500),\n                        HTTPInternalServerError))\n\n    def test_status_201(self):\n        from pyramid.httpexceptions import HTTPCreated\n        self.assertTrue(isinstance(self._callFUT(201), HTTPCreated))\n\n    def test_extra_kw(self):\n        resp = self._callFUT(404, headers=[('abc', 'def')])\n        self.assertEqual(resp.headers['abc'], 'def')\n\nclass Test_default_exceptionresponse_view(unittest.TestCase):\n    def _callFUT(self, context, request):\n        from pyramid.httpexceptions import default_exceptionresponse_view\n        return default_exceptionresponse_view(context, request)\n\n    def test_call_with_exception(self):\n        context = Exception()\n        result = self._callFUT(context, None)\n        self.assertEqual(result, context)\n\n    def test_call_with_nonexception(self):\n        request = DummyRequest()\n        context = Exception()\n        request.exception = context\n        result = self._callFUT(None, request)\n        self.assertEqual(result, context)\n\nclass Test__no_escape(unittest.TestCase):\n    def _callFUT(self, val):\n        from pyramid.httpexceptions import _no_escape\n        return _no_escape(val)\n\n    def test_null(self):\n        self.assertEqual(self._callFUT(None), '')\n\n    def test_not_basestring(self):\n        self.assertEqual(self._callFUT(42), '42')\n\n    def test_unicode(self):\n        class DummyUnicodeObject(object):\n            def __unicode__(self):\n                return text_('42')\n        duo = DummyUnicodeObject()\n        self.assertEqual(self._callFUT(duo), text_('42'))\n\nclass TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n        self.assertIsInstance(exc.__str__(), string_types)\n\n\nclass TestRenderAllExceptionsWithoutArguments(unittest.TestCase):\n    def _doit(self, content_type):\n        from pyramid.httpexceptions import status_map\n        L = []\n        self.assertTrue(status_map)\n        for v in status_map.values():\n            environ = _makeEnviron()\n            start_response = DummyStartResponse()\n            exc = v()\n            exc.content_type = content_type\n            result = list(exc(environ, start_response))[0]\n            if exc.empty_body:\n                self.assertEqual(result, b'')\n            else:\n                self.assertTrue(bytes_(exc.status) in result)\n            L.append(result)\n        self.assertEqual(len(L), len(status_map))\n\n    def test_it_plain(self):\n        self._doit('text/plain')\n\n    def test_it_html(self):\n        self._doit('text/html')\n\nclass Test_HTTPMove(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import _HTTPMove\n        return _HTTPMove(*arg, **kw)\n\n    def test_it_location_none_valueerrors(self):\n        # Constructing a HTTPMove instance with location=None should\n        # throw a ValueError from __init__ so that a more-confusing\n        # exception won't be thrown later from .prepare(environ)\n        self.assertRaises(ValueError, self._makeOne, location=None)\n\n    def test_it_location_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.location, '')\n\n    def test_it_location_passed(self):\n        exc = self._makeOne(location='foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_location_firstarg(self):\n        exc = self._makeOne('foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_call_with_default_body_tmpl(self):\n        exc = self._makeOne(location='foo')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'520 Unknown Error\\n\\nThe resource has been moved to foo; '\n                          b'you should be redirected automatically.\\n\\n'))\n\nclass TestHTTPForbidden(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPForbidden\n        return HTTPForbidden(*arg, **kw)\n\n    def test_it_result_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.result, None)\n\n    def test_it_result_passed(self):\n        exc = self._makeOne(result='foo')\n        self.assertEqual(exc.result, 'foo')\n\nclass TestHTTPMethodNotAllowed(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPMethodNotAllowed\n        return HTTPMethodNotAllowed(*arg, **kw)\n\n    def test_it_with_default_body_tmpl(self):\n        exc = self._makeOne()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'405 Method Not Allowed\\n\\nThe method GET is not '\n                          b'allowed for this resource. \\n\\n\\n'))\n\n\nclass DummyRequest(object):\n    exception = None\n\nclass DummyStartResponse(object):\n    def __call__(self, status, headerlist):\n        self.status = status\n        self.headerlist = headerlist\n\ndef _makeEnviron(**kw):\n    environ = {'REQUEST_METHOD': 'GET',\n               'wsgi.url_scheme': 'http',\n               'SERVER_NAME': 'localhost',\n               'SERVER_PORT': '80'}\n    environ.update(kw)\n    return environ\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_httpexceptions.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "224fa4cf0",
                "new_commit_hash": "e2d463008",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/tests/test_httpexceptions.py"
            },
            "plus_file": {
                "path": "b/pyramid/tests/test_httpexceptions.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 2,
                            "length": 6
                        },
                        "new_range": {
                            "start": 2,
                            "length": 7
                        },
                        "section": "import unittest"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "from pyramid.compat import (",
                                "type": "context"
                            },
                            {
                                "content": "    bytes_,",
                                "type": "context"
                            },
                            {
                                "content": "    string_types,",
                                "type": "added"
                            },
                            {
                                "content": "    text_,",
                                "type": "context"
                            },
                            {
                                "content": "    )",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_httpexceptions.py",
                            "type": "statement",
                            "name": "",
                            "content": "from pyramid.compat import (\n    bytes_,\n    string_types,\n    text_,\n    )",
                            "ast_type_str": "ImportFrom",
                            "start_lineno": 3,
                            "end_lineno": 7,
                            "parent": null
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 364,
                            "length": 6
                        },
                        "new_range": {
                            "start": 365,
                            "length": 11
                        },
                        "section": "class TestHTTPException(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        body = list(exc(environ, start_response))[0]",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_allow_detail_non_str(self):",
                                "type": "added"
                            },
                            {
                                "content": "        exc = self._makeOne(detail={'error': 'This is a test'})",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertIsInstance(exc.__str__(), string_types)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "class TestRenderAllExceptionsWithoutArguments(unittest.TestCase):",
                                "type": "context"
                            },
                            {
                                "content": "    def _doit(self, content_type):",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.httpexceptions import status_map",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_httpexceptions.py",
                            "type": "class",
                            "name": "TestHTTPException",
                            "content": "class TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n        self.assertIsInstance(exc.__str__(), string_types)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 70,
                            "end_lineno": 370,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_httpexceptions.py",
                            "type": "method",
                            "name": "TestHTTPException.test_allow_detail_non_str",
                            "content": "class TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n        self.assertIsInstance(exc.__str__(), string_types)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 368,
                            "end_lineno": 370,
                            "parent": {
                                "file_name": "pyramid/tests/test_httpexceptions.py",
                                "type": "class",
                                "name": "TestHTTPException",
                                "content": "class TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n        self.assertIsInstance(exc.__str__(), string_types)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 70,
                                "end_lineno": 370,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "40d71e805bfcf8522c6af71995c05c496f1c4b4f^",
    "new_commit_hash": "40d71e805bfcf8522c6af71995c05c496f1c4b4f",
    "commit_message": "Merge pull request #2951 from Pylons/bugfix/httpexception__str__\n\nBugfix: pyramid.httpexception.HTTPException.__str __",
    "commit_date": "2017-02-09T18:13:09-07:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "40d71e805bfcf8522c6af71995c05c496f1c4b4f",
    "test_file_codes": [
        "import unittest\n\nfrom pyramid.compat import (\n    bytes_,\n    string_types,\n    text_,\n    )\n\nclass Test_exception_response(unittest.TestCase):\n    def _callFUT(self, *arg, **kw):\n        from pyramid.httpexceptions import exception_response\n        return exception_response(*arg, **kw)\n\n    def test_status_400(self):\n        from pyramid.httpexceptions import HTTPBadRequest\n        self.assertTrue(isinstance(self._callFUT(400), HTTPBadRequest))\n\n    def test_status_404(self):\n        from pyramid.httpexceptions import HTTPNotFound\n        self.assertTrue(isinstance(self._callFUT(404), HTTPNotFound))\n\n    def test_status_500(self):\n        from pyramid.httpexceptions import HTTPInternalServerError\n        self.assertTrue(isinstance(self._callFUT(500),\n                        HTTPInternalServerError))\n\n    def test_status_201(self):\n        from pyramid.httpexceptions import HTTPCreated\n        self.assertTrue(isinstance(self._callFUT(201), HTTPCreated))\n\n    def test_extra_kw(self):\n        resp = self._callFUT(404, headers=[('abc', 'def')])\n        self.assertEqual(resp.headers['abc'], 'def')\n\nclass Test_default_exceptionresponse_view(unittest.TestCase):\n    def _callFUT(self, context, request):\n        from pyramid.httpexceptions import default_exceptionresponse_view\n        return default_exceptionresponse_view(context, request)\n\n    def test_call_with_exception(self):\n        context = Exception()\n        result = self._callFUT(context, None)\n        self.assertEqual(result, context)\n\n    def test_call_with_nonexception(self):\n        request = DummyRequest()\n        context = Exception()\n        request.exception = context\n        result = self._callFUT(None, request)\n        self.assertEqual(result, context)\n\nclass Test__no_escape(unittest.TestCase):\n    def _callFUT(self, val):\n        from pyramid.httpexceptions import _no_escape\n        return _no_escape(val)\n\n    def test_null(self):\n        self.assertEqual(self._callFUT(None), '')\n\n    def test_not_basestring(self):\n        self.assertEqual(self._callFUT(42), '42')\n\n    def test_unicode(self):\n        class DummyUnicodeObject(object):\n            def __unicode__(self):\n                return text_('42')\n        duo = DummyUnicodeObject()\n        self.assertEqual(self._callFUT(duo), text_('42'))\n\nclass TestHTTPException(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.httpexceptions import HTTPException\n        return HTTPException\n\n    def _getTargetSubclass(self, code='200', title='OK',\n                           explanation='explanation', empty_body=False):\n        cls = self._getTargetClass()\n        class Subclass(cls):\n            pass\n        Subclass.empty_body = empty_body\n        Subclass.code = code\n        Subclass.title = title\n        Subclass.explanation = explanation\n        return Subclass\n\n    def _makeOne(self, *arg, **kw):\n        cls = self._getTargetClass()\n        return cls(*arg, **kw)\n\n    def test_implements_IResponse(self):\n        from pyramid.interfaces import IResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IResponse.implementedBy(cls))\n\n    def test_provides_IResponse(self):\n        from pyramid.interfaces import IResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IResponse.providedBy(inst))\n\n    def test_implements_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        cls = self._getTargetClass()\n        self.assertTrue(IExceptionResponse.implementedBy(cls))\n\n    def test_provides_IExceptionResponse(self):\n        from pyramid.interfaces import IExceptionResponse\n        inst = self._getTargetClass()()\n        self.assertTrue(IExceptionResponse.providedBy(inst))\n\n    def test_ctor_sets_detail(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.detail, 'message')\n\n    def test_ctor_sets_comment(self):\n        exc = self._makeOne(comment='comment')\n        self.assertEqual(exc.comment, 'comment')\n\n    def test_ctor_calls_Exception_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.message, 'message')\n\n    def test_ctor_calls_Response_ctor(self):\n        exc = self._makeOne('message')\n        self.assertEqual(exc.status, '520 Unknown Error')\n\n    def test_ctor_extends_headers(self):\n        exc = self._makeOne(headers=[('X-Foo', 'foo')])\n        self.assertEqual(exc.headers.get('X-Foo'), 'foo')\n\n    def test_ctor_sets_body_template_obj(self):\n        exc = self._makeOne(body_template='${foo}')\n        self.assertEqual(\n            exc.body_template_obj.substitute({'foo': 'foo'}), 'foo')\n\n    def test_ctor_with_empty_body(self):\n        cls = self._getTargetSubclass(empty_body=True)\n        exc = cls()\n        self.assertEqual(exc.content_type, None)\n        self.assertEqual(exc.content_length, None)\n\n    def test_ctor_with_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(body=b'123')\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_unicode_body_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(unicode_body=text_('123'))\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_app_iter_doesnt_set_default_app_iter(self):\n        exc = self._makeOne(app_iter=[b'123'])\n        self.assertEqual(exc.app_iter, [b'123'])\n\n    def test_ctor_with_body_sets_default_app_iter_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(body.startswith(b'<html'))\n        self.assertTrue(b'200 OK' in body)\n        self.assertTrue(b'explanation' in body)\n        self.assertTrue(b'detail' in body)\n\n    def test_ctor_with_body_sets_default_app_iter_text(self):\n        cls = self._getTargetSubclass()\n        exc = cls('detail')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\ndetail\\n\\n')\n\n    def test__str__detail(self):\n        exc = self._makeOne()\n        exc.detail = 'abc'\n        self.assertEqual(str(exc), 'abc')\n\n    def test__str__explanation(self):\n        exc = self._makeOne()\n        exc.explanation = 'def'\n        self.assertEqual(str(exc), 'def')\n\n    def test_wsgi_response(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.wsgi_response)\n\n    def test_exception(self):\n        exc = self._makeOne()\n        self.assertTrue(exc is exc.exception)\n\n    def test__calls_start_response(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        self.assertTrue(start_response.headerlist)\n        self.assertEqual(start_response.status, '200 OK')\n\n    def test_call_returns_same_body_called_twice(self):\n        # optimization\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0], exc.body)\n\n    def test__default_app_iter_no_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\n\\n')\n\n    def test__default_app_iter_with_comment_plain(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertEqual(body, b'200 OK\\n\\nexplanation\\n\\n\\n\\ncomment\\n')\n\n    def test__default_app_iter_no_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n        self.assertFalse(b'<!-- ' in body)\n\n    def test__content_type(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/plain; charset=UTF-8')\n\n    def test__content_type_default_is_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = '*/*'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_text_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n\n    def test__content_type_application_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls()\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        exc(environ, start_response)\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'application/json')\n\n    def test__default_app_iter_with_comment_ampersand(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        for header in start_response.headerlist:\n            if header[0] == 'Content-Type':\n                self.assertEqual(header[1], 'text/html; charset=UTF-8')\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_html(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'text/html'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertTrue(b'<!-- comment &amp; comment -->' in body)\n\n    def test__default_app_iter_with_comment_json(self):\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment & comment')\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n\n    def test__default_app_iter_with_custom_json(self):\n        def json_formatter(status, body, title, environ):\n            return {'message': body,\n                    'code': status,\n                    'title': title,\n                    'custom': environ['CUSTOM_VARIABLE']\n                    }\n        cls = self._getTargetSubclass()\n        exc = cls(comment='comment', json_formatter=json_formatter)\n        environ = _makeEnviron()\n        environ['HTTP_ACCEPT'] = 'application/json'\n        environ['CUSTOM_VARIABLE'] = 'custom!'\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        import json\n        retval = json.loads(body.decode('UTF-8'))\n        self.assertEqual(retval['code'], '200 OK')\n        self.assertEqual(retval['title'], 'OK')\n        self.assertEqual(retval['custom'], 'custom!')\n\n    def test_custom_body_template(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_custom_body_template_with_custom_variable_doesnt_choke(self):\n        cls = self._getTargetSubclass()\n        exc = cls(body_template='${REQUEST_METHOD}')\n        environ = _makeEnviron()\n        class Choke(object):\n            def __str__(self):  # pragma no cover\n                raise ValueError\n        environ['gardentheory.user'] = Choke()\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\nGET')\n\n    def test_body_template_unicode(self):\n        cls = self._getTargetSubclass()\n        la = text_(b'/La Pe\\xc3\\xb1a', 'utf-8')\n        environ = _makeEnviron(unicodeval=la)\n        exc = cls(body_template='${unicodeval}')\n        start_response = DummyStartResponse()\n        body = list(exc(environ, start_response))[0]\n        self.assertEqual(body, b'200 OK\\n\\n/La Pe\\xc3\\xb1a')\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n        self.assertIsInstance(exc.__str__(), string_types)\n\n\nclass TestRenderAllExceptionsWithoutArguments(unittest.TestCase):\n    def _doit(self, content_type):\n        from pyramid.httpexceptions import status_map\n        L = []\n        self.assertTrue(status_map)\n        for v in status_map.values():\n            environ = _makeEnviron()\n            start_response = DummyStartResponse()\n            exc = v()\n            exc.content_type = content_type\n            result = list(exc(environ, start_response))[0]\n            if exc.empty_body:\n                self.assertEqual(result, b'')\n            else:\n                self.assertTrue(bytes_(exc.status) in result)\n            L.append(result)\n        self.assertEqual(len(L), len(status_map))\n\n    def test_it_plain(self):\n        self._doit('text/plain')\n\n    def test_it_html(self):\n        self._doit('text/html')\n\nclass Test_HTTPMove(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import _HTTPMove\n        return _HTTPMove(*arg, **kw)\n\n    def test_it_location_none_valueerrors(self):\n        # Constructing a HTTPMove instance with location=None should\n        # throw a ValueError from __init__ so that a more-confusing\n        # exception won't be thrown later from .prepare(environ)\n        self.assertRaises(ValueError, self._makeOne, location=None)\n\n    def test_it_location_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.location, '')\n\n    def test_it_location_passed(self):\n        exc = self._makeOne(location='foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_location_firstarg(self):\n        exc = self._makeOne('foo')\n        self.assertEqual(exc.location, 'foo')\n\n    def test_it_call_with_default_body_tmpl(self):\n        exc = self._makeOne(location='foo')\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'520 Unknown Error\\n\\nThe resource has been moved to foo; '\n                          b'you should be redirected automatically.\\n\\n'))\n\nclass TestHTTPForbidden(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPForbidden\n        return HTTPForbidden(*arg, **kw)\n\n    def test_it_result_not_passed(self):\n        exc = self._makeOne()\n        self.assertEqual(exc.result, None)\n\n    def test_it_result_passed(self):\n        exc = self._makeOne(result='foo')\n        self.assertEqual(exc.result, 'foo')\n\nclass TestHTTPMethodNotAllowed(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.httpexceptions import HTTPMethodNotAllowed\n        return HTTPMethodNotAllowed(*arg, **kw)\n\n    def test_it_with_default_body_tmpl(self):\n        exc = self._makeOne()\n        environ = _makeEnviron()\n        start_response = DummyStartResponse()\n        app_iter = exc(environ, start_response)\n        self.assertEqual(app_iter[0],\n                         (b'405 Method Not Allowed\\n\\nThe method GET is not '\n                          b'allowed for this resource. \\n\\n\\n'))\n\n\nclass DummyRequest(object):\n    exception = None\n\nclass DummyStartResponse(object):\n    def __call__(self, status, headerlist):\n        self.status = status\n        self.headerlist = headerlist\n\ndef _makeEnviron(**kw):\n    environ = {'REQUEST_METHOD': 'GET',\n               'wsgi.url_scheme': 'http',\n               'SERVER_NAME': 'localhost',\n               'SERVER_PORT': '80'}\n    environ.update(kw)\n    return environ\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 10 packages in 674ms\nPrepared 1 package in 747ms\nInstalled 10 packages in 58ms\n + hupper==1.12.1\n + pastedeploy==3.1.0\n + pyramid==1.9.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f)\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 23 packages in 103ms\nInstalled 13 packages in 38ms\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\n + zope-component==6.0\n + zope-event==5.0\n + zope-hookable==7.0\nResolved 16 packages in 5ms\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_40d71e805bfcf8522c6af71995c05c496f1c4b4f\ncollected 887 items\n\nr2e_tests/test_1.py .................................................... [  5%]\n.....                                                                    [  6%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [  8%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 12%]\n.....................................F.F................................ [ 20%]\n                                                                         [ 20%]\nr2e_tests/test_config/test_factories.py .....................            [ 23%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF..                        [ 24%]\nr2e_tests/test_config/test_init.py ..................................... [ 28%]\n......F..F.......F.............F...........F.....................FF...FF [ 37%]\nF..............................                                          [ 40%]\nr2e_tests/test_config/test_rendering.py ...                              [ 40%]\nr2e_tests/test_config/test_routes.py ........................            [ 43%]\nr2e_tests/test_config/test_security.py ............                      [ 44%]\nr2e_tests/test_config/test_settings.py .......................           [ 47%]\nr2e_tests/test_config/test_testing.py ............                       [ 48%]\nr2e_tests/test_config/test_tweens.py .................................   [ 52%]\nr2e_tests/test_config/test_util.py ..................................... [ 56%]\n...............                                                          [ 58%]\nr2e_tests/test_config/test_views.py .................................F.. [ 62%]\n........................................................................ [ 70%]\n.......................FF............................................... [ 78%]\n.......................................................F.......F         [ 86%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 86%]\nr2e_tests/test_scripts/test_pcreate.py .....................             [ 88%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 88%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 90%]\nr2e_tests/test_scripts/test_proutes.py ...........FFFF.F.FF....F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py F.....                             [ 95%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 96%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\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 0x73abe0576700>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x73abe0576700>)\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 0x73abe0576700>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x73abe0576700>), <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 0x73abdfa841c0>\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 0x73abdfa841c0>, <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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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:102: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:585: in wrapper\n    result = wrapped(self, *arg, **kw)\npyramid/config/i18n.py:118: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\npyramid/config/__init__.py:610: in action\n    callable(*args, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def register():\n        directories = []\n        resolver = AssetResolver(self.package_name)\n    \n        # defer spec resolution until register to allow for asset\n        # overrides to take place in an earlier config phase\n        for spec in specs:\n            # the trailing slash helps match asset overrides for folders\n            if not spec.endswith('/'):\n                spec += '/'\n            asset = resolver.resolve(spec)\n            directory = asset.abspath()\n            if not asset.isdir():\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                        directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:99: 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]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:53: 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]1995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]1995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:63: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_doesnt_use_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_doesnt_use_override_w_autocommit>\n\n    def test_add_translation_dirs_doesnt_use_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:122: 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]4b4f/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/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:70: 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]4b4f/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/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:79: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_override_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_override_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                                    override=True)\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2, locale3])\nE       AssertionError: Lists differ: ['/ho[91 chars]4b4f/pyramid/tests/pkgs/localeapp/locale', '/h[269 chars]le3'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:89: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_out_of_order>\n\n    def test_add_translation_dirs_uses_override_out_of_order(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne()\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n        config.commit()\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale2])\nE       AssertionError: Lists differ: ['/ho[71 chars]2c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'] != ['/ho[71 chars]2c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:113: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_w_autocommit>\n\n    def test_add_translation_dirs_uses_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale2])\nE       AssertionError: Lists differ: ['/ho[71 chars]2c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'] != ['/ho[71 chars]2c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:131: 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:165: 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:818: 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:1080: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:657: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1151: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x73abdfee6040>, 'discriminat...abdfec53a0>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.ConflictResolverState object at 0x73abdffa3640>\n\n    def resolveConflicts(actions, state=None):\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    \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        Actions are resolved on a per-order basis because some discriminators\n        cannot be computed until earlier actions have executed. An action in an\n        earlier order may execute successfully only to find out later that it was\n        overridden by another action with a smaller include path. This will result\n        in a conflict as there is no way to revert the original action.\n    \n        ``state`` may be an instance of ``ConflictResolverState`` that\n        can be used to resume execution and resolve the new actions against the\n        list of executed actions from a previous call.\n    \n        \"\"\"\n        if state is None:\n            state = ConflictResolverState()\n    \n        # pick up where we left off last time, but track the new actions as well\n        state.remaining_actions.extend(normalize_actions(actions))\n        actions = state.remaining_actions\n    \n        def orderandpos(v):\n            n, v = v\n            return (v['order'] or 0, n)\n    \n        def orderonly(v):\n            n, v = v\n            return v['order'] or 0\n    \n        sactions = sorted(enumerate(actions, start=state.start), key=orderandpos)\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            output = []\n            unique = {}\n    \n            # error out if we went backward in order\n            if state.min_order is not None and order < state.min_order:\n                r = ['Actions were added to order={0} after execution had moved '\n                     'on to order={1}. Conflicting actions: '\n                     .format(order, state.min_order)]\n                for i, action in actiongroup:\n                    for line in str(action['info']).rstrip().split('\\n'):\n                        r.append(\"  \" + line)\n                raise ConfigurationError('\\n'.join(r))\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                # \"ainfo\" is a tuple of (i, action) where \"i\" is an integer\n                # expressing the relative position of this action in the action\n                # list being resolved, and \"action\" is an action dictionary.  The\n                # purpose of an ainfo is to associate an \"i\" with a particular\n                # action; \"i\" exists for sorting after conflict resolution.\n                ainfo = (i, action)\n    \n                # wait to defer discriminators until we are on their order because\n                # the discriminator may depend on state from a previous order\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            for discriminator, ainfos in unique.items():\n                # We use (includepath, 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 \"i\".\n                def bypath(ainfo):\n                    path, i = ainfo[1]['includepath'], ainfo[0]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                _, action = ainfo\n    \n                # ensure this new action does not conflict with a previously\n                # resolved action from an earlier order / invocation\n                prev_ainfo = state.resolved_ainfos.get(discriminator)\n                if prev_ainfo is not None:\n                    _, paction = prev_ainfo\n                    basepath, baseinfo = paction['includepath'], paction['info']\n                    includepath = action['includepath']\n                    # if the new action conflicts with the resolved action then\n                    # note the conflict, otherwise drop the action as it's\n                    # effectively overriden by the previous action\n                    if (includepath[:len(basepath)] != basepath or\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n                else:\n                    output.append(ainfo)\n    \n                basepath, baseinfo = action['includepath'], action['info']\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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1333: 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:1089: 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:485: 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:1288: 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:1275: 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:1262: 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:1301: 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:1365: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:540: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1362: 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]3abdfbb6c40>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]3abdfbb6c40>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]73abdfbb6c40>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]73abdfbb6c40>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x73abdfbb6c40>,\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:2065: 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:1186: 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:1227: 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:3213: 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:3384: 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:339: 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:366: 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:394: 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:198: 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:534: 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:423: 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        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\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', path2 + os.sep, '*'],\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:454: 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:158: 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.args.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:605: 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:564: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        self.config_factory.items = [(\n            'watch_files',\n            'foo\\n/baz\\npyramid.tests.test_scripts:*.py',\n        )]\n        inst.pserve_file_config('/base/path.ini', global_conf={'a': '1'})\n        self.assertEqual(self.config_factory.defaults, {\n            'a': '1',\n            'here': os.path.abspath('/base'),\n        })\n>       self.assertEqual(inst.watch_files, [\n            os.path.abspath('/base/foo'),\n            os.path.abspath('/baz'),\n            os.path.abspath(os.path.join(here, '*.py')),\n        ])\nE       AssertionError: Lists differ: ['/ba[87 chars]cf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py'] != ['/ba[87 chars]cf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py']\nE       \nE       First differing element 2:\nE       '/hom[64 chars]fcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py'\nE       '/hom[64 chars]fcf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py'\nE       \nE         ['/base/foo',\nE          '/baz',\nE       -  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       +  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_scripts/test_pserve.py:74: 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.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/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:300: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::Test_exception_response::test_extra_kw\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_201\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_400\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_404\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_500\nPASSED r2e_tests/test_1.py::Test_default_exceptionresponse_view::test_call_with_exception\nPASSED r2e_tests/test_1.py::Test_default_exceptionresponse_view::test_call_with_nonexception\nPASSED r2e_tests/test_1.py::Test__no_escape::test_not_basestring\nPASSED r2e_tests/test_1.py::Test__no_escape::test_null\nPASSED r2e_tests/test_1.py::Test__no_escape::test_unicode\nPASSED r2e_tests/test_1.py::TestHTTPException::test__calls_start_response\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_application_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_default_is_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_text_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_no_comment_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_no_comment_plain\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_ampersand\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_plain\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_custom_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__str__detail\nPASSED r2e_tests/test_1.py::TestHTTPException::test__str__explanation\nPASSED r2e_tests/test_1.py::TestHTTPException::test_allow_detail_non_str\nPASSED r2e_tests/test_1.py::TestHTTPException::test_body_template_unicode\nPASSED r2e_tests/test_1.py::TestHTTPException::test_call_returns_same_body_called_twice\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_calls_Exception_ctor\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_calls_Response_ctor\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_extends_headers\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_body_template_obj\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_comment\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_detail\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_app_iter_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_sets_default_app_iter_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_sets_default_app_iter_text\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_empty_body\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_unicode_body_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_custom_body_template\nPASSED r2e_tests/test_1.py::TestHTTPException::test_custom_body_template_with_custom_variable_doesnt_choke\nPASSED r2e_tests/test_1.py::TestHTTPException::test_exception\nPASSED r2e_tests/test_1.py::TestHTTPException::test_implements_IExceptionResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_implements_IResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_provides_IExceptionResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_provides_IResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_wsgi_response\nPASSED r2e_tests/test_1.py::TestRenderAllExceptionsWithoutArguments::test_it_html\nPASSED r2e_tests/test_1.py::TestRenderAllExceptionsWithoutArguments::test_it_plain\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_call_with_default_body_tmpl\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_firstarg\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_none_valueerrors\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_not_passed\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_passed\nPASSED r2e_tests/test_1.py::TestHTTPForbidden::test_it_result_not_passed\nPASSED r2e_tests/test_1.py::TestHTTPForbidden::test_it_result_passed\nPASSED r2e_tests/test_1.py::TestHTTPMethodNotAllowed::test_it_with_default_body_tmpl\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_invalid_kwargs\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_does_not_propagate_request_for_diff_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_overrides_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_propagates_request_for_same_registry\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_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\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_with_deferred_discriminator\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_deferred_discriminator\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_conflicts_across_orders\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::Test_resolveConflicts::test_override_success_across_orders\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_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_changing_set_default_csrf_options\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_csrf_options\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__set_settings_uses_original_dict\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_csrf_trusted_origins\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_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_util.py::TestDeprecatedPredicates::test_it\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\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_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_disallows_require_csrf\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_normal_and_exception_view_intr_derived_callable\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_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_disallows_require_csrf\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_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_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_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_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_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\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::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_package_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_display_headers\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_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\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_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\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_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\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_class_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\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_config_vars_no_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_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\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_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_doesnt_use_override_w_autocommit\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_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_override_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_out_of_order\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_w_autocommit\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_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_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 48 failed, 839 passed in 5.05s ========================\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_40d71e805bfcf8522c6af71995c05c496f1c4b4f\ncollected 887 items\n\nr2e_tests/test_1.py ........................F........................... [  5%]\n.....                                                                    [  6%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [  8%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 12%]\n.....................................F.F................................ [ 20%]\n                                                                         [ 20%]\nr2e_tests/test_config/test_factories.py .....................            [ 23%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF..                        [ 24%]\nr2e_tests/test_config/test_init.py ..................................... [ 28%]\n......F..F.......F.............F...........F.....................FF...FF [ 37%]\nF..............................                                          [ 40%]\nr2e_tests/test_config/test_rendering.py ...                              [ 40%]\nr2e_tests/test_config/test_routes.py ........................            [ 43%]\nr2e_tests/test_config/test_security.py ............                      [ 44%]\nr2e_tests/test_config/test_settings.py .......................           [ 47%]\nr2e_tests/test_config/test_testing.py ............                       [ 48%]\nr2e_tests/test_config/test_tweens.py .................................   [ 52%]\nr2e_tests/test_config/test_util.py ..................................... [ 56%]\n...............                                                          [ 58%]\nr2e_tests/test_config/test_views.py .................................F.. [ 62%]\n........................................................................ [ 70%]\n.......................FF............................................... [ 78%]\n.......................................................F.......F         [ 86%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 86%]\nr2e_tests/test_scripts/test_pcreate.py .....................             [ 88%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 88%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 90%]\nr2e_tests/test_scripts/test_proutes.py ...........FFFF.F.FF....F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py F.....                             [ 95%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 96%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n_________________ TestHTTPException.test_allow_detail_non_str __________________\n\nself = <r2e_tests.test_1.TestHTTPException testMethod=test_allow_detail_non_str>\n\n    def test_allow_detail_non_str(self):\n        exc = self._makeOne(detail={'error': 'This is a test'})\n>       self.assertIsInstance(exc.__str__(), string_types)\nE       AssertionError: {'error': 'This is a test'} is not an instance of (<class 'str'>,)\n\nr2e_tests/test_1.py:370: 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 0x70b3d1ec6550>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x70b3d1ec6550>)\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 0x70b3d1ec6550>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x70b3d1ec6550>), <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 0x70b3d1dbf400>\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 0x70b3d1dbf400>, <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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]4b4f/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]4b4f/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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]af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]af71995c05c496f1c4b4f/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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:102: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:585: in wrapper\n    result = wrapped(self, *arg, **kw)\npyramid/config/i18n.py:118: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\npyramid/config/__init__.py:610: in action\n    callable(*args, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def register():\n        directories = []\n        resolver = AssetResolver(self.package_name)\n    \n        # defer spec resolution until register to allow for asset\n        # overrides to take place in an earlier config phase\n        for spec in specs:\n            # the trailing slash helps match asset overrides for folders\n            if not spec.endswith('/'):\n                spec += '/'\n            asset = resolver.resolve(spec)\n            directory = asset.abspath()\n            if not asset.isdir():\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                        directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:99: 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]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:53: 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]1995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]1995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:63: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_doesnt_use_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_doesnt_use_override_w_autocommit>\n\n    def test_add_translation_dirs_doesnt_use_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:122: 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]4b4f/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/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:70: 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]4b4f/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/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:79: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_override_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_override_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                                    override=True)\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2, locale3])\nE       AssertionError: Lists differ: ['/ho[91 chars]4b4f/pyramid/tests/pkgs/localeapp/locale', '/h[269 chars]le3'] != ['/ho[91 chars]4b4f/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:89: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_out_of_order>\n\n    def test_add_translation_dirs_uses_override_out_of_order(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne()\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n        config.commit()\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale2])\nE       AssertionError: Lists differ: ['/ho[71 chars]2c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'] != ['/ho[71 chars]2c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:113: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_w_autocommit>\n\n    def test_add_translation_dirs_uses_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.override_asset('pyramid.tests.pkgs.localeapp:locale/',\n                              'pyramid.tests.pkgs.localeapp:locale2/')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale2])\nE       AssertionError: Lists differ: ['/ho[71 chars]2c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'] != ['/ho[71 chars]2c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2'\nE       '/hom[69 chars]22c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:131: 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:165: 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:818: 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:1080: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:657: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1151: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x70b3d1e91f70>, 'discriminat...b3d1cdeaf0>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.ConflictResolverState object at 0x70b3d1da6d60>\n\n    def resolveConflicts(actions, state=None):\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    \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        Actions are resolved on a per-order basis because some discriminators\n        cannot be computed until earlier actions have executed. An action in an\n        earlier order may execute successfully only to find out later that it was\n        overridden by another action with a smaller include path. This will result\n        in a conflict as there is no way to revert the original action.\n    \n        ``state`` may be an instance of ``ConflictResolverState`` that\n        can be used to resume execution and resolve the new actions against the\n        list of executed actions from a previous call.\n    \n        \"\"\"\n        if state is None:\n            state = ConflictResolverState()\n    \n        # pick up where we left off last time, but track the new actions as well\n        state.remaining_actions.extend(normalize_actions(actions))\n        actions = state.remaining_actions\n    \n        def orderandpos(v):\n            n, v = v\n            return (v['order'] or 0, n)\n    \n        def orderonly(v):\n            n, v = v\n            return v['order'] or 0\n    \n        sactions = sorted(enumerate(actions, start=state.start), key=orderandpos)\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            output = []\n            unique = {}\n    \n            # error out if we went backward in order\n            if state.min_order is not None and order < state.min_order:\n                r = ['Actions were added to order={0} after execution had moved '\n                     'on to order={1}. Conflicting actions: '\n                     .format(order, state.min_order)]\n                for i, action in actiongroup:\n                    for line in str(action['info']).rstrip().split('\\n'):\n                        r.append(\"  \" + line)\n                raise ConfigurationError('\\n'.join(r))\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                # \"ainfo\" is a tuple of (i, action) where \"i\" is an integer\n                # expressing the relative position of this action in the action\n                # list being resolved, and \"action\" is an action dictionary.  The\n                # purpose of an ainfo is to associate an \"i\" with a particular\n                # action; \"i\" exists for sorting after conflict resolution.\n                ainfo = (i, action)\n    \n                # wait to defer discriminators until we are on their order because\n                # the discriminator may depend on state from a previous order\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            for discriminator, ainfos in unique.items():\n                # We use (includepath, 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 \"i\".\n                def bypath(ainfo):\n                    path, i = ainfo[1]['includepath'], ainfo[0]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                _, action = ainfo\n    \n                # ensure this new action does not conflict with a previously\n                # resolved action from an earlier order / invocation\n                prev_ainfo = state.resolved_ainfos.get(discriminator)\n                if prev_ainfo is not None:\n                    _, paction = prev_ainfo\n                    basepath, baseinfo = paction['includepath'], paction['info']\n                    includepath = action['includepath']\n                    # if the new action conflicts with the resolved action then\n                    # note the conflict, otherwise drop the action as it's\n                    # effectively overriden by the previous action\n                    if (includepath[:len(basepath)] != basepath or\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n                else:\n                    output.append(ainfo)\n    \n                basepath, baseinfo = action['includepath'], action['info']\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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/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_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1333: 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:1089: 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:485: 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:1288: 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:1275: 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:1262: 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:1301: 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:1365: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:540: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1362: 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]0b3d1afadf0>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]0b3d1afadf0>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]70b3d1afadf0>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]70b3d1afadf0>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x70b3d1afadf0>,\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:2065: 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:1186: 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:1227: 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:3213: 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:3384: 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:339: 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:366: 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:394: 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:198: 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:534: 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:423: 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        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\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', path2 + os.sep, '*'],\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:454: 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:158: 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.args.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:605: 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:564: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        self.config_factory.items = [(\n            'watch_files',\n            'foo\\n/baz\\npyramid.tests.test_scripts:*.py',\n        )]\n        inst.pserve_file_config('/base/path.ini', global_conf={'a': '1'})\n        self.assertEqual(self.config_factory.defaults, {\n            'a': '1',\n            'here': os.path.abspath('/base'),\n        })\n>       self.assertEqual(inst.watch_files, [\n            os.path.abspath('/base/foo'),\n            os.path.abspath('/baz'),\n            os.path.abspath(os.path.join(here, '*.py')),\n        ])\nE       AssertionError: Lists differ: ['/ba[87 chars]cf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py'] != ['/ba[87 chars]cf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py']\nE       \nE       First differing element 2:\nE       '/hom[64 chars]fcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py'\nE       '/hom[64 chars]fcf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py'\nE       \nE         ['/base/foo',\nE          '/baz',\nE       -  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/pyramid/tests/test_scripts/*.py']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       +  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_40d71e805bfcf8522c6af71995c05c496f1c4b4f/r2e_tests/test_scripts/*.py']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_scripts/test_pserve.py:74: 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.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/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:300: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::Test_exception_response::test_extra_kw\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_201\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_400\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_404\nPASSED r2e_tests/test_1.py::Test_exception_response::test_status_500\nPASSED r2e_tests/test_1.py::Test_default_exceptionresponse_view::test_call_with_exception\nPASSED r2e_tests/test_1.py::Test_default_exceptionresponse_view::test_call_with_nonexception\nPASSED r2e_tests/test_1.py::Test__no_escape::test_not_basestring\nPASSED r2e_tests/test_1.py::Test__no_escape::test_null\nPASSED r2e_tests/test_1.py::Test__no_escape::test_unicode\nPASSED r2e_tests/test_1.py::TestHTTPException::test__calls_start_response\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_application_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_default_is_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__content_type_text_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_no_comment_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_no_comment_plain\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_ampersand\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_comment_plain\nPASSED r2e_tests/test_1.py::TestHTTPException::test__default_app_iter_with_custom_json\nPASSED r2e_tests/test_1.py::TestHTTPException::test__str__detail\nPASSED r2e_tests/test_1.py::TestHTTPException::test__str__explanation\nPASSED r2e_tests/test_1.py::TestHTTPException::test_body_template_unicode\nPASSED r2e_tests/test_1.py::TestHTTPException::test_call_returns_same_body_called_twice\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_calls_Exception_ctor\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_calls_Response_ctor\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_extends_headers\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_body_template_obj\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_comment\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_sets_detail\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_app_iter_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_sets_default_app_iter_html\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_body_sets_default_app_iter_text\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_empty_body\nPASSED r2e_tests/test_1.py::TestHTTPException::test_ctor_with_unicode_body_doesnt_set_default_app_iter\nPASSED r2e_tests/test_1.py::TestHTTPException::test_custom_body_template\nPASSED r2e_tests/test_1.py::TestHTTPException::test_custom_body_template_with_custom_variable_doesnt_choke\nPASSED r2e_tests/test_1.py::TestHTTPException::test_exception\nPASSED r2e_tests/test_1.py::TestHTTPException::test_implements_IExceptionResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_implements_IResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_provides_IExceptionResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_provides_IResponse\nPASSED r2e_tests/test_1.py::TestHTTPException::test_wsgi_response\nPASSED r2e_tests/test_1.py::TestRenderAllExceptionsWithoutArguments::test_it_html\nPASSED r2e_tests/test_1.py::TestRenderAllExceptionsWithoutArguments::test_it_plain\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_call_with_default_body_tmpl\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_firstarg\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_none_valueerrors\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_not_passed\nPASSED r2e_tests/test_1.py::Test_HTTPMove::test_it_location_passed\nPASSED r2e_tests/test_1.py::TestHTTPForbidden::test_it_result_not_passed\nPASSED r2e_tests/test_1.py::TestHTTPForbidden::test_it_result_passed\nPASSED r2e_tests/test_1.py::TestHTTPMethodNotAllowed::test_it_with_default_body_tmpl\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_invalid_kwargs\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_does_not_propagate_request_for_diff_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_overrides_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_propagates_request_for_same_registry\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_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\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_with_deferred_discriminator\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_deferred_discriminator\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_conflicts_across_orders\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::Test_resolveConflicts::test_override_success_across_orders\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_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_changing_set_default_csrf_options\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_csrf_options\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__set_settings_uses_original_dict\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_csrf_trusted_origins\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_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_util.py::TestDeprecatedPredicates::test_it\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\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_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_disallows_require_csrf\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_normal_and_exception_view_intr_derived_callable\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_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_disallows_require_csrf\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_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_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_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_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_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\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::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_package_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_display_headers\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_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\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_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\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_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\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_class_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\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_config_vars_no_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_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\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::TestHTTPException::test_allow_detail_non_str - As...\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_doesnt_use_override_w_autocommit\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_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_override_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_out_of_order\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_w_autocommit\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_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_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 49 failed, 838 passed in 4.28s ========================\n",
    "old_commit_res_stderr": ""
}
CHANGES.txt pyramid/httpexceptions.py pyramid/tests/test_httpexceptions.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title:** HTTPException `__str__` Method Returns Non-String When `detail` Is Not a String

**Description:**
When an `HTTPException` is instantiated with a `detail` that is not a string (e.g., a dictionary), invoking `str()` on the exception returns the `detail` object directly instead of a string representation. This behavior can lead to unexpected issues in parts of the application that expect the exception's string representation to always be a string.

**Example Code:**
```python
from pyramid.httpexceptions import HTTPException

exc = HTTPException(detail={'error': 'This is a test'})
print(str(exc))  # Outputs: {'error': 'This is a test'}
```

**Expected Behavior:**
The `__str__` method of `HTTPException` should always return a string, regardless of the type of `detail`. Even if `detail` is a non-string object, its string representation should be returned.

**Actual Behavior:**
When `detail` is a non-string object, the `__str__` method returns the `detail` object directly, which may not be a string. This can cause issues in parts of the code that expect a string, leading to potential errors or unexpected behavior.

[/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/httpexceptions.py
"""
HTTP Exceptions
---------------

This module contains Pyramid HTTP exception classes.  Each class relates to a
single HTTP status code.  Each class is a subclass of the
:class:`~HTTPException`.  Each exception class is also a :term:`response`
object.

Each exception class has a status code according to :rfc:`2068`:
codes with 100-300 are not really errors; 400s are client errors,
and 500s are server errors.

Exception
  HTTPException
    HTTPSuccessful
      * 200 - HTTPOk
      * 201 - HTTPCreated
      * 202 - HTTPAccepted
      * 203 - HTTPNonAuthoritativeInformation
      * 204 - HTTPNoContent
      * 205 - HTTPResetContent
      * 206 - HTTPPartialContent
    HTTPRedirection
      * 300 - HTTPMultipleChoices
      * 301 - HTTPMovedPermanently
      * 302 - HTTPFound
      * 303 - HTTPSeeOther
      * 304 - HTTPNotModified
      * 305 - HTTPUseProxy
      * 307 - HTTPTemporaryRedirect
    HTTPError
      HTTPClientError
        * 400 - HTTPBadRequest
        * 401 - HTTPUnauthorized
        * 402 - HTTPPaymentRequired
        * 403 - HTTPForbidden
        * 404 - HTTPNotFound
        * 405 - HTTPMethodNotAllowed
        * 406 - HTTPNotAcceptable
        * 407 - HTTPProxyAuthenticationRequired
        * 408 - HTTPRequestTimeout
        * 409 - HTTPConflict
        * 410 - HTTPGone
        * 411 - HTTPLengthRequired
        * 412 - HTTPPreconditionFailed
        * 413 - HTTPRequestEntityTooLarge
        * 414 - HTTPRequestURITooLong
        * 415 - HTTPUnsupportedMediaType
        * 416 - HTTPRequestRangeNotSatisfiable
        * 417 - HTTPExpectationFailed
        * 422 - HTTPUnprocessableEntity
        * 423 - HTTPLocked
        * 424 - HTTPFailedDependency
        * 428 - HTTPPreconditionRequired
        * 429 - HTTPTooManyRequests
        * 431 - HTTPRequestHeaderFieldsTooLarge
      HTTPServerError
        * 500 - HTTPInternalServerError
        * 501 - HTTPNotImplemented
        * 502 - HTTPBadGateway
        * 503 - HTTPServiceUnavailable
        * 504 - HTTPGatewayTimeout
        * 505 - HTTPVersionNotSupported
        * 507 - HTTPInsufficientStorage

HTTP exceptions are also :term:`response` objects, thus they accept most of
the same parameters that can be passed to a regular
:class:`~pyramid.response.Response`. Each HTTP exception also has the
following attributes:

   ``code``
       the HTTP status code for the exception

   ``title``
       remainder of the status line (stuff after the code)

   ``explanation``
       a plain-text explanation of the error message that is
       not subject to environment or header substitutions;
       it is accessible in the template via ${explanation}

   ``detail``
       a plain-text message customization that is not subject
       to environment or header substitutions; accessible in
       the template via ${detail}

   ``body_template``
       a ``String.template``-format content fragment used for environment
       and header substitution; the default template includes both
       the explanation and further detail provided in the
       message.

Each HTTP exception accepts the following parameters, any others will
be forwarded to its :class:`~pyramid.response.Response` superclass:

   ``detail``
     a plain-text override of the default ``detail``

   ``headers``
     a list of (k,v) header pairs, or a dict, to be added to the
     response; use the content_type='application/json' kwarg and other
     similar kwargs to to change properties of the response supported by the
     :class:`pyramid.response.Response` superclass

   ``comment``
     a plain-text additional information which is
     usually stripped/hidden for end-users

   ``body_template``
     a ``string.Template`` object containing a content fragment in HTML
     that frames the explanation and further detail

   ``body``
     a string that will override the ``body_template`` and be used as the
     body of the response.

Substitution of response headers into template values is always performed.
Substitution of WSGI environment values is performed if a ``request`` is
passed to the exception's constructor.

The subclasses of :class:`~_HTTPMove`
(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,
:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and
:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``
field. Reflecting this, these subclasses have one additional keyword argument:
``location``, which indicates the location to which to redirect.
"""
import json

from string import Template

from zope.interface import implementer

from webob import html_escape as _html_escape
from webob.acceptparse import MIMEAccept

from pyramid.compat import (
    class_types,
    text_type,
    binary_type,
    text_,
    )

from pyramid.interfaces import IExceptionResponse
from pyramid.response import Response

def _no_escape(value):
    if value is None:
        return ''
    if not isinstance(value, text_type):
        if hasattr(value, '__unicode__'):
            value = value.__unicode__()
        if isinstance(value, binary_type):
            value = text_(value, 'utf-8')
        else:
            value = text_type(value)
    return value

@implementer(IExceptionResponse)
class HTTPException(Response, Exception):

    ## You should set in subclasses:
    # code = 200
    # title = 'OK'
    # explanation = 'why this happens'
    # body_template_obj = Template('response template')
    #
    # This class itself uses the error code "520" with the error message/title
    # of "Unknown Error". This is not an RFC standard, however it is
    # implemented in practice. Sub-classes should be overriding the default
    # values and 520 should not be seen in the wild from Pyramid applications.
    # Due to changes in WebOb, a code of "None" is not valid, and WebOb due to
    # more strict error checking rejects it now.

    # differences from webob.exc.WSGIHTTPException:
    #
    # - doesn't use "strip_tags" (${br} placeholder for <br/>, no other html
    #   in default body template)
    #
    # - __call__ never generates a new Response, it always mutates self
    #
    # - explicitly sets self.message = detail to prevent whining by Python
    #   2.6.5+ access of Exception.message
    #
    # - its base class of HTTPException is no longer a Python 2.4 compatibility
    #   shim; it's purely a base class that inherits from Exception.  This
    #   implies that this class' ``exception`` property always returns
    #   ``self`` (it exists only for bw compat at this point).
    #
    # - documentation improvements (Pyramid-specific docstrings where necessary)
    #
    code = 520
    title = 'Unknown Error'
    explanation = ''
    body_template_obj = Template('''\
${explanation}${br}${br}
${detail}
${html_comment}
''')

    plain_template_obj = Template('''\
${status}

${body}''')

    html_template_obj = Template('''\
<html>
 <head>
  <title>${status}</title>
 </head>
 <body>
  <h1>${status}</h1>
  ${body}
 </body>
</html>''')

    ## Set this to True for responses that should have no request body
    empty_body = False

    def __init__(self, detail=None, headers=None, comment=None,
                 body_template=None, json_formatter=None, **kw):
        status = '%s %s' % (self.code, self.title)
        Response.__init__(self, status=status, **kw)
        Exception.__init__(self, detail)
        self.detail = self.message = detail
        if headers:
            self.headers.extend(headers)
        self.comment = comment
        if body_template is not None:
            self.body_template = body_template
            self.body_template_obj = Template(body_template)
        if json_formatter is not None:
            self._json_formatter = json_formatter

        if self.empty_body:
            del self.content_type
            del self.content_length

    def __str__(self):
        return self.detail or self.explanation

    def _json_formatter(self, status, body, title, environ):
        return {'message': body,
                'code': status,
                'title': self.title}

    def prepare(self, environ):
        if not self.has_body and not self.empty_body:
            html_comment = ''
            comment = self.comment or ''
            accept_value = environ.get('HTTP_ACCEPT', '')
            accept = MIMEAccept(accept_value)
            # Attempt to match text/html or application/json, if those don't
            # match, we will fall through to defaulting to text/plain
            match = accept.best_match(['text/html', 'application/json'])

            if match == 'text/html':
                self.content_type = 'text/html'
                escape = _html_escape
                page_template = self.html_template_obj
                br = '<br/>'
                if comment:
                    html_comment = '<!-- %s -->' % escape(comment)
            elif match == 'application/json':
                self.content_type = 'application/json'
                self.charset = None
                escape = _no_escape
                br = '\n'
                if comment:
                    html_comment = escape(comment)

                class JsonPageTemplate(object):
                    def __init__(self, excobj):
                        self.excobj = excobj

                    def substitute(self, status, body):
                        jsonbody = self.excobj._json_formatter(
                            status=status,
                            body=body, title=self.excobj.title,
                            environ=environ)
                        return json.dumps(jsonbody)

                page_template = JsonPageTemplate(self)
            else:
                self.content_type = 'text/plain'
                escape = _no_escape
                page_template = self.plain_template_obj
                br = '\n'
                if comment:
                    html_comment = escape(comment)
            args = {
                'br': br,
                'explanation': escape(self.explanation),
                'detail': escape(self.detail or ''),
                'comment': escape(comment),
                'html_comment': html_comment,
                }
            body_tmpl = self.body_template_obj
            if HTTPException.body_template_obj is not body_tmpl:
                # Custom template; add headers to args
                for k, v in environ.items():
                    if (not k.startswith('wsgi.')) and ('.' in k):
                        # omit custom environ variables, stringifying them may
                        # trigger code that should not be executed here; see
                        # https://github.com/Pylons/pyramid/issues/239
                        continue
                    args[k] = escape(v)
                for k, v in self.headers.items():
                    args[k.lower()] = escape(v)
            body = body_tmpl.substitute(args)
            page = page_template.substitute(status=self.status, body=body)
            if isinstance(page, text_type):
                page = page.encode(self.charset if self.charset else 'UTF-8')
            self.app_iter = [page]
            self.body = page

    @property
    def wsgi_response(self):
        # bw compat only
        return self

    exception = wsgi_response # bw compat only

    def __call__(self, environ, start_response):
        # differences from webob.exc.WSGIHTTPException
        #
        # - does not try to deal with HEAD requests
        #
        # - does not manufacture a new response object when generating
        #   the default response
        #
        self.prepare(environ)
        return Response.__call__(self, environ, start_response)

WSGIHTTPException = HTTPException # b/c post 1.5

class HTTPError(HTTPException):
    """
    base class for exceptions with status codes in the 400s and 500s

    This is an exception which indicates that an error has occurred,
    and that any work in progress should not be committed.
    """

class HTTPRedirection(HTTPException):
    """
    base class for exceptions with status codes in the 300s (redirections)

    This is an abstract base class for 3xx redirection.  It indicates
    that further action needs to be taken by the user agent in order
    to fulfill the request.  It does not necessarly signal an error
    condition.
    """

class HTTPSuccessful(HTTPException):
    """
    Base class for exceptions with status codes in the 200s (successful
    responses)
    """

############################################################
## 2xx success
############################################################

class HTTPOk(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    Indicates that the request has succeeded.

    code: 200, title: OK
    """
    code = 200
    title = 'OK'

class HTTPCreated(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that request has been fulfilled and resulted in a new
    resource being created.

    code: 201, title: Created
    """
    code = 201
    title = 'Created'

class HTTPAccepted(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the request has been accepted for processing, but the
    processing has not been completed.

    code: 202, title: Accepted
    """
    code = 202
    title = 'Accepted'
    explanation = 'The request is accepted for processing.'

class HTTPNonAuthoritativeInformation(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the returned metainformation in the entity-header is
    not the definitive set as available from the origin server, but is
    gathered from a local or a third-party copy.

    code: 203, title: Non-Authoritative Information
    """
    code = 203
    title = 'Non-Authoritative Information'

class HTTPNoContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the request but does
    not need to return an entity-body, and might want to return updated
    metainformation.

    code: 204, title: No Content
    """
    code = 204
    title = 'No Content'
    empty_body = True

class HTTPResetContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the request and
    the user agent SHOULD reset the document view which caused the
    request to be sent.

    code: 205, title: Reset Content
    """
    code = 205
    title = 'Reset Content'
    empty_body = True

class HTTPPartialContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the partial GET
    request for the resource.

    code: 206, title: Partial Content
    """
    code = 206
    title = 'Partial Content'

## FIXME: add 207 Multi-Status (but it's complicated)

############################################################
## 3xx redirection
############################################################

class _HTTPMove(HTTPRedirection):
    """
    redirections which require a Location field

    Since a 'Location' header is a required attribute of 301, 302, 303,
    305 and 307 (but not 304), this base class provides the mechanics to
    make this easy.

    You must provide a ``location`` keyword argument.
    """
    # differences from webob.exc._HTTPMove:
    #
    # - ${location} isn't wrapped in an <a> tag in body
    #
    # - location keyword arg defaults to ''
    #
    # - location isn't prepended with req.path_url when adding it as
    #   a header
    #
    # - ``location`` is first keyword (and positional) argument
    #
    # - ``add_slash`` argument is no longer accepted:  code that passes
    #   add_slash argument to the constructor will receive an exception.
    explanation = 'The resource has been moved to'
    body_template_obj = Template('''\
${explanation} ${location}; you should be redirected automatically.
${detail}
${html_comment}''')

    def __init__(self, location='', detail=None, headers=None, comment=None,
                 body_template=None, **kw):
        if location is None:
            raise ValueError("HTTP redirects need a location to redirect to.")
        super(_HTTPMove, self).__init__(
            detail=detail, headers=headers, comment=comment,
            body_template=body_template, location=location, **kw)

class HTTPMultipleChoices(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource corresponds to any one
    of a set of representations, each with its own specific location,
    and agent-driven negotiation information is being provided so that
    the user can select a preferred representation and redirect its
    request to that location.

    code: 300, title: Multiple Choices
    """
    code = 300
    title = 'Multiple Choices'

class HTTPMovedPermanently(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource has been assigned a new
    permanent URI and any future references to this resource SHOULD use
    one of the returned URIs.

    code: 301, title: Moved Permanently
    """
    code = 301
    title = 'Moved Permanently'

class HTTPFound(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource resides temporarily under
    a different URI.

    code: 302, title: Found
    """
    code = 302
    title = 'Found'
    explanation = 'The resource was found at'

# This one is safe after a POST (the redirected location will be
# retrieved with GET):
class HTTPSeeOther(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the response to the request can be found under
    a different URI and SHOULD be retrieved using a GET method on that
    resource.

    code: 303, title: See Other
    """
    code = 303
    title = 'See Other'

class HTTPNotModified(HTTPRedirection):
    """
    subclass of :class:`~HTTPRedirection`

    This indicates that if the client has performed a conditional GET
    request and access is allowed, but the document has not been
    modified, the server SHOULD respond with this status code.

    code: 304, title: Not Modified
    """
    # FIXME: this should include a date or etag header
    code = 304
    title = 'Not Modified'
    empty_body = True

class HTTPUseProxy(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource MUST be accessed through
    the proxy given by the Location field.

    code: 305, title: Use Proxy
    """
    # Not a move, but looks a little like one
    code = 305
    title = 'Use Proxy'
    explanation = (
        'The resource must be accessed through a proxy located at')

class HTTPTemporaryRedirect(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource resides temporarily
    under a different URI.

    code: 307, title: Temporary Redirect
    """
    code = 307
    title = 'Temporary Redirect'

############################################################
## 4xx client error
############################################################

class HTTPClientError(HTTPError):
    """
    base class for the 400s, where the client is in error

    This is an error condition in which the client is presumed to be
    in-error.  This is an expected problem, and thus is not considered
    a bug.  A server-side traceback is not warranted.  Unless specialized,
    this is a '400 Bad Request'
    """
    pass

class HTTPBadRequest(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the body or headers failed validity checks,
    preventing the server from being able to continue processing.

    code: 400, title: Bad Request
    """
    code = 400
    title = 'Bad Request'
    explanation = ('The server could not comply with the request since '
                   'it is either malformed or otherwise incorrect.')

class HTTPUnauthorized(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the request requires user authentication.

    code: 401, title: Unauthorized
    """
    code = 401
    title = 'Unauthorized'
    explanation = (
        'This server could not verify that you are authorized to '
        'access the document you requested.  Either you supplied the '
        'wrong credentials (e.g., bad password), or your browser '
        'does not understand how to supply the credentials required.')

class HTTPPaymentRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    code: 402, title: Payment Required
    """
    code = 402
    title = 'Payment Required'
    explanation = ('Access was denied for financial reasons.')

class HTTPForbidden(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server understood the request, but is
    refusing to fulfill it.

    code: 403, title: Forbidden

    Raise this exception within :term:`view` code to immediately return the
    :term:`forbidden view` to the invoking user.  Usually this is a basic
    ``403`` page, but the forbidden view can be customized as necessary.  See
    :ref:`changing_the_forbidden_view`.  A ``Forbidden`` exception will be
    the ``context`` of a :term:`Forbidden View`.

    This exception's constructor treats two arguments specially.  The first
    argument, ``detail``, should be a string.  The value of this string will
    be used as the ``message`` attribute of the exception object.  The second
    special keyword argument, ``result`` is usually an instance of
    :class:`pyramid.security.Denied` or :class:`pyramid.security.ACLDenied`
    each of which indicates a reason for the forbidden error.  However,
    ``result`` is also permitted to be just a plain boolean ``False`` object
    or ``None``.  The ``result`` value will be used as the ``result``
    attribute of the exception object.  It defaults to ``None``.

    The :term:`Forbidden View` can use the attributes of a Forbidden
    exception as necessary to provide extended information in an error
    report shown to a user.
    """
    # differences from webob.exc.HTTPForbidden:
    #
    # - accepts a ``result`` keyword argument
    #
    # - overrides constructor to set ``self.result``
    #
    # differences from older ``pyramid.exceptions.Forbidden``:
    #
    # - ``result`` must be passed as a keyword argument.
    #
    code = 403
    title = 'Forbidden'
    explanation = ('Access was denied to this resource.')
    def __init__(self, detail=None, headers=None, comment=None,
                 body_template=None, result=None, **kw):
        HTTPClientError.__init__(self, detail=detail, headers=headers,
                                 comment=comment, body_template=body_template,
                                 **kw)
        self.result = result

class HTTPNotFound(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server did not find anything matching the
    Request-URI.

    code: 404, title: Not Found

    Raise this exception within :term:`view` code to immediately
    return the :term:`Not Found View` to the invoking user.  Usually
    this is a basic ``404`` page, but the Not Found View can be
    customized as necessary.  See :ref:`changing_the_notfound_view`.

    This exception's constructor accepts a ``detail`` argument
    (the first argument), which should be a string.  The value of this
    string will be available as the ``message`` attribute of this exception,
    for availability to the :term:`Not Found View`.
    """
    code = 404
    title = 'Not Found'
    explanation = ('The resource could not be found.')

class HTTPMethodNotAllowed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the method specified in the Request-Line is
    not allowed for the resource identified by the Request-URI.

    code: 405, title: Method Not Allowed
    """
    # differences from webob.exc.HTTPMethodNotAllowed:
    #
    # - body_template_obj uses ${br} instead of <br />
    code = 405
    title = 'Method Not Allowed'
    body_template_obj = Template('''\
The method ${REQUEST_METHOD} is not allowed for this resource. ${br}${br}
${detail}''')

class HTTPNotAcceptable(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates the resource identified by the request is only
    capable of generating response entities which have content
    characteristics not acceptable according to the accept headers
    sent in the request.

    code: 406, title: Not Acceptable
    """
    # differences from webob.exc.HTTPNotAcceptable:
    #
    # - "template" attribute left off (useless, bug in webob?)
    code = 406
    title = 'Not Acceptable'

class HTTPProxyAuthenticationRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This is similar to 401, but indicates that the client must first
    authenticate itself with the proxy.

    code: 407, title: Proxy Authentication Required
    """
    code = 407
    title = 'Proxy Authentication Required'
    explanation = ('Authentication with a local proxy is needed.')

class HTTPRequestTimeout(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the client did not produce a request within
    the time that the server was prepared to wait.

    code: 408, title: Request Timeout
    """
    code = 408
    title = 'Request Timeout'
    explanation = ('The server has waited too long for the request to '
                   'be sent by the client.')

class HTTPConflict(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the request could not be completed due to a
    conflict with the current state of the resource.

    code: 409, title: Conflict
    """
    code = 409
    title = 'Conflict'
    explanation = ('There was a conflict when trying to complete '
                   'your request.')

class HTTPGone(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the requested resource is no longer available
    at the server and no forwarding address is known.

    code: 410, title: Gone
    """
    code = 410
    title = 'Gone'
    explanation = ('This resource is no longer available.  No forwarding '
                   'address is given.')

class HTTPLengthRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server refuses to accept the request
    without a defined Content-Length.

    code: 411, title: Length Required
    """
    code = 411
    title = 'Length Required'
    explanation = ('Content-Length header required.')

class HTTPPreconditionFailed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the precondition given in one or more of the
    request-header fields evaluated to false when it was tested on the
    server.

    code: 412, title: Precondition Failed
    """
    code = 412
    title = 'Precondition Failed'
    explanation = ('Request precondition failed.')

class HTTPRequestEntityTooLarge(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to process a request
    because the request entity is larger than the server is willing or
    able to process.

    code: 413, title: Request Entity Too Large
    """
    code = 413
    title = 'Request Entity Too Large'
    explanation = ('The body of your request was too large for this server.')

class HTTPRequestURITooLong(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to service the request
    because the Request-URI is longer than the server is willing to
    interpret.

    code: 414, title: Request-URI Too Long
    """
    code = 414
    title = 'Request-URI Too Long'
    explanation = ('The request URI was too long for this server.')

class HTTPUnsupportedMediaType(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to service the request
    because the entity of the request is in a format not supported by
    the requested resource for the requested method.

    code: 415, title: Unsupported Media Type
    """
    # differences from webob.exc.HTTPUnsupportedMediaType:
    #
    # - "template_obj" attribute left off (useless, bug in webob?)
    code = 415
    title = 'Unsupported Media Type'

class HTTPRequestRangeNotSatisfiable(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    The server SHOULD return a response with this status code if a
    request included a Range request-header field, and none of the
    range-specifier values in this field overlap the current extent
    of the selected resource, and the request did not include an
    If-Range request-header field.

    code: 416, title: Request Range Not Satisfiable
    """
    code = 416
    title = 'Request Range Not Satisfiable'
    explanation = ('The Range requested is not available.')

class HTTPExpectationFailed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indidcates that the expectation given in an Expect
    request-header field could not be met by this server.

    code: 417, title: Expectation Failed
    """
    code = 417
    title = 'Expectation Failed'
    explanation = ('Expectation failed.')

class HTTPUnprocessableEntity(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is unable to process the contained
    instructions.

    May be used to notify the client that their JSON/XML is well formed, but
    not correct for the current request.

    See RFC4918 section 11 for more information.

    code: 422, title: Unprocessable Entity
    """
    ## Note: from WebDAV
    code = 422
    title = 'Unprocessable Entity'
    explanation = 'Unable to process the contained instructions'

class HTTPLocked(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the resource is locked.

    code: 423, title: Locked
    """
    ## Note: from WebDAV
    code = 423
    title = 'Locked'
    explanation = ('The resource is locked')

class HTTPFailedDependency(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the method could not be performed because the
    requested action depended on another action and that action failed.

    code: 424, title: Failed Dependency
    """
    ## Note: from WebDAV
    code = 424
    title = 'Failed Dependency'
    explanation = (
        'The method could not be performed because the requested '
        'action dependended on another action and that action failed')

class HTTPPreconditionRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the origin server requires the
    request to be conditional.

    Its typical use is to avoid the "lost update" problem, where a client
    GETs a resource's state, modifies it, and PUTs it back to the server,
    when meanwhile a third party has modified the state on the server,
    leading to a conflict.  By requiring requests to be conditional, the
    server can assure that clients are working with the correct copies.

    RFC 6585.3

    code: 428, title: Precondition Required
    """
    code = 428
    title = 'Precondition Required'
    explanation = (
        'The origin server requires the request to be conditional.')

class HTTPTooManyRequests(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the user has sent too many
    requests in a given amount of time ("rate limiting").

    RFC 6585.4

    code: 429, title: Too Many Requests
    """
    code = 429
    title = 'Too Many Requests'
    explanation = (
        'The action could not be performed because there were too '
        'many requests by the client.')

class HTTPRequestHeaderFieldsTooLarge(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is unwilling to process
    the request because its header fields are too large.  The request MAY
    be resubmitted after reducing the size of the request header fields.

    RFC 6585.5

    code: 431, title: Request Header Fields Too Large
    """
    code = 431
    title = 'Request Header Fields Too Large'
    explanation = (
        'The requests header fields were too large.')

############################################################
## 5xx Server Error
############################################################
#  Response status codes beginning with the digit "5" indicate cases in
#  which the server is aware that it has erred or is incapable of
#  performing the request. Except when responding to a HEAD request, the
#  server SHOULD include an entity containing an explanation of the error
#  situation, and whether it is a temporary or permanent condition. User
#  agents SHOULD display any included entity to the user. These response
#  codes are applicable to any request method.

class HTTPServerError(HTTPError):
    """
    base class for the 500s, where the server is in-error

    This is an error condition in which the server is presumed to be
    in-error.  Unless specialized, this is a '500 Internal Server Error'.
    """
    pass

class HTTPInternalServerError(HTTPServerError):
    code = 500
    title = 'Internal Server Error'
    explanation = (
        'The server has either erred or is incapable of performing '
        'the requested operation.')

class HTTPNotImplemented(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not support the functionality
    required to fulfill the request.

    code: 501, title: Not Implemented
    """
    # differences from webob.exc.HTTPNotAcceptable:
    #
    # - "template" attr left off (useless, bug in webob?)
    code = 501
    title = 'Not Implemented'

class HTTPBadGateway(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server, while acting as a gateway or proxy,
    received an invalid response from the upstream server it accessed
    in attempting to fulfill the request.

    code: 502, title: Bad Gateway
    """
    code = 502
    title = 'Bad Gateway'
    explanation = ('Bad gateway.')

class HTTPServiceUnavailable(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server is currently unable to handle the
    request due to a temporary overloading or maintenance of the server.

    code: 503, title: Service Unavailable
    """
    code = 503
    title = 'Service Unavailable'
    explanation = ('The server is currently unavailable. '
                   'Please try again at a later time.')

class HTTPGatewayTimeout(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server, while acting as a gateway or proxy,
    did not receive a timely response from the upstream server specified
    by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server
    (e.g. DNS) it needed to access in attempting to complete the request.

    code: 504, title: Gateway Timeout
    """
    code = 504
    title = 'Gateway Timeout'
    explanation = ('The gateway has timed out.')

class HTTPVersionNotSupported(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not support, or refuses to
    support, the HTTP protocol version that was used in the request
    message.

    code: 505, title: HTTP Version Not Supported
    """
    code = 505
    title = 'HTTP Version Not Supported'
    explanation = ('The HTTP version is not supported.')

class HTTPInsufficientStorage(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not have enough space to save
    the resource.

    code: 507, title: Insufficient Storage
    """
    code = 507
    title = 'Insufficient Storage'
    explanation = ('There was not enough space to save the resource')

def exception_response(status_code, **kw):
    """Creates an HTTP exception based on a status code. Example::

        raise exception_response(404) # raises an HTTPNotFound exception.

    The values passed as ``kw`` are provided to the exception's constructor.
    """
    exc = status_map[status_code](**kw)
    return exc

def default_exceptionresponse_view(context, request):
    if not isinstance(context, Exception):
        # backwards compat for an exception response view registered via
        # config.set_notfound_view or config.set_forbidden_view
        # instead of as a proper exception view
        context = request.exception or context
    return context # assumed to be an IResponse

status_map = {}
code = None
for name, value in list(globals().items()):
    if (
            isinstance(value, class_types) and
            issubclass(value, HTTPException) and
            not name.startswith('_')
    ):
        code = getattr(value, 'code', None)
        if code:
            status_map[code] = value
del name, value, code

```
--- 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:** HTTPException `__str__` Method Returns Non-String When `detail` Is Not a String

**Description:**
When an `HTTPException` is instantiated with a `detail` that is not a string (e.g., a dictionary), invoking `str()` on the exception returns the `detail` object directly instead of a string representation. This behavior can lead to unexpected issues in parts of the application that expect the exception's string representation to always be a string.

**Example Code:**
```python
from pyramid.httpexceptions import HTTPException

exc = HTTPException(detail={'error': 'This is a test'})
print(str(exc))  # Outputs: {'error': 'This is a test'}
```

**Expected Behavior:**
The `__str__` method of `HTTPException` should always return a string, regardless of the type of `detail`. Even if `detail` is a non-string object, its string representation should be returned.

**Actual Behavior:**
When `detail` is a non-string object, the `__str__` method returns the `detail` object directly, which may not be a string. This can cause issues in parts of the code that expect a string, leading to potential errors or unexpected behavior.

[/ISSUE]
{
    "Test_exception_response.test_extra_kw": "PASSED",
    "Test_exception_response.test_status_201": "PASSED",
    "Test_exception_response.test_status_400": "PASSED",
    "Test_exception_response.test_status_404": "PASSED",
    "Test_exception_response.test_status_500": "PASSED",
    "Test_default_exceptionresponse_view.test_call_with_exception": "PASSED",
    "Test_default_exceptionresponse_view.test_call_with_nonexception": "PASSED",
    "Test__no_escape.test_not_basestring": "PASSED",
    "Test__no_escape.test_null": "PASSED",
    "Test__no_escape.test_unicode": "PASSED",
    "TestHTTPException.test__calls_start_response": "PASSED",
    "TestHTTPException.test__content_type": "PASSED",
    "TestHTTPException.test__content_type_application_json": "PASSED",
    "TestHTTPException.test__content_type_default_is_html": "PASSED",
    "TestHTTPException.test__content_type_text_html": "PASSED",
    "TestHTTPException.test__default_app_iter_no_comment_html": "PASSED",
    "TestHTTPException.test__default_app_iter_no_comment_plain": "PASSED",
    "TestHTTPException.test__default_app_iter_with_comment_ampersand": "PASSED",
    "TestHTTPException.test__default_app_iter_with_comment_html": "PASSED",
    "TestHTTPException.test__default_app_iter_with_comment_json": "PASSED",
    "TestHTTPException.test__default_app_iter_with_comment_plain": "PASSED",
    "TestHTTPException.test__default_app_iter_with_custom_json": "PASSED",
    "TestHTTPException.test__str__detail": "PASSED",
    "TestHTTPException.test__str__explanation": "PASSED",
    "TestHTTPException.test_allow_detail_non_str": "PASSED",
    "TestHTTPException.test_body_template_unicode": "PASSED",
    "TestHTTPException.test_call_returns_same_body_called_twice": "PASSED",
    "TestHTTPException.test_ctor_calls_Exception_ctor": "PASSED",
    "TestHTTPException.test_ctor_calls_Response_ctor": "PASSED",
    "TestHTTPException.test_ctor_extends_headers": "PASSED",
    "TestHTTPException.test_ctor_sets_body_template_obj": "PASSED",
    "TestHTTPException.test_ctor_sets_comment": "PASSED",
    "TestHTTPException.test_ctor_sets_detail": "PASSED",
    "TestHTTPException.test_ctor_with_app_iter_doesnt_set_default_app_iter": "PASSED",
    "TestHTTPException.test_ctor_with_body_doesnt_set_default_app_iter": "PASSED",
    "TestHTTPException.test_ctor_with_body_sets_default_app_iter_html": "PASSED",
    "TestHTTPException.test_ctor_with_body_sets_default_app_iter_text": "PASSED",
    "TestHTTPException.test_ctor_with_empty_body": "PASSED",
    "TestHTTPException.test_ctor_with_unicode_body_doesnt_set_default_app_iter": "PASSED",
    "TestHTTPException.test_custom_body_template": "PASSED",
    "TestHTTPException.test_custom_body_template_with_custom_variable_doesnt_choke": "PASSED",
    "TestHTTPException.test_exception": "PASSED",
    "TestHTTPException.test_implements_IExceptionResponse": "PASSED",
    "TestHTTPException.test_implements_IResponse": "PASSED",
    "TestHTTPException.test_provides_IExceptionResponse": "PASSED",
    "TestHTTPException.test_provides_IResponse": "PASSED",
    "TestHTTPException.test_wsgi_response": "PASSED",
    "TestRenderAllExceptionsWithoutArguments.test_it_html": "PASSED",
    "TestRenderAllExceptionsWithoutArguments.test_it_plain": "PASSED",
    "Test_HTTPMove.test_it_call_with_default_body_tmpl": "PASSED",
    "Test_HTTPMove.test_it_location_firstarg": "PASSED",
    "Test_HTTPMove.test_it_location_none_valueerrors": "PASSED",
    "Test_HTTPMove.test_it_location_not_passed": "PASSED",
    "Test_HTTPMove.test_it_location_passed": "PASSED",
    "TestHTTPForbidden.test_it_result_not_passed": "PASSED",
    "TestHTTPForbidden.test_it_result_passed": "PASSED",
    "TestHTTPMethodNotAllowed.test_it_with_default_body_tmpl": "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_invalid_kwargs": "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_does_not_propagate_request_for_diff_registry": "PASSED",
    "ConfiguratorTests.test_begin_overrides_request": "PASSED",
    "ConfiguratorTests.test_begin_propagates_request_for_same_registry": "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_executing_conflicting_action_across_orders": "PASSED",
    "TestActionState.test_executing_conflicting_action_across_reentrant_orders": "PASSED",
    "TestActionState.test_it": "PASSED",
    "TestActionState.test_processSpec": "PASSED",
    "TestActionState.test_reentrant_action": "PASSED",
    "TestActionState.test_reentrant_action_error": "PASSED",
    "TestActionState.test_reentrant_action_with_deferred_discriminator": "PASSED",
    "TestActionState.test_reentrant_action_without_clear": "PASSED",
    "Test_reentrant_action_functional.test_deferred_discriminator": "PASSED",
    "Test_reentrant_action_functional.test_functional": "PASSED",
    "Test_resolveConflicts.test_conflicts_across_orders": "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",
    "Test_resolveConflicts.test_override_success_across_orders": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "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_changing_set_default_csrf_options": "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_csrf_options": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_permission": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_uses_original_dict": "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_csrf_trusted_origins": "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_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",
    "TestDeprecatedPredicates.test_it": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_exception_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults": "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_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_require_csrf": "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_normal_and_exception_view_intr_derived_callable": "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_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_require_csrf": "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_multiviews": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_only_exc_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_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_misconfiguration": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_no_regular_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_runtime_exc_view.test_call": "PASSED",
    "Test_runtime_exc_view.test_call_dispatches_on_exception": "PASSED",
    "Test_runtime_exc_view.test_permitted": "PASSED",
    "Test_runtime_exc_view.test_permitted_dispatches_on_exception": "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",
    "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_package_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_display_headers": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_good_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "PASSED",
    "TestPRequestCommand.test_command_method_configures_logging": "PASSED",
    "TestPRequestCommand.test_command_method_get": "PASSED",
    "TestPRequestCommand.test_command_method_options": "PASSED",
    "TestPRequestCommand.test_command_method_patch": "PASSED",
    "TestPRequestCommand.test_command_method_post": "PASSED",
    "TestPRequestCommand.test_command_method_propfind": "PASSED",
    "TestPRequestCommand.test_command_method_put": "PASSED",
    "TestPRequestCommand.test_command_not_enough_args": "PASSED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "PASSED",
    "TestPRequestCommand.test_command_response_has_no_charset": "PASSED",
    "TestPRequestCommand.test_command_two_args": "PASSED",
    "TestPRequestCommand.test_command_w_basic_auth": "PASSED",
    "TestPRequestCommand.test_command_with_query_string": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_bad_format": "PASSED",
    "TestPRoutesCommand.test_class_view": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_commas": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_newlines": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_spaces": "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_config_vars_no_command": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_run_no_args": "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",
    "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_doesnt_use_override_w_autocommit": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit": "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",
    "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",
    "TestPServeCommand.test_config_file_finds_watch_files": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED"
}
diff --git a/pyramid/httpexceptions.py b/pyramid/httpexceptions.py
index a22b088c6..1f3934fdc 100644
--- a/pyramid/httpexceptions.py
+++ b/pyramid/httpexceptions.py
@@ -238,7 +238,7 @@ ${body}''')
             del self.content_length
 
     def __str__(self):
-        return self.detail or self.explanation
+        return str(self.detail) if self.detail else self.explanation
 
     def _json_formatter(self, status, body, title, environ):
         return {'message': body,

{"pyramid/httpexceptions.py": "\"\"\"\nHTTP Exceptions\n---------------\n\nThis module contains Pyramid HTTP exception classes.  Each class relates to a\nsingle HTTP status code.  Each class is a subclass of the\n:class:`~HTTPException`.  Each exception class is also a :term:`response`\nobject.\n\nEach exception class has a status code according to :rfc:`2068`:\ncodes with 100-300 are not really errors; 400s are client errors,\nand 500s are server errors.\n\nException\n  HTTPException\n    HTTPSuccessful\n      * 200 - HTTPOk\n      * 201 - HTTPCreated\n      * 202 - HTTPAccepted\n      * 203 - HTTPNonAuthoritativeInformation\n      * 204 - HTTPNoContent\n      * 205 - HTTPResetContent\n      * 206 - HTTPPartialContent\n    HTTPRedirection\n      * 300 - HTTPMultipleChoices\n      * 301 - HTTPMovedPermanently\n      * 302 - HTTPFound\n      * 303 - HTTPSeeOther\n      * 304 - HTTPNotModified\n      * 305 - HTTPUseProxy\n      * 307 - HTTPTemporaryRedirect\n    HTTPError\n      HTTPClientError\n        * 400 - HTTPBadRequest\n        * 401 - HTTPUnauthorized\n        * 402 - HTTPPaymentRequired\n        * 403 - HTTPForbidden\n        * 404 - HTTPNotFound\n        * 405 - HTTPMethodNotAllowed\n        * 406 - HTTPNotAcceptable\n        * 407 - HTTPProxyAuthenticationRequired\n        * 408 - HTTPRequestTimeout\n        * 409 - HTTPConflict\n        * 410 - HTTPGone\n        * 411 - HTTPLengthRequired\n        * 412 - HTTPPreconditionFailed\n        * 413 - HTTPRequestEntityTooLarge\n        * 414 - HTTPRequestURITooLong\n        * 415 - HTTPUnsupportedMediaType\n        * 416 - HTTPRequestRangeNotSatisfiable\n        * 417 - HTTPExpectationFailed\n        * 422 - HTTPUnprocessableEntity\n        * 423 - HTTPLocked\n        * 424 - HTTPFailedDependency\n        * 428 - HTTPPreconditionRequired\n        * 429 - HTTPTooManyRequests\n        * 431 - HTTPRequestHeaderFieldsTooLarge\n      HTTPServerError\n        * 500 - HTTPInternalServerError\n        * 501 - HTTPNotImplemented\n        * 502 - HTTPBadGateway\n        * 503 - HTTPServiceUnavailable\n        * 504 - HTTPGatewayTimeout\n        * 505 - HTTPVersionNotSupported\n        * 507 - HTTPInsufficientStorage\n\nHTTP exceptions are also :term:`response` objects, thus they accept most of\nthe same parameters that can be passed to a regular\n:class:`~pyramid.response.Response`. Each HTTP exception also has the\nfollowing attributes:\n\n   ``code``\n       the HTTP status code for the exception\n\n   ``title``\n       remainder of the status line (stuff after the code)\n\n   ``explanation``\n       a plain-text explanation of the error message that is\n       not subject to environment or header substitutions;\n       it is accessible in the template via ${explanation}\n\n   ``detail``\n       a plain-text message customization that is not subject\n       to environment or header substitutions; accessible in\n       the template via ${detail}\n\n   ``body_template``\n       a ``String.template``-format content fragment used for environment\n       and header substitution; the default template includes both\n       the explanation and further detail provided in the\n       message.\n\nEach HTTP exception accepts the following parameters, any others will\nbe forwarded to its :class:`~pyramid.response.Response` superclass:\n\n   ``detail``\n     a plain-text override of the default ``detail``\n\n   ``headers``\n     a list of (k,v) header pairs, or a dict, to be added to the\n     response; use the content_type='application/json' kwarg and other\n     similar kwargs to to change properties of the response supported by the\n     :class:`pyramid.response.Response` superclass\n\n   ``comment``\n     a plain-text additional information which is\n     usually stripped/hidden for end-users\n\n   ``body_template``\n     a ``string.Template`` object containing a content fragment in HTML\n     that frames the explanation and further detail\n\n   ``body``\n     a string that will override the ``body_template`` and be used as the\n     body of the response.\n\nSubstitution of response headers into template values is always performed.\nSubstitution of WSGI environment values is performed if a ``request`` is\npassed to the exception's constructor.\n\nThe subclasses of :class:`~_HTTPMove`\n(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,\n:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and\n:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``\nfield. Reflecting this, these subclasses have one additional keyword argument:\n``location``, which indicates the location to which to redirect.\n\"\"\"\nimport json\n\nfrom string import Template\n\nfrom zope.interface import implementer\n\nfrom webob import html_escape as _html_escape\nfrom webob.acceptparse import MIMEAccept\n\nfrom pyramid.compat import (\n    class_types,\n    text_type,\n    binary_type,\n    text_,\n    )\n\nfrom pyramid.interfaces import IExceptionResponse\nfrom pyramid.response import Response\n\ndef _no_escape(value):\n    if value is None:\n        return ''\n    if not isinstance(value, text_type):\n        if hasattr(value, '__unicode__'):\n            value = value.__unicode__()\n        if isinstance(value, binary_type):\n            value = text_(value, 'utf-8')\n        else:\n            value = text_type(value)\n    return value\n\n@implementer(IExceptionResponse)\nclass HTTPException(Response, Exception):\n\n    ## You should set in subclasses:\n    # code = 200\n    # title = 'OK'\n    # explanation = 'why this happens'\n    # body_template_obj = Template('response template')\n    #\n    # This class itself uses the error code \"520\" with the error message/title\n    # of \"Unknown Error\". This is not an RFC standard, however it is\n    # implemented in practice. Sub-classes should be overriding the default\n    # values and 520 should not be seen in the wild from Pyramid applications.\n    # Due to changes in WebOb, a code of \"None\" is not valid, and WebOb due to\n    # more strict error checking rejects it now.\n\n    # differences from webob.exc.WSGIHTTPException:\n    #\n    # - doesn't use \"strip_tags\" (${br} placeholder for <br/>, no other html\n    #   in default body template)\n    #\n    # - __call__ never generates a new Response, it always mutates self\n    #\n    # - explicitly sets self.message = detail to prevent whining by Python\n    #   2.6.5+ access of Exception.message\n    #\n    # - its base class of HTTPException is no longer a Python 2.4 compatibility\n    #   shim; it's purely a base class that inherits from Exception.  This\n    #   implies that this class' ``exception`` property always returns\n    #   ``self`` (it exists only for bw compat at this point).\n    #\n    # - documentation improvements (Pyramid-specific docstrings where necessary)\n    #\n    code = 520\n    title = 'Unknown Error'\n    explanation = ''\n    body_template_obj = Template('''\\\n${explanation}${br}${br}\n${detail}\n${html_comment}\n''')\n\n    plain_template_obj = Template('''\\\n${status}\n\n${body}''')\n\n    html_template_obj = Template('''\\\n<html>\n <head>\n  <title>${status}</title>\n </head>\n <body>\n  <h1>${status}</h1>\n  ${body}\n </body>\n</html>''')\n\n    ## Set this to True for responses that should have no request body\n    empty_body = False\n\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, json_formatter=None, **kw):\n        status = '%s %s' % (self.code, self.title)\n        Response.__init__(self, status=status, **kw)\n        Exception.__init__(self, detail)\n        self.detail = self.message = detail\n        if headers:\n            self.headers.extend(headers)\n        self.comment = comment\n        if body_template is not None:\n            self.body_template = body_template\n            self.body_template_obj = Template(body_template)\n        if json_formatter is not None:\n            self._json_formatter = json_formatter\n\n        if self.empty_body:\n            del self.content_type\n            del self.content_length\n\n    def __str__(self):\n        return self.detail or self.explanation\n\n    def _json_formatter(self, status, body, title, environ):\n        return {'message': body,\n                'code': status,\n                'title': self.title}\n\n    def prepare(self, environ):\n        if not self.has_body and not self.empty_body:\n            html_comment = ''\n            comment = self.comment or ''\n            accept_value = environ.get('HTTP_ACCEPT', '')\n            accept = MIMEAccept(accept_value)\n            # Attempt to match text/html or application/json, if those don't\n            # match, we will fall through to defaulting to text/plain\n            match = accept.best_match(['text/html', 'application/json'])\n\n            if match == 'text/html':\n                self.content_type = 'text/html'\n                escape = _html_escape\n                page_template = self.html_template_obj\n                br = '<br/>'\n                if comment:\n                    html_comment = '<!-- %s -->' % escape(comment)\n            elif match == 'application/json':\n                self.content_type = 'application/json'\n                self.charset = None\n                escape = _no_escape\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n\n                class JsonPageTemplate(object):\n                    def __init__(self, excobj):\n                        self.excobj = excobj\n\n                    def substitute(self, status, body):\n                        jsonbody = self.excobj._json_formatter(\n                            status=status,\n                            body=body, title=self.excobj.title,\n                            environ=environ)\n                        return json.dumps(jsonbody)\n\n                page_template = JsonPageTemplate(self)\n            else:\n                self.content_type = 'text/plain'\n                escape = _no_escape\n                page_template = self.plain_template_obj\n                br = '\\n'\n                if comment:\n                    html_comment = escape(comment)\n            args = {\n                'br': br,\n                'explanation': escape(self.explanation),\n                'detail': escape(self.detail or ''),\n                'comment': escape(comment),\n                'html_comment': html_comment,\n                }\n            body_tmpl = self.body_template_obj\n            if HTTPException.body_template_obj is not body_tmpl:\n                # Custom template; add headers to args\n                for k, v in environ.items():\n                    if (not k.startswith('wsgi.')) and ('.' in k):\n                        # omit custom environ variables, stringifying them may\n                        # trigger code that should not be executed here; see\n                        # https://github.com/Pylons/pyramid/issues/239\n                        continue\n                    args[k] = escape(v)\n                for k, v in self.headers.items():\n                    args[k.lower()] = escape(v)\n            body = body_tmpl.substitute(args)\n            page = page_template.substitute(status=self.status, body=body)\n            if isinstance(page, text_type):\n                page = page.encode(self.charset if self.charset else 'UTF-8')\n            self.app_iter = [page]\n            self.body = page\n\n    @property\n    def wsgi_response(self):\n        # bw compat only\n        return self\n\n    exception = wsgi_response # bw compat only\n\n    def __call__(self, environ, start_response):\n        # differences from webob.exc.WSGIHTTPException\n        #\n        # - does not try to deal with HEAD requests\n        #\n        # - does not manufacture a new response object when generating\n        #   the default response\n        #\n        self.prepare(environ)\n        return Response.__call__(self, environ, start_response)\n\nWSGIHTTPException = HTTPException # b/c post 1.5\n\nclass HTTPError(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 400s and 500s\n\n    This is an exception which indicates that an error has occurred,\n    and that any work in progress should not be committed.\n    \"\"\"\n\nclass HTTPRedirection(HTTPException):\n    \"\"\"\n    base class for exceptions with status codes in the 300s (redirections)\n\n    This is an abstract base class for 3xx redirection.  It indicates\n    that further action needs to be taken by the user agent in order\n    to fulfill the request.  It does not necessarly signal an error\n    condition.\n    \"\"\"\n\nclass HTTPSuccessful(HTTPException):\n    \"\"\"\n    Base class for exceptions with status codes in the 200s (successful\n    responses)\n    \"\"\"\n\n############################################################\n## 2xx success\n############################################################\n\nclass HTTPOk(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    Indicates that the request has succeeded.\n\n    code: 200, title: OK\n    \"\"\"\n    code = 200\n    title = 'OK'\n\nclass HTTPCreated(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that request has been fulfilled and resulted in a new\n    resource being created.\n\n    code: 201, title: Created\n    \"\"\"\n    code = 201\n    title = 'Created'\n\nclass HTTPAccepted(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the request has been accepted for processing, but the\n    processing has not been completed.\n\n    code: 202, title: Accepted\n    \"\"\"\n    code = 202\n    title = 'Accepted'\n    explanation = 'The request is accepted for processing.'\n\nclass HTTPNonAuthoritativeInformation(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the returned metainformation in the entity-header is\n    not the definitive set as available from the origin server, but is\n    gathered from a local or a third-party copy.\n\n    code: 203, title: Non-Authoritative Information\n    \"\"\"\n    code = 203\n    title = 'Non-Authoritative Information'\n\nclass HTTPNoContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request but does\n    not need to return an entity-body, and might want to return updated\n    metainformation.\n\n    code: 204, title: No Content\n    \"\"\"\n    code = 204\n    title = 'No Content'\n    empty_body = True\n\nclass HTTPResetContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the request and\n    the user agent SHOULD reset the document view which caused the\n    request to be sent.\n\n    code: 205, title: Reset Content\n    \"\"\"\n    code = 205\n    title = 'Reset Content'\n    empty_body = True\n\nclass HTTPPartialContent(HTTPSuccessful):\n    \"\"\"\n    subclass of :class:`~HTTPSuccessful`\n\n    This indicates that the server has fulfilled the partial GET\n    request for the resource.\n\n    code: 206, title: Partial Content\n    \"\"\"\n    code = 206\n    title = 'Partial Content'\n\n## FIXME: add 207 Multi-Status (but it's complicated)\n\n############################################################\n## 3xx redirection\n############################################################\n\nclass _HTTPMove(HTTPRedirection):\n    \"\"\"\n    redirections which require a Location field\n\n    Since a 'Location' header is a required attribute of 301, 302, 303,\n    305 and 307 (but not 304), this base class provides the mechanics to\n    make this easy.\n\n    You must provide a ``location`` keyword argument.\n    \"\"\"\n    # differences from webob.exc._HTTPMove:\n    #\n    # - ${location} isn't wrapped in an <a> tag in body\n    #\n    # - location keyword arg defaults to ''\n    #\n    # - location isn't prepended with req.path_url when adding it as\n    #   a header\n    #\n    # - ``location`` is first keyword (and positional) argument\n    #\n    # - ``add_slash`` argument is no longer accepted:  code that passes\n    #   add_slash argument to the constructor will receive an exception.\n    explanation = 'The resource has been moved to'\n    body_template_obj = Template('''\\\n${explanation} ${location}; you should be redirected automatically.\n${detail}\n${html_comment}''')\n\n    def __init__(self, location='', detail=None, headers=None, comment=None,\n                 body_template=None, **kw):\n        if location is None:\n            raise ValueError(\"HTTP redirects need a location to redirect to.\")\n        super(_HTTPMove, self).__init__(\n            detail=detail, headers=headers, comment=comment,\n            body_template=body_template, location=location, **kw)\n\nclass HTTPMultipleChoices(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource corresponds to any one\n    of a set of representations, each with its own specific location,\n    and agent-driven negotiation information is being provided so that\n    the user can select a preferred representation and redirect its\n    request to that location.\n\n    code: 300, title: Multiple Choices\n    \"\"\"\n    code = 300\n    title = 'Multiple Choices'\n\nclass HTTPMovedPermanently(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource has been assigned a new\n    permanent URI and any future references to this resource SHOULD use\n    one of the returned URIs.\n\n    code: 301, title: Moved Permanently\n    \"\"\"\n    code = 301\n    title = 'Moved Permanently'\n\nclass HTTPFound(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily under\n    a different URI.\n\n    code: 302, title: Found\n    \"\"\"\n    code = 302\n    title = 'Found'\n    explanation = 'The resource was found at'\n\n# This one is safe after a POST (the redirected location will be\n# retrieved with GET):\nclass HTTPSeeOther(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the response to the request can be found under\n    a different URI and SHOULD be retrieved using a GET method on that\n    resource.\n\n    code: 303, title: See Other\n    \"\"\"\n    code = 303\n    title = 'See Other'\n\nclass HTTPNotModified(HTTPRedirection):\n    \"\"\"\n    subclass of :class:`~HTTPRedirection`\n\n    This indicates that if the client has performed a conditional GET\n    request and access is allowed, but the document has not been\n    modified, the server SHOULD respond with this status code.\n\n    code: 304, title: Not Modified\n    \"\"\"\n    # FIXME: this should include a date or etag header\n    code = 304\n    title = 'Not Modified'\n    empty_body = True\n\nclass HTTPUseProxy(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource MUST be accessed through\n    the proxy given by the Location field.\n\n    code: 305, title: Use Proxy\n    \"\"\"\n    # Not a move, but looks a little like one\n    code = 305\n    title = 'Use Proxy'\n    explanation = (\n        'The resource must be accessed through a proxy located at')\n\nclass HTTPTemporaryRedirect(_HTTPMove):\n    \"\"\"\n    subclass of :class:`~_HTTPMove`\n\n    This indicates that the requested resource resides temporarily\n    under a different URI.\n\n    code: 307, title: Temporary Redirect\n    \"\"\"\n    code = 307\n    title = 'Temporary Redirect'\n\n############################################################\n## 4xx client error\n############################################################\n\nclass HTTPClientError(HTTPError):\n    \"\"\"\n    base class for the 400s, where the client is in error\n\n    This is an error condition in which the client is presumed to be\n    in-error.  This is an expected problem, and thus is not considered\n    a bug.  A server-side traceback is not warranted.  Unless specialized,\n    this is a '400 Bad Request'\n    \"\"\"\n    pass\n\nclass HTTPBadRequest(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the body or headers failed validity checks,\n    preventing the server from being able to continue processing.\n\n    code: 400, title: Bad Request\n    \"\"\"\n    code = 400\n    title = 'Bad Request'\n    explanation = ('The server could not comply with the request since '\n                   'it is either malformed or otherwise incorrect.')\n\nclass HTTPUnauthorized(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request requires user authentication.\n\n    code: 401, title: Unauthorized\n    \"\"\"\n    code = 401\n    title = 'Unauthorized'\n    explanation = (\n        'This server could not verify that you are authorized to '\n        'access the document you requested.  Either you supplied the '\n        'wrong credentials (e.g., bad password), or your browser '\n        'does not understand how to supply the credentials required.')\n\nclass HTTPPaymentRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    code: 402, title: Payment Required\n    \"\"\"\n    code = 402\n    title = 'Payment Required'\n    explanation = ('Access was denied for financial reasons.')\n\nclass HTTPForbidden(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server understood the request, but is\n    refusing to fulfill it.\n\n    code: 403, title: Forbidden\n\n    Raise this exception within :term:`view` code to immediately return the\n    :term:`forbidden view` to the invoking user.  Usually this is a basic\n    ``403`` page, but the forbidden view can be customized as necessary.  See\n    :ref:`changing_the_forbidden_view`.  A ``Forbidden`` exception will be\n    the ``context`` of a :term:`Forbidden View`.\n\n    This exception's constructor treats two arguments specially.  The first\n    argument, ``detail``, should be a string.  The value of this string will\n    be used as the ``message`` attribute of the exception object.  The second\n    special keyword argument, ``result`` is usually an instance of\n    :class:`pyramid.security.Denied` or :class:`pyramid.security.ACLDenied`\n    each of which indicates a reason for the forbidden error.  However,\n    ``result`` is also permitted to be just a plain boolean ``False`` object\n    or ``None``.  The ``result`` value will be used as the ``result``\n    attribute of the exception object.  It defaults to ``None``.\n\n    The :term:`Forbidden View` can use the attributes of a Forbidden\n    exception as necessary to provide extended information in an error\n    report shown to a user.\n    \"\"\"\n    # differences from webob.exc.HTTPForbidden:\n    #\n    # - accepts a ``result`` keyword argument\n    #\n    # - overrides constructor to set ``self.result``\n    #\n    # differences from older ``pyramid.exceptions.Forbidden``:\n    #\n    # - ``result`` must be passed as a keyword argument.\n    #\n    code = 403\n    title = 'Forbidden'\n    explanation = ('Access was denied to this resource.')\n    def __init__(self, detail=None, headers=None, comment=None,\n                 body_template=None, result=None, **kw):\n        HTTPClientError.__init__(self, detail=detail, headers=headers,\n                                 comment=comment, body_template=body_template,\n                                 **kw)\n        self.result = result\n\nclass HTTPNotFound(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server did not find anything matching the\n    Request-URI.\n\n    code: 404, title: Not Found\n\n    Raise this exception within :term:`view` code to immediately\n    return the :term:`Not Found View` to the invoking user.  Usually\n    this is a basic ``404`` page, but the Not Found View can be\n    customized as necessary.  See :ref:`changing_the_notfound_view`.\n\n    This exception's constructor accepts a ``detail`` argument\n    (the first argument), which should be a string.  The value of this\n    string will be available as the ``message`` attribute of this exception,\n    for availability to the :term:`Not Found View`.\n    \"\"\"\n    code = 404\n    title = 'Not Found'\n    explanation = ('The resource could not be found.')\n\nclass HTTPMethodNotAllowed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method specified in the Request-Line is\n    not allowed for the resource identified by the Request-URI.\n\n    code: 405, title: Method Not Allowed\n    \"\"\"\n    # differences from webob.exc.HTTPMethodNotAllowed:\n    #\n    # - body_template_obj uses ${br} instead of <br />\n    code = 405\n    title = 'Method Not Allowed'\n    body_template_obj = Template('''\\\nThe method ${REQUEST_METHOD} is not allowed for this resource. ${br}${br}\n${detail}''')\n\nclass HTTPNotAcceptable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates the resource identified by the request is only\n    capable of generating response entities which have content\n    characteristics not acceptable according to the accept headers\n    sent in the request.\n\n    code: 406, title: Not Acceptable\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attribute left off (useless, bug in webob?)\n    code = 406\n    title = 'Not Acceptable'\n\nclass HTTPProxyAuthenticationRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This is similar to 401, but indicates that the client must first\n    authenticate itself with the proxy.\n\n    code: 407, title: Proxy Authentication Required\n    \"\"\"\n    code = 407\n    title = 'Proxy Authentication Required'\n    explanation = ('Authentication with a local proxy is needed.')\n\nclass HTTPRequestTimeout(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the client did not produce a request within\n    the time that the server was prepared to wait.\n\n    code: 408, title: Request Timeout\n    \"\"\"\n    code = 408\n    title = 'Request Timeout'\n    explanation = ('The server has waited too long for the request to '\n                   'be sent by the client.')\n\nclass HTTPConflict(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the request could not be completed due to a\n    conflict with the current state of the resource.\n\n    code: 409, title: Conflict\n    \"\"\"\n    code = 409\n    title = 'Conflict'\n    explanation = ('There was a conflict when trying to complete '\n                   'your request.')\n\nclass HTTPGone(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the requested resource is no longer available\n    at the server and no forwarding address is known.\n\n    code: 410, title: Gone\n    \"\"\"\n    code = 410\n    title = 'Gone'\n    explanation = ('This resource is no longer available.  No forwarding '\n                   'address is given.')\n\nclass HTTPLengthRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server refuses to accept the request\n    without a defined Content-Length.\n\n    code: 411, title: Length Required\n    \"\"\"\n    code = 411\n    title = 'Length Required'\n    explanation = ('Content-Length header required.')\n\nclass HTTPPreconditionFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the precondition given in one or more of the\n    request-header fields evaluated to false when it was tested on the\n    server.\n\n    code: 412, title: Precondition Failed\n    \"\"\"\n    code = 412\n    title = 'Precondition Failed'\n    explanation = ('Request precondition failed.')\n\nclass HTTPRequestEntityTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to process a request\n    because the request entity is larger than the server is willing or\n    able to process.\n\n    code: 413, title: Request Entity Too Large\n    \"\"\"\n    code = 413\n    title = 'Request Entity Too Large'\n    explanation = ('The body of your request was too large for this server.')\n\nclass HTTPRequestURITooLong(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the Request-URI is longer than the server is willing to\n    interpret.\n\n    code: 414, title: Request-URI Too Long\n    \"\"\"\n    code = 414\n    title = 'Request-URI Too Long'\n    explanation = ('The request URI was too long for this server.')\n\nclass HTTPUnsupportedMediaType(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is refusing to service the request\n    because the entity of the request is in a format not supported by\n    the requested resource for the requested method.\n\n    code: 415, title: Unsupported Media Type\n    \"\"\"\n    # differences from webob.exc.HTTPUnsupportedMediaType:\n    #\n    # - \"template_obj\" attribute left off (useless, bug in webob?)\n    code = 415\n    title = 'Unsupported Media Type'\n\nclass HTTPRequestRangeNotSatisfiable(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    The server SHOULD return a response with this status code if a\n    request included a Range request-header field, and none of the\n    range-specifier values in this field overlap the current extent\n    of the selected resource, and the request did not include an\n    If-Range request-header field.\n\n    code: 416, title: Request Range Not Satisfiable\n    \"\"\"\n    code = 416\n    title = 'Request Range Not Satisfiable'\n    explanation = ('The Range requested is not available.')\n\nclass HTTPExpectationFailed(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indidcates that the expectation given in an Expect\n    request-header field could not be met by this server.\n\n    code: 417, title: Expectation Failed\n    \"\"\"\n    code = 417\n    title = 'Expectation Failed'\n    explanation = ('Expectation failed.')\n\nclass HTTPUnprocessableEntity(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unable to process the contained\n    instructions.\n\n    May be used to notify the client that their JSON/XML is well formed, but\n    not correct for the current request.\n\n    See RFC4918 section 11 for more information.\n\n    code: 422, title: Unprocessable Entity\n    \"\"\"\n    ## Note: from WebDAV\n    code = 422\n    title = 'Unprocessable Entity'\n    explanation = 'Unable to process the contained instructions'\n\nclass HTTPLocked(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the resource is locked.\n\n    code: 423, title: Locked\n    \"\"\"\n    ## Note: from WebDAV\n    code = 423\n    title = 'Locked'\n    explanation = ('The resource is locked')\n\nclass HTTPFailedDependency(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the method could not be performed because the\n    requested action depended on another action and that action failed.\n\n    code: 424, title: Failed Dependency\n    \"\"\"\n    ## Note: from WebDAV\n    code = 424\n    title = 'Failed Dependency'\n    explanation = (\n        'The method could not be performed because the requested '\n        'action dependended on another action and that action failed')\n\nclass HTTPPreconditionRequired(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the origin server requires the\n    request to be conditional.\n\n    Its typical use is to avoid the \"lost update\" problem, where a client\n    GETs a resource's state, modifies it, and PUTs it back to the server,\n    when meanwhile a third party has modified the state on the server,\n    leading to a conflict.  By requiring requests to be conditional, the\n    server can assure that clients are working with the correct copies.\n\n    RFC 6585.3\n\n    code: 428, title: Precondition Required\n    \"\"\"\n    code = 428\n    title = 'Precondition Required'\n    explanation = (\n        'The origin server requires the request to be conditional.')\n\nclass HTTPTooManyRequests(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the user has sent too many\n    requests in a given amount of time (\"rate limiting\").\n\n    RFC 6585.4\n\n    code: 429, title: Too Many Requests\n    \"\"\"\n    code = 429\n    title = 'Too Many Requests'\n    explanation = (\n        'The action could not be performed because there were too '\n        'many requests by the client.')\n\nclass HTTPRequestHeaderFieldsTooLarge(HTTPClientError):\n    \"\"\"\n    subclass of :class:`~HTTPClientError`\n\n    This indicates that the server is unwilling to process\n    the request because its header fields are too large.  The request MAY\n    be resubmitted after reducing the size of the request header fields.\n\n    RFC 6585.5\n\n    code: 431, title: Request Header Fields Too Large\n    \"\"\"\n    code = 431\n    title = 'Request Header Fields Too Large'\n    explanation = (\n        'The requests header fields were too large.')\n\n############################################################\n## 5xx Server Error\n############################################################\n#  Response status codes beginning with the digit \"5\" indicate cases in\n#  which the server is aware that it has erred or is incapable of\n#  performing the request. Except when responding to a HEAD request, the\n#  server SHOULD include an entity containing an explanation of the error\n#  situation, and whether it is a temporary or permanent condition. User\n#  agents SHOULD display any included entity to the user. These response\n#  codes are applicable to any request method.\n\nclass HTTPServerError(HTTPError):\n    \"\"\"\n    base class for the 500s, where the server is in-error\n\n    This is an error condition in which the server is presumed to be\n    in-error.  Unless specialized, this is a '500 Internal Server Error'.\n    \"\"\"\n    pass\n\nclass HTTPInternalServerError(HTTPServerError):\n    code = 500\n    title = 'Internal Server Error'\n    explanation = (\n        'The server has either erred or is incapable of performing '\n        'the requested operation.')\n\nclass HTTPNotImplemented(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support the functionality\n    required to fulfill the request.\n\n    code: 501, title: Not Implemented\n    \"\"\"\n    # differences from webob.exc.HTTPNotAcceptable:\n    #\n    # - \"template\" attr left off (useless, bug in webob?)\n    code = 501\n    title = 'Not Implemented'\n\nclass HTTPBadGateway(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    received an invalid response from the upstream server it accessed\n    in attempting to fulfill the request.\n\n    code: 502, title: Bad Gateway\n    \"\"\"\n    code = 502\n    title = 'Bad Gateway'\n    explanation = ('Bad gateway.')\n\nclass HTTPServiceUnavailable(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server is currently unable to handle the\n    request due to a temporary overloading or maintenance of the server.\n\n    code: 503, title: Service Unavailable\n    \"\"\"\n    code = 503\n    title = 'Service Unavailable'\n    explanation = ('The server is currently unavailable. '\n                   'Please try again at a later time.')\n\nclass HTTPGatewayTimeout(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server, while acting as a gateway or proxy,\n    did not receive a timely response from the upstream server specified\n    by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server\n    (e.g. DNS) it needed to access in attempting to complete the request.\n\n    code: 504, title: Gateway Timeout\n    \"\"\"\n    code = 504\n    title = 'Gateway Timeout'\n    explanation = ('The gateway has timed out.')\n\nclass HTTPVersionNotSupported(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not support, or refuses to\n    support, the HTTP protocol version that was used in the request\n    message.\n\n    code: 505, title: HTTP Version Not Supported\n    \"\"\"\n    code = 505\n    title = 'HTTP Version Not Supported'\n    explanation = ('The HTTP version is not supported.')\n\nclass HTTPInsufficientStorage(HTTPServerError):\n    \"\"\"\n    subclass of :class:`~HTTPServerError`\n\n    This indicates that the server does not have enough space to save\n    the resource.\n\n    code: 507, title: Insufficient Storage\n    \"\"\"\n    code = 507\n    title = 'Insufficient Storage'\n    explanation = ('There was not enough space to save the resource')\n\ndef exception_response(status_code, **kw):\n    \"\"\"Creates an HTTP exception based on a status code. Example::\n\n        raise exception_response(404) # raises an HTTPNotFound exception.\n\n    The values passed as ``kw`` are provided to the exception's constructor.\n    \"\"\"\n    exc = status_map[status_code](**kw)\n    return exc\n\ndef default_exceptionresponse_view(context, request):\n    if not isinstance(context, Exception):\n        # backwards compat for an exception response view registered via\n        # config.set_notfound_view or config.set_forbidden_view\n        # instead of as a proper exception view\n        context = request.exception or context\n    return context # assumed to be an IResponse\n\nstatus_map = {}\ncode = None\nfor name, value in list(globals().items()):\n    if (\n            isinstance(value, class_types) and\n            issubclass(value, HTTPException) and\n            not name.startswith('_')\n    ):\n        code = getattr(value, 'code', None)\n        if code:\n            status_map[code] = value\ndel name, value, code\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:** HTTPException `__str__` Method Returns Non-String When `detail` Is Not a String

**Description:**
When an `HTTPException` is instantiated with a `detail` that is not a string (e.g., a dictionary), invoking `str()` on the exception returns the `detail` object directly instead of a string representation. This behavior can lead to unexpected issues in parts of the application that expect the exception's string representation to always be a string.

**Example Code:**
```python
from pyramid.httpexceptions import HTTPException

exc = HTTPException(detail={'error': 'This is a test'})
print(str(exc))  # Outputs: {'error': 'This is a test'}
```

**Expected Behavior:**
The `__str__` method of `HTTPException` should always return a string, regardless of the type of `detail`. Even if `detail` is a non-string object, its string representation should be returned.

**Actual Behavior:**
When `detail` is a non-string object, the `__str__` method returns the `detail` object directly, which may not be a string. This can cause issues in parts of the code that expect a string, leading to potential errors or unexpected behavior.

[/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/httpexceptions.py
"""
HTTP Exceptions
---------------

This module contains Pyramid HTTP exception classes.  Each class relates to a
single HTTP status code.  Each class is a subclass of the
:class:`~HTTPException`.  Each exception class is also a :term:`response`
object.

Each exception class has a status code according to :rfc:`2068`:
codes with 100-300 are not really errors; 400s are client errors,
and 500s are server errors.

Exception
  HTTPException
    HTTPSuccessful
      * 200 - HTTPOk
      * 201 - HTTPCreated
      * 202 - HTTPAccepted
      * 203 - HTTPNonAuthoritativeInformation
      * 204 - HTTPNoContent
      * 205 - HTTPResetContent
      * 206 - HTTPPartialContent
    HTTPRedirection
      * 300 - HTTPMultipleChoices
      * 301 - HTTPMovedPermanently
      * 302 - HTTPFound
      * 303 - HTTPSeeOther
      * 304 - HTTPNotModified
      * 305 - HTTPUseProxy
      * 307 - HTTPTemporaryRedirect
    HTTPError
      HTTPClientError
        * 400 - HTTPBadRequest
        * 401 - HTTPUnauthorized
        * 402 - HTTPPaymentRequired
        * 403 - HTTPForbidden
        * 404 - HTTPNotFound
        * 405 - HTTPMethodNotAllowed
        * 406 - HTTPNotAcceptable
        * 407 - HTTPProxyAuthenticationRequired
        * 408 - HTTPRequestTimeout
        * 409 - HTTPConflict
        * 410 - HTTPGone
        * 411 - HTTPLengthRequired
        * 412 - HTTPPreconditionFailed
        * 413 - HTTPRequestEntityTooLarge
        * 414 - HTTPRequestURITooLong
        * 415 - HTTPUnsupportedMediaType
        * 416 - HTTPRequestRangeNotSatisfiable
        * 417 - HTTPExpectationFailed
        * 422 - HTTPUnprocessableEntity
        * 423 - HTTPLocked
        * 424 - HTTPFailedDependency
        * 428 - HTTPPreconditionRequired
        * 429 - HTTPTooManyRequests
        * 431 - HTTPRequestHeaderFieldsTooLarge
      HTTPServerError
        * 500 - HTTPInternalServerError
        * 501 - HTTPNotImplemented
        * 502 - HTTPBadGateway
        * 503 - HTTPServiceUnavailable
        * 504 - HTTPGatewayTimeout
        * 505 - HTTPVersionNotSupported
        * 507 - HTTPInsufficientStorage

HTTP exceptions are also :term:`response` objects, thus they accept most of
the same parameters that can be passed to a regular
:class:`~pyramid.response.Response`. Each HTTP exception also has the
following attributes:

   ``code``
       the HTTP status code for the exception

   ``title``
       remainder of the status line (stuff after the code)

   ``explanation``
       a plain-text explanation of the error message that is
       not subject to environment or header substitutions;
       it is accessible in the template via ${explanation}

   ``detail``
       a plain-text message customization that is not subject
       to environment or header substitutions; accessible in
       the template via ${detail}

   ``body_template``
       a ``String.template``-format content fragment used for environment
       and header substitution; the default template includes both
       the explanation and further detail provided in the
       message.

Each HTTP exception accepts the following parameters, any others will
be forwarded to its :class:`~pyramid.response.Response` superclass:

   ``detail``
     a plain-text override of the default ``detail``

   ``headers``
     a list of (k,v) header pairs, or a dict, to be added to the
     response; use the content_type='application/json' kwarg and other
     similar kwargs to to change properties of the response supported by the
     :class:`pyramid.response.Response` superclass

   ``comment``
     a plain-text additional information which is
     usually stripped/hidden for end-users

   ``body_template``
     a ``string.Template`` object containing a content fragment in HTML
     that frames the explanation and further detail

   ``body``
     a string that will override the ``body_template`` and be used as the
     body of the response.

Substitution of response headers into template values is always performed.
Substitution of WSGI environment values is performed if a ``request`` is
passed to the exception's constructor.

The subclasses of :class:`~_HTTPMove`
(:class:`~HTTPMultipleChoices`, :class:`~HTTPMovedPermanently`,
:class:`~HTTPFound`, :class:`~HTTPSeeOther`, :class:`~HTTPUseProxy` and
:class:`~HTTPTemporaryRedirect`) are redirections that require a ``Location``
field. Reflecting this, these subclasses have one additional keyword argument:
``location``, which indicates the location to which to redirect.
"""
import json

from string import Template

from zope.interface import implementer

from webob import html_escape as _html_escape
from webob.acceptparse import MIMEAccept

from pyramid.compat import (
    class_types,
    text_type,
    binary_type,
    text_,
    )

from pyramid.interfaces import IExceptionResponse
from pyramid.response import Response

def _no_escape(value):
    if value is None:
        return ''
    if not isinstance(value, text_type):
        if hasattr(value, '__unicode__'):
            value = value.__unicode__()
        if isinstance(value, binary_type):
            value = text_(value, 'utf-8')
        else:
            value = text_type(value)
    return value

@implementer(IExceptionResponse)
class HTTPException(Response, Exception):

    ## You should set in subclasses:
    # code = 200
    # title = 'OK'
    # explanation = 'why this happens'
    # body_template_obj = Template('response template')
    #
    # This class itself uses the error code "520" with the error message/title
    # of "Unknown Error". This is not an RFC standard, however it is
    # implemented in practice. Sub-classes should be overriding the default
    # values and 520 should not be seen in the wild from Pyramid applications.
    # Due to changes in WebOb, a code of "None" is not valid, and WebOb due to
    # more strict error checking rejects it now.

    # differences from webob.exc.WSGIHTTPException:
    #
    # - doesn't use "strip_tags" (${br} placeholder for <br/>, no other html
    #   in default body template)
    #
    # - __call__ never generates a new Response, it always mutates self
    #
    # - explicitly sets self.message = detail to prevent whining by Python
    #   2.6.5+ access of Exception.message
    #
    # - its base class of HTTPException is no longer a Python 2.4 compatibility
    #   shim; it's purely a base class that inherits from Exception.  This
    #   implies that this class' ``exception`` property always returns
    #   ``self`` (it exists only for bw compat at this point).
    #
    # - documentation improvements (Pyramid-specific docstrings where necessary)
    #
    code = 520
    title = 'Unknown Error'
    explanation = ''
    body_template_obj = Template('''\
${explanation}${br}${br}
${detail}
${html_comment}
''')

    plain_template_obj = Template('''\
${status}

${body}''')

    html_template_obj = Template('''\
<html>
 <head>
  <title>${status}</title>
 </head>
 <body>
  <h1>${status}</h1>
  ${body}
 </body>
</html>''')

    ## Set this to True for responses that should have no request body
    empty_body = False

    def __init__(self, detail=None, headers=None, comment=None,
                 body_template=None, json_formatter=None, **kw):
        status = '%s %s' % (self.code, self.title)
        Response.__init__(self, status=status, **kw)
        Exception.__init__(self, detail)
        self.detail = self.message = detail
        if headers:
            self.headers.extend(headers)
        self.comment = comment
        if body_template is not None:
            self.body_template = body_template
            self.body_template_obj = Template(body_template)
        if json_formatter is not None:
            self._json_formatter = json_formatter

        if self.empty_body:
            del self.content_type
            del self.content_length

    def __str__(self):
        return self.detail or self.explanation

    def _json_formatter(self, status, body, title, environ):
        return {'message': body,
                'code': status,
                'title': self.title}

    def prepare(self, environ):
        if not self.has_body and not self.empty_body:
            html_comment = ''
            comment = self.comment or ''
            accept_value = environ.get('HTTP_ACCEPT', '')
            accept = MIMEAccept(accept_value)
            # Attempt to match text/html or application/json, if those don't
            # match, we will fall through to defaulting to text/plain
            match = accept.best_match(['text/html', 'application/json'])

            if match == 'text/html':
                self.content_type = 'text/html'
                escape = _html_escape
                page_template = self.html_template_obj
                br = '<br/>'
                if comment:
                    html_comment = '<!-- %s -->' % escape(comment)
            elif match == 'application/json':
                self.content_type = 'application/json'
                self.charset = None
                escape = _no_escape
                br = '\n'
                if comment:
                    html_comment = escape(comment)

                class JsonPageTemplate(object):
                    def __init__(self, excobj):
                        self.excobj = excobj

                    def substitute(self, status, body):
                        jsonbody = self.excobj._json_formatter(
                            status=status,
                            body=body, title=self.excobj.title,
                            environ=environ)
                        return json.dumps(jsonbody)

                page_template = JsonPageTemplate(self)
            else:
                self.content_type = 'text/plain'
                escape = _no_escape
                page_template = self.plain_template_obj
                br = '\n'
                if comment:
                    html_comment = escape(comment)
            args = {
                'br': br,
                'explanation': escape(self.explanation),
                'detail': escape(self.detail or ''),
                'comment': escape(comment),
                'html_comment': html_comment,
                }
            body_tmpl = self.body_template_obj
            if HTTPException.body_template_obj is not body_tmpl:
                # Custom template; add headers to args
                for k, v in environ.items():
                    if (not k.startswith('wsgi.')) and ('.' in k):
                        # omit custom environ variables, stringifying them may
                        # trigger code that should not be executed here; see
                        # https://github.com/Pylons/pyramid/issues/239
                        continue
                    args[k] = escape(v)
                for k, v in self.headers.items():
                    args[k.lower()] = escape(v)
            body = body_tmpl.substitute(args)
            page = page_template.substitute(status=self.status, body=body)
            if isinstance(page, text_type):
                page = page.encode(self.charset if self.charset else 'UTF-8')
            self.app_iter = [page]
            self.body = page

    @property
    def wsgi_response(self):
        # bw compat only
        return self

    exception = wsgi_response # bw compat only

    def __call__(self, environ, start_response):
        # differences from webob.exc.WSGIHTTPException
        #
        # - does not try to deal with HEAD requests
        #
        # - does not manufacture a new response object when generating
        #   the default response
        #
        self.prepare(environ)
        return Response.__call__(self, environ, start_response)

WSGIHTTPException = HTTPException # b/c post 1.5

class HTTPError(HTTPException):
    """
    base class for exceptions with status codes in the 400s and 500s

    This is an exception which indicates that an error has occurred,
    and that any work in progress should not be committed.
    """

class HTTPRedirection(HTTPException):
    """
    base class for exceptions with status codes in the 300s (redirections)

    This is an abstract base class for 3xx redirection.  It indicates
    that further action needs to be taken by the user agent in order
    to fulfill the request.  It does not necessarly signal an error
    condition.
    """

class HTTPSuccessful(HTTPException):
    """
    Base class for exceptions with status codes in the 200s (successful
    responses)
    """

############################################################
## 2xx success
############################################################

class HTTPOk(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    Indicates that the request has succeeded.

    code: 200, title: OK
    """
    code = 200
    title = 'OK'

class HTTPCreated(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that request has been fulfilled and resulted in a new
    resource being created.

    code: 201, title: Created
    """
    code = 201
    title = 'Created'

class HTTPAccepted(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the request has been accepted for processing, but the
    processing has not been completed.

    code: 202, title: Accepted
    """
    code = 202
    title = 'Accepted'
    explanation = 'The request is accepted for processing.'

class HTTPNonAuthoritativeInformation(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the returned metainformation in the entity-header is
    not the definitive set as available from the origin server, but is
    gathered from a local or a third-party copy.

    code: 203, title: Non-Authoritative Information
    """
    code = 203
    title = 'Non-Authoritative Information'

class HTTPNoContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the request but does
    not need to return an entity-body, and might want to return updated
    metainformation.

    code: 204, title: No Content
    """
    code = 204
    title = 'No Content'
    empty_body = True

class HTTPResetContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the request and
    the user agent SHOULD reset the document view which caused the
    request to be sent.

    code: 205, title: Reset Content
    """
    code = 205
    title = 'Reset Content'
    empty_body = True

class HTTPPartialContent(HTTPSuccessful):
    """
    subclass of :class:`~HTTPSuccessful`

    This indicates that the server has fulfilled the partial GET
    request for the resource.

    code: 206, title: Partial Content
    """
    code = 206
    title = 'Partial Content'

## FIXME: add 207 Multi-Status (but it's complicated)

############################################################
## 3xx redirection
############################################################

class _HTTPMove(HTTPRedirection):
    """
    redirections which require a Location field

    Since a 'Location' header is a required attribute of 301, 302, 303,
    305 and 307 (but not 304), this base class provides the mechanics to
    make this easy.

    You must provide a ``location`` keyword argument.
    """
    # differences from webob.exc._HTTPMove:
    #
    # - ${location} isn't wrapped in an <a> tag in body
    #
    # - location keyword arg defaults to ''
    #
    # - location isn't prepended with req.path_url when adding it as
    #   a header
    #
    # - ``location`` is first keyword (and positional) argument
    #
    # - ``add_slash`` argument is no longer accepted:  code that passes
    #   add_slash argument to the constructor will receive an exception.
    explanation = 'The resource has been moved to'
    body_template_obj = Template('''\
${explanation} ${location}; you should be redirected automatically.
${detail}
${html_comment}''')

    def __init__(self, location='', detail=None, headers=None, comment=None,
                 body_template=None, **kw):
        if location is None:
            raise ValueError("HTTP redirects need a location to redirect to.")
        super(_HTTPMove, self).__init__(
            detail=detail, headers=headers, comment=comment,
            body_template=body_template, location=location, **kw)

class HTTPMultipleChoices(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource corresponds to any one
    of a set of representations, each with its own specific location,
    and agent-driven negotiation information is being provided so that
    the user can select a preferred representation and redirect its
    request to that location.

    code: 300, title: Multiple Choices
    """
    code = 300
    title = 'Multiple Choices'

class HTTPMovedPermanently(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource has been assigned a new
    permanent URI and any future references to this resource SHOULD use
    one of the returned URIs.

    code: 301, title: Moved Permanently
    """
    code = 301
    title = 'Moved Permanently'

class HTTPFound(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource resides temporarily under
    a different URI.

    code: 302, title: Found
    """
    code = 302
    title = 'Found'
    explanation = 'The resource was found at'

# This one is safe after a POST (the redirected location will be
# retrieved with GET):
class HTTPSeeOther(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the response to the request can be found under
    a different URI and SHOULD be retrieved using a GET method on that
    resource.

    code: 303, title: See Other
    """
    code = 303
    title = 'See Other'

class HTTPNotModified(HTTPRedirection):
    """
    subclass of :class:`~HTTPRedirection`

    This indicates that if the client has performed a conditional GET
    request and access is allowed, but the document has not been
    modified, the server SHOULD respond with this status code.

    code: 304, title: Not Modified
    """
    # FIXME: this should include a date or etag header
    code = 304
    title = 'Not Modified'
    empty_body = True

class HTTPUseProxy(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource MUST be accessed through
    the proxy given by the Location field.

    code: 305, title: Use Proxy
    """
    # Not a move, but looks a little like one
    code = 305
    title = 'Use Proxy'
    explanation = (
        'The resource must be accessed through a proxy located at')

class HTTPTemporaryRedirect(_HTTPMove):
    """
    subclass of :class:`~_HTTPMove`

    This indicates that the requested resource resides temporarily
    under a different URI.

    code: 307, title: Temporary Redirect
    """
    code = 307
    title = 'Temporary Redirect'

############################################################
## 4xx client error
############################################################

class HTTPClientError(HTTPError):
    """
    base class for the 400s, where the client is in error

    This is an error condition in which the client is presumed to be
    in-error.  This is an expected problem, and thus is not considered
    a bug.  A server-side traceback is not warranted.  Unless specialized,
    this is a '400 Bad Request'
    """
    pass

class HTTPBadRequest(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the body or headers failed validity checks,
    preventing the server from being able to continue processing.

    code: 400, title: Bad Request
    """
    code = 400
    title = 'Bad Request'
    explanation = ('The server could not comply with the request since '
                   'it is either malformed or otherwise incorrect.')

class HTTPUnauthorized(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the request requires user authentication.

    code: 401, title: Unauthorized
    """
    code = 401
    title = 'Unauthorized'
    explanation = (
        'This server could not verify that you are authorized to '
        'access the document you requested.  Either you supplied the '
        'wrong credentials (e.g., bad password), or your browser '
        'does not understand how to supply the credentials required.')

class HTTPPaymentRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    code: 402, title: Payment Required
    """
    code = 402
    title = 'Payment Required'
    explanation = ('Access was denied for financial reasons.')

class HTTPForbidden(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server understood the request, but is
    refusing to fulfill it.

    code: 403, title: Forbidden

    Raise this exception within :term:`view` code to immediately return the
    :term:`forbidden view` to the invoking user.  Usually this is a basic
    ``403`` page, but the forbidden view can be customized as necessary.  See
    :ref:`changing_the_forbidden_view`.  A ``Forbidden`` exception will be
    the ``context`` of a :term:`Forbidden View`.

    This exception's constructor treats two arguments specially.  The first
    argument, ``detail``, should be a string.  The value of this string will
    be used as the ``message`` attribute of the exception object.  The second
    special keyword argument, ``result`` is usually an instance of
    :class:`pyramid.security.Denied` or :class:`pyramid.security.ACLDenied`
    each of which indicates a reason for the forbidden error.  However,
    ``result`` is also permitted to be just a plain boolean ``False`` object
    or ``None``.  The ``result`` value will be used as the ``result``
    attribute of the exception object.  It defaults to ``None``.

    The :term:`Forbidden View` can use the attributes of a Forbidden
    exception as necessary to provide extended information in an error
    report shown to a user.
    """
    # differences from webob.exc.HTTPForbidden:
    #
    # - accepts a ``result`` keyword argument
    #
    # - overrides constructor to set ``self.result``
    #
    # differences from older ``pyramid.exceptions.Forbidden``:
    #
    # - ``result`` must be passed as a keyword argument.
    #
    code = 403
    title = 'Forbidden'
    explanation = ('Access was denied to this resource.')
    def __init__(self, detail=None, headers=None, comment=None,
                 body_template=None, result=None, **kw):
        HTTPClientError.__init__(self, detail=detail, headers=headers,
                                 comment=comment, body_template=body_template,
                                 **kw)
        self.result = result

class HTTPNotFound(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server did not find anything matching the
    Request-URI.

    code: 404, title: Not Found

    Raise this exception within :term:`view` code to immediately
    return the :term:`Not Found View` to the invoking user.  Usually
    this is a basic ``404`` page, but the Not Found View can be
    customized as necessary.  See :ref:`changing_the_notfound_view`.

    This exception's constructor accepts a ``detail`` argument
    (the first argument), which should be a string.  The value of this
    string will be available as the ``message`` attribute of this exception,
    for availability to the :term:`Not Found View`.
    """
    code = 404
    title = 'Not Found'
    explanation = ('The resource could not be found.')

class HTTPMethodNotAllowed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the method specified in the Request-Line is
    not allowed for the resource identified by the Request-URI.

    code: 405, title: Method Not Allowed
    """
    # differences from webob.exc.HTTPMethodNotAllowed:
    #
    # - body_template_obj uses ${br} instead of <br />
    code = 405
    title = 'Method Not Allowed'
    body_template_obj = Template('''\
The method ${REQUEST_METHOD} is not allowed for this resource. ${br}${br}
${detail}''')

class HTTPNotAcceptable(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates the resource identified by the request is only
    capable of generating response entities which have content
    characteristics not acceptable according to the accept headers
    sent in the request.

    code: 406, title: Not Acceptable
    """
    # differences from webob.exc.HTTPNotAcceptable:
    #
    # - "template" attribute left off (useless, bug in webob?)
    code = 406
    title = 'Not Acceptable'

class HTTPProxyAuthenticationRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This is similar to 401, but indicates that the client must first
    authenticate itself with the proxy.

    code: 407, title: Proxy Authentication Required
    """
    code = 407
    title = 'Proxy Authentication Required'
    explanation = ('Authentication with a local proxy is needed.')

class HTTPRequestTimeout(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the client did not produce a request within
    the time that the server was prepared to wait.

    code: 408, title: Request Timeout
    """
    code = 408
    title = 'Request Timeout'
    explanation = ('The server has waited too long for the request to '
                   'be sent by the client.')

class HTTPConflict(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the request could not be completed due to a
    conflict with the current state of the resource.

    code: 409, title: Conflict
    """
    code = 409
    title = 'Conflict'
    explanation = ('There was a conflict when trying to complete '
                   'your request.')

class HTTPGone(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the requested resource is no longer available
    at the server and no forwarding address is known.

    code: 410, title: Gone
    """
    code = 410
    title = 'Gone'
    explanation = ('This resource is no longer available.  No forwarding '
                   'address is given.')

class HTTPLengthRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server refuses to accept the request
    without a defined Content-Length.

    code: 411, title: Length Required
    """
    code = 411
    title = 'Length Required'
    explanation = ('Content-Length header required.')

class HTTPPreconditionFailed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the precondition given in one or more of the
    request-header fields evaluated to false when it was tested on the
    server.

    code: 412, title: Precondition Failed
    """
    code = 412
    title = 'Precondition Failed'
    explanation = ('Request precondition failed.')

class HTTPRequestEntityTooLarge(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to process a request
    because the request entity is larger than the server is willing or
    able to process.

    code: 413, title: Request Entity Too Large
    """
    code = 413
    title = 'Request Entity Too Large'
    explanation = ('The body of your request was too large for this server.')

class HTTPRequestURITooLong(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to service the request
    because the Request-URI is longer than the server is willing to
    interpret.

    code: 414, title: Request-URI Too Long
    """
    code = 414
    title = 'Request-URI Too Long'
    explanation = ('The request URI was too long for this server.')

class HTTPUnsupportedMediaType(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is refusing to service the request
    because the entity of the request is in a format not supported by
    the requested resource for the requested method.

    code: 415, title: Unsupported Media Type
    """
    # differences from webob.exc.HTTPUnsupportedMediaType:
    #
    # - "template_obj" attribute left off (useless, bug in webob?)
    code = 415
    title = 'Unsupported Media Type'

class HTTPRequestRangeNotSatisfiable(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    The server SHOULD return a response with this status code if a
    request included a Range request-header field, and none of the
    range-specifier values in this field overlap the current extent
    of the selected resource, and the request did not include an
    If-Range request-header field.

    code: 416, title: Request Range Not Satisfiable
    """
    code = 416
    title = 'Request Range Not Satisfiable'
    explanation = ('The Range requested is not available.')

class HTTPExpectationFailed(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indidcates that the expectation given in an Expect
    request-header field could not be met by this server.

    code: 417, title: Expectation Failed
    """
    code = 417
    title = 'Expectation Failed'
    explanation = ('Expectation failed.')

class HTTPUnprocessableEntity(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is unable to process the contained
    instructions.

    May be used to notify the client that their JSON/XML is well formed, but
    not correct for the current request.

    See RFC4918 section 11 for more information.

    code: 422, title: Unprocessable Entity
    """
    ## Note: from WebDAV
    code = 422
    title = 'Unprocessable Entity'
    explanation = 'Unable to process the contained instructions'

class HTTPLocked(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the resource is locked.

    code: 423, title: Locked
    """
    ## Note: from WebDAV
    code = 423
    title = 'Locked'
    explanation = ('The resource is locked')

class HTTPFailedDependency(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the method could not be performed because the
    requested action depended on another action and that action failed.

    code: 424, title: Failed Dependency
    """
    ## Note: from WebDAV
    code = 424
    title = 'Failed Dependency'
    explanation = (
        'The method could not be performed because the requested '
        'action dependended on another action and that action failed')

class HTTPPreconditionRequired(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the origin server requires the
    request to be conditional.

    Its typical use is to avoid the "lost update" problem, where a client
    GETs a resource's state, modifies it, and PUTs it back to the server,
    when meanwhile a third party has modified the state on the server,
    leading to a conflict.  By requiring requests to be conditional, the
    server can assure that clients are working with the correct copies.

    RFC 6585.3

    code: 428, title: Precondition Required
    """
    code = 428
    title = 'Precondition Required'
    explanation = (
        'The origin server requires the request to be conditional.')

class HTTPTooManyRequests(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the user has sent too many
    requests in a given amount of time ("rate limiting").

    RFC 6585.4

    code: 429, title: Too Many Requests
    """
    code = 429
    title = 'Too Many Requests'
    explanation = (
        'The action could not be performed because there were too '
        'many requests by the client.')

class HTTPRequestHeaderFieldsTooLarge(HTTPClientError):
    """
    subclass of :class:`~HTTPClientError`

    This indicates that the server is unwilling to process
    the request because its header fields are too large.  The request MAY
    be resubmitted after reducing the size of the request header fields.

    RFC 6585.5

    code: 431, title: Request Header Fields Too Large
    """
    code = 431
    title = 'Request Header Fields Too Large'
    explanation = (
        'The requests header fields were too large.')

############################################################
## 5xx Server Error
############################################################
#  Response status codes beginning with the digit "5" indicate cases in
#  which the server is aware that it has erred or is incapable of
#  performing the request. Except when responding to a HEAD request, the
#  server SHOULD include an entity containing an explanation of the error
#  situation, and whether it is a temporary or permanent condition. User
#  agents SHOULD display any included entity to the user. These response
#  codes are applicable to any request method.

class HTTPServerError(HTTPError):
    """
    base class for the 500s, where the server is in-error

    This is an error condition in which the server is presumed to be
    in-error.  Unless specialized, this is a '500 Internal Server Error'.
    """
    pass

class HTTPInternalServerError(HTTPServerError):
    code = 500
    title = 'Internal Server Error'
    explanation = (
        'The server has either erred or is incapable of performing '
        'the requested operation.')

class HTTPNotImplemented(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not support the functionality
    required to fulfill the request.

    code: 501, title: Not Implemented
    """
    # differences from webob.exc.HTTPNotAcceptable:
    #
    # - "template" attr left off (useless, bug in webob?)
    code = 501
    title = 'Not Implemented'

class HTTPBadGateway(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server, while acting as a gateway or proxy,
    received an invalid response from the upstream server it accessed
    in attempting to fulfill the request.

    code: 502, title: Bad Gateway
    """
    code = 502
    title = 'Bad Gateway'
    explanation = ('Bad gateway.')

class HTTPServiceUnavailable(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server is currently unable to handle the
    request due to a temporary overloading or maintenance of the server.

    code: 503, title: Service Unavailable
    """
    code = 503
    title = 'Service Unavailable'
    explanation = ('The server is currently unavailable. '
                   'Please try again at a later time.')

class HTTPGatewayTimeout(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server, while acting as a gateway or proxy,
    did not receive a timely response from the upstream server specified
    by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server
    (e.g. DNS) it needed to access in attempting to complete the request.

    code: 504, title: Gateway Timeout
    """
    code = 504
    title = 'Gateway Timeout'
    explanation = ('The gateway has timed out.')

class HTTPVersionNotSupported(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not support, or refuses to
    support, the HTTP protocol version that was used in the request
    message.

    code: 505, title: HTTP Version Not Supported
    """
    code = 505
    title = 'HTTP Version Not Supported'
    explanation = ('The HTTP version is not supported.')

class HTTPInsufficientStorage(HTTPServerError):
    """
    subclass of :class:`~HTTPServerError`

    This indicates that the server does not have enough space to save
    the resource.

    code: 507, title: Insufficient Storage
    """
    code = 507
    title = 'Insufficient Storage'
    explanation = ('There was not enough space to save the resource')

def exception_response(status_code, **kw):
    """Creates an HTTP exception based on a status code. Example::

        raise exception_response(404) # raises an HTTPNotFound exception.

    The values passed as ``kw`` are provided to the exception's constructor.
    """
    exc = status_map[status_code](**kw)
    return exc

def default_exceptionresponse_view(context, request):
    if not isinstance(context, Exception):
        # backwards compat for an exception response view registered via
        # config.set_notfound_view or config.set_forbidden_view
        # instead of as a proper exception view
        context = request.exception or context
    return context # assumed to be an IResponse

status_map = {}
code = None
for name, value in list(globals().items()):
    if (
            isinstance(value, class_types) and
            issubclass(value, HTTPException) and
            not name.startswith('_')
    ):
        code = getattr(value, 'code', None)
        if code:
            status_map[code] = value
del name, value, code

```
--- 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