{
    "file_diffs": [
        {
            "old_file_content": "from codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nimport re\n\nfrom webob.cookies import CookieProfile\n\nfrom zope.interface import implementer, providedBy\n\nfrom pyramid.interfaces import (\n    ISecurityPolicy,\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    ISecuredView,\n    IView,\n    IViewClassifier,\n)\n\nfrom pyramid.location import lineage\n\nfrom pyramid.util import is_nonstr_iter, strings_differ, bytes_, ascii_, text_\n\nfrom pyramid.util import SimpleSerializer\n\nfrom pyramid.threadlocal import get_current_registry\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nEveryone = 'system.Everyone'\nAuthenticated = 'system.Authenticated'\nAllow = 'Allow'\nDeny = 'Deny'\n\n\nclass AllPermissionsList(object):\n    \"\"\" Stand in 'permission list' to represent all permissions \"\"\"\n\n    def __iter__(self):\n        return iter(())\n\n    def __contains__(self, other):\n        return True\n\n    def __eq__(self, other):\n        return isinstance(other, self.__class__)\n\n\nALL_PERMISSIONS = AllPermissionsList()\nDENY_ALL = (Deny, Everyone, ALL_PERMISSIONS)\n\nNO_PERMISSION_REQUIRED = '__no_permission_required__'\n\n\ndef _get_security_policy(request):\n    return request.registry.queryUtility(ISecurityPolicy)\n\n\ndef _get_authentication_policy(request):\n    return request.registry.queryUtility(IAuthenticationPolicy)\n\n\ndef remember(request, userid, **kw):\n    \"\"\"\n    Returns a sequence of header tuples (e.g. ``[('Set-Cookie', 'foo=abc')]``)\n    on this request's response.\n    These headers are suitable for 'remembering' a set of credentials\n    implied by the data passed as ``userid`` and ``*kw`` using the\n    current :term:`security policy`.  Common usage might look\n    like so within the body of a view function (``response`` is\n    assumed to be a :term:`WebOb` -style :term:`response` object\n    computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import remember\n       headers = remember(request, 'chrism', password='123', max_age='86400')\n       response = request.response\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence. If used, the composition and\n    meaning of ``**kw`` must be agreed upon by the calling code and\n    the effective security policy.\n\n    .. versionchanged:: 1.6\n        Deprecated the ``principal`` argument in favor of ``userid`` to clarify\n        its relationship to the authentication policy.\n\n    .. versionchanged:: 1.10\n        Removed the deprecated ``principal`` argument.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.remember(request, userid, **kw)\n\n\ndef forget(request):\n    \"\"\"\n    Return a sequence of header tuples (e.g. ``[('Set-Cookie',\n    'foo=abc')]``) suitable for 'forgetting' the set of credentials\n    possessed by the currently authenticated user.  A common usage\n    might look like so within the body of a view function\n    (``response`` is assumed to be an :term:`WebOb` -style\n    :term:`response` object computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import forget\n       headers = forget(request)\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.forget(request)\n\n\ndef principals_allowed_by_permission(context, permission):\n    \"\"\" Provided a ``context`` (a resource object), and a ``permission``\n    string, if an :term:`authorization policy` is\n    in effect, return a sequence of :term:`principal` ids that possess\n    the permission in the ``context``.  If no authorization policy is\n    in effect, this will return a sequence with the single value\n    :mod:`pyramid.security.Everyone` (the special principal\n    identifier representing all principals).\n\n    .. note::\n\n       Even if an :term:`authorization policy` is in effect,\n       some (exotic) authorization policies may not implement the\n       required machinery for this function; those will cause a\n       :exc:`NotImplementedError` exception to be raised when this\n       function is invoked.\n\n    \"\"\"\n    reg = get_current_registry()\n    policy = reg.queryUtility(IAuthorizationPolicy)\n    if policy is None:\n        return [Everyone]\n    return policy.principals_allowed_by_permission(context, permission)\n\n\ndef view_execution_permitted(context, request, name=''):\n    \"\"\" If the view specified by ``context`` and ``name`` is protected\n    by a :term:`permission`, check the permission associated with the\n    view using the effective authentication/authorization policies and\n    the ``request``.  Return a boolean result.  If no\n    :term:`authorization policy` is in effect, or if the view is not\n    protected by a permission, return ``True``. If no view can view found,\n    an exception will be raised.\n\n    .. versionchanged:: 1.4a4\n       An exception is raised if no view is found.\n\n    \"\"\"\n    reg = request.registry\n    provides = [IViewClassifier] + [providedBy(x) for x in (request, context)]\n    # XXX not sure what to do here about using _find_views or analogue;\n    # for now let's just keep it as-is\n    view = reg.adapters.lookup(provides, ISecuredView, name=name)\n    if view is None:\n        view = reg.adapters.lookup(provides, IView, name=name)\n        if view is None:\n            raise TypeError(\n                'No registered view satisfies the constraints. '\n                'It would not make sense to claim that this view '\n                '\"is\" or \"is not\" permitted.'\n            )\n        return Allowed(\n            'Allowed: view name %r in context %r (no permission defined)'\n            % (name, context)\n        )\n    return view.__permitted__(context, request)\n\n\nclass PermitsResult(int):\n    def __new__(cls, s, *args):\n        \"\"\"\n        Create a new instance.\n\n        :param fmt: A format string explaining the reason for denial.\n        :param args: Arguments are stored and used with the format string\n                      to generate the ``msg``.\n\n        \"\"\"\n        inst = int.__new__(cls, cls.boolval)\n        inst.s = s\n        inst.args = args\n        return inst\n\n    @property\n    def msg(self):\n        \"\"\" A string indicating why the result was generated.\"\"\"\n        return self.s % self.args\n\n    def __str__(self):\n        return self.msg\n\n    def __repr__(self):\n        return '<%s instance at %s with msg %r>' % (\n            self.__class__.__name__,\n            id(self),\n            self.msg,\n        )\n\n\nclass Denied(PermitsResult):\n    \"\"\"\n    An instance of ``Denied`` is returned when a security-related\n    API or other :app:`Pyramid` code denies an action unrelated to\n    an ACL check.  It evaluates equal to all boolean false types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the deny.\n\n    \"\"\"\n\n    boolval = 0\n\n\nclass Allowed(PermitsResult):\n    \"\"\"\n    An instance of ``Allowed`` is returned when a security-related\n    API or other :app:`Pyramid` code allows an action unrelated to\n    an ACL check.  It evaluates equal to all boolean true types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the allow.\n\n    \"\"\"\n\n    boolval = 1\n\n\nclass ACLPermitsResult(PermitsResult):\n    def __new__(cls, ace, acl, permission, principals, context):\n        \"\"\"\n        Create a new instance.\n\n        :param ace: The :term:`ACE` that matched, triggering the result.\n        :param acl: The :term:`ACL` containing ``ace``.\n        :param permission: The required :term:`permission`.\n        :param principals: The list of :term:`principals <principal>` provided.\n        :param context: The :term:`context` providing the :term:`lineage`\n                        searched.\n\n        \"\"\"\n        fmt = (\n            '%s permission %r via ACE %r in ACL %r on context %r for '\n            'principals %r'\n        )\n        inst = PermitsResult.__new__(\n            cls, fmt, cls.__name__, permission, ace, acl, context, principals\n        )\n        inst.permission = permission\n        inst.ace = ace\n        inst.acl = acl\n        inst.principals = principals\n        inst.context = context\n        return inst\n\n\nclass ACLDenied(ACLPermitsResult, Denied):\n    \"\"\"\n    An instance of ``ACLDenied`` is a specialization of\n    :class:`pyramid.security.Denied` that represents that a security check\n    made explicitly against ACL was denied.  It evaluates equal to all\n    boolean false types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass ACLAllowed(ACLPermitsResult, Allowed):\n    \"\"\"\n    An instance of ``ACLAllowed`` is a specialization of\n    :class:`pyramid.security.Allowed` that represents that a security check\n    made explicitly against ACL was allowed.  It evaluates equal to all\n    boolean true types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass SecurityAPIMixin(object):\n    @property\n    def identity(self):\n        \"\"\"\n        Return an opaque object identifying the current user or ``None`` if no\n        user is authenticated or there is no :term:`security policy` in effect.\n\n        \"\"\"\n        policy = _get_security_policy(self)\n        if policy is None:\n            return None\n        return policy.identify(self)\n\n    def has_permission(self, permission, context=None):\n        \"\"\" Given a permission and an optional context, returns an instance of\n        :data:`pyramid.security.Allowed` if the permission is granted to this\n        request with the provided context, or the context already associated\n        with the request.  Otherwise, returns an instance of\n        :data:`pyramid.security.Denied`.  This method delegates to the current\n        security policy.  Returns\n        :data:`pyramid.security.Allowed` unconditionally if no security\n        policy has been registered for this request.  If ``context`` is not\n        supplied or is supplied as ``None``, the context used is the\n        ``request.context`` attribute.\n\n        :param permission: Does this request have the given permission?\n        :type permission: str\n        :param context: A resource object or ``None``\n        :type context: object\n        :returns: Either :class:`pyramid.security.Allowed` or\n                  :class:`pyramid.security.Denied`.\n\n        \"\"\"\n        if context is None:\n            context = self.context\n        policy = _get_security_policy(self)\n        if policy is None:\n            return Allowed('No security policy in use.')\n        identity = policy.identify(self)\n        return policy.permits(self, context, identity, permission)\n\n\nclass AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)\n\n\n@implementer(ISecurityPolicy)\nclass LegacySecurityPolicy:\n    \"\"\"\n    A :term:`security policy` which provides a backwards compatibility shim for\n    the :term:`authentication policy` and the :term:`authorization policy`.\n\n    \"\"\"\n\n    def _get_authn_policy(self, request):\n        return request.registry.getUtility(IAuthenticationPolicy)\n\n    def _get_authz_policy(self, request):\n        return request.registry.getUtility(IAuthorizationPolicy)\n\n    def identify(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.authenticated_userid(request)\n\n    def remember(self, request, userid, **kw):\n        authn = self._get_authn_policy(request)\n        return authn.remember(request, userid, **kw)\n\n    def forget(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.forget(request)\n\n    def permits(self, request, context, identity, permission):\n        authn = self._get_authn_policy(request)\n        authz = self._get_authz_policy(request)\n        principals = authn.effective_principals(request)\n        return authz.permits(context, principals, permission)\n\n\nclass ACLHelper:\n    \"\"\" A helper for use with constructing a :term:`security policy` which\n    consults an :term:`ACL` object attached to a :term:`context` to determine\n    authorization information about a :term:`principal` or multiple principals.\n    If the context is part of a :term:`lineage`, the context's parents are\n    consulted for ACL information too.\n\n    \"\"\"\n\n    def permits(self, context, principals, permission):\n        \"\"\" Return an instance of :class:`pyramid.security.ACLAllowed` if the\n        ACL allows access a user with the given principals, return an instance\n        of :class:`pyramid.security.ACLDenied` if not.\n\n        When checking if principals are allowed, the security policy consults\n        the ``context`` for an ACL first.  If no ACL exists on the context, or\n        one does exist but the ACL does not explicitly allow or deny access for\n        any of the effective principals, consult the context's parent ACL, and\n        so on, until the lineage is exhausted or we determine that the policy\n        permits or denies.\n\n        During this processing, if any :data:`pyramid.security.Deny`\n        ACE is found matching any principal in ``principals``, stop\n        processing by returning an\n        :class:`pyramid.security.ACLDenied` instance (equals\n        ``False``) immediately.  If any\n        :data:`pyramid.security.Allow` ACE is found matching any\n        principal, stop processing by returning an\n        :class:`pyramid.security.ACLAllowed` instance (equals\n        ``True``) immediately.  If we exhaust the context's\n        :term:`lineage`, and no ACE has explicitly permitted or denied\n        access, return an instance of\n        :class:`pyramid.security.ACLDenied` (equals ``False``).\n\n        \"\"\"\n        acl = '<No ACL found on any object in resource lineage>'\n\n        for location in lineage(context):\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace in acl:\n                ace_action, ace_principal, ace_permissions = ace\n                if ace_principal in principals:\n                    if not is_nonstr_iter(ace_permissions):\n                        ace_permissions = [ace_permissions]\n                    if permission in ace_permissions:\n                        if ace_action == Allow:\n                            return ACLAllowed(\n                                ace, acl, permission, principals, location\n                            )\n                        else:\n                            return ACLDenied(\n                                ace, acl, permission, principals, location\n                            )\n\n        # default deny (if no ACL in lineage at all, or if none of the\n        # principals were mentioned in any ACE we found)\n        return ACLDenied(\n            '<default deny>', acl, permission, principals, context\n        )\n\n    def principals_allowed_by_permission(self, context, permission):\n        \"\"\" Return the set of principals explicitly granted the permission\n        named ``permission`` according to the ACL directly attached to the\n        ``context`` as well as inherited ACLs based on the :term:`lineage`.\n\n        When computing principals allowed by a permission, we compute the set\n        of principals that are explicitly granted the ``permission`` in the\n        provided ``context``.  We do this by walking 'up' the object graph\n        *from the root* to the context.  During this walking process, if we\n        find an explicit :data:`pyramid.security.Allow` ACE for a principal\n        that matches the ``permission``, the principal is included in the allow\n        list.  However, if later in the walking process that principal is\n        mentioned in any :data:`pyramid.security.Deny` ACE for the permission,\n        the principal is removed from the allow list.  If a\n        :data:`pyramid.security.Deny` to the principal\n        :data:`pyramid.security.Everyone` is encountered during the walking\n        process that matches the ``permission``, the allow list is cleared for\n        all principals encountered in previous ACLs.  The walking process ends\n        after we've processed the any ACL directly attached to ``context``; a\n        set of principals is returned.\n\n        \"\"\"\n        allowed = set()\n\n        for location in reversed(list(lineage(context))):\n            # NB: we're walking *up* the object graph from the root\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            allowed_here = set()\n            denied_here = set()\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace_action, ace_principal, ace_permissions in acl:\n                if not is_nonstr_iter(ace_permissions):\n                    ace_permissions = [ace_permissions]\n                if (ace_action == Allow) and (permission in ace_permissions):\n                    if ace_principal not in denied_here:\n                        allowed_here.add(ace_principal)\n                if (ace_action == Deny) and (permission in ace_permissions):\n                    denied_here.add(ace_principal)\n                    if ace_principal == Everyone:\n                        # clear the entire allowed set, as we've hit a\n                        # deny of Everyone ala (Deny, Everyone, ALL)\n                        allowed = set()\n                        break\n                    elif ace_principal in allowed:\n                        allowed.remove(ace_principal)\n\n            allowed.update(allowed_here)\n\n        return allowed\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def identify(self, request):\n        return request.session.get(self.userid_key)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class used for constructing a :term:`security policy` with stores\n    the user identity in a signed cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n        This option is available as of :app:`Pyramid` 1.10.\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='md5',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n",
            "new_file_content": "from codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nimport re\n\nfrom webob.cookies import CookieProfile\n\nfrom zope.interface import implementer, providedBy\n\nfrom pyramid.interfaces import (\n    ISecurityPolicy,\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    ISecuredView,\n    IView,\n    IViewClassifier,\n)\n\nfrom pyramid.location import lineage\n\nfrom pyramid.util import is_nonstr_iter, strings_differ, bytes_, ascii_, text_\n\nfrom pyramid.util import SimpleSerializer\n\nfrom pyramid.threadlocal import get_current_registry\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nEveryone = 'system.Everyone'\nAuthenticated = 'system.Authenticated'\nAllow = 'Allow'\nDeny = 'Deny'\n\n\nclass AllPermissionsList(object):\n    \"\"\" Stand in 'permission list' to represent all permissions \"\"\"\n\n    def __iter__(self):\n        return iter(())\n\n    def __contains__(self, other):\n        return True\n\n    def __eq__(self, other):\n        return isinstance(other, self.__class__)\n\n\nALL_PERMISSIONS = AllPermissionsList()\nDENY_ALL = (Deny, Everyone, ALL_PERMISSIONS)\n\nNO_PERMISSION_REQUIRED = '__no_permission_required__'\n\n\ndef _get_security_policy(request):\n    return request.registry.queryUtility(ISecurityPolicy)\n\n\ndef _get_authentication_policy(request):\n    return request.registry.queryUtility(IAuthenticationPolicy)\n\n\ndef remember(request, userid, **kw):\n    \"\"\"\n    Returns a sequence of header tuples (e.g. ``[('Set-Cookie', 'foo=abc')]``)\n    on this request's response.\n    These headers are suitable for 'remembering' a set of credentials\n    implied by the data passed as ``userid`` and ``*kw`` using the\n    current :term:`security policy`.  Common usage might look\n    like so within the body of a view function (``response`` is\n    assumed to be a :term:`WebOb` -style :term:`response` object\n    computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import remember\n       headers = remember(request, 'chrism', password='123', max_age='86400')\n       response = request.response\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence. If used, the composition and\n    meaning of ``**kw`` must be agreed upon by the calling code and\n    the effective security policy.\n\n    .. versionchanged:: 1.6\n        Deprecated the ``principal`` argument in favor of ``userid`` to clarify\n        its relationship to the authentication policy.\n\n    .. versionchanged:: 1.10\n        Removed the deprecated ``principal`` argument.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.remember(request, userid, **kw)\n\n\ndef forget(request):\n    \"\"\"\n    Return a sequence of header tuples (e.g. ``[('Set-Cookie',\n    'foo=abc')]``) suitable for 'forgetting' the set of credentials\n    possessed by the currently authenticated user.  A common usage\n    might look like so within the body of a view function\n    (``response`` is assumed to be an :term:`WebOb` -style\n    :term:`response` object computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import forget\n       headers = forget(request)\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.forget(request)\n\n\ndef principals_allowed_by_permission(context, permission):\n    \"\"\" Provided a ``context`` (a resource object), and a ``permission``\n    string, if an :term:`authorization policy` is\n    in effect, return a sequence of :term:`principal` ids that possess\n    the permission in the ``context``.  If no authorization policy is\n    in effect, this will return a sequence with the single value\n    :mod:`pyramid.security.Everyone` (the special principal\n    identifier representing all principals).\n\n    .. note::\n\n       Even if an :term:`authorization policy` is in effect,\n       some (exotic) authorization policies may not implement the\n       required machinery for this function; those will cause a\n       :exc:`NotImplementedError` exception to be raised when this\n       function is invoked.\n\n    \"\"\"\n    reg = get_current_registry()\n    policy = reg.queryUtility(IAuthorizationPolicy)\n    if policy is None:\n        return [Everyone]\n    return policy.principals_allowed_by_permission(context, permission)\n\n\ndef view_execution_permitted(context, request, name=''):\n    \"\"\" If the view specified by ``context`` and ``name`` is protected\n    by a :term:`permission`, check the permission associated with the\n    view using the effective authentication/authorization policies and\n    the ``request``.  Return a boolean result.  If no\n    :term:`authorization policy` is in effect, or if the view is not\n    protected by a permission, return ``True``. If no view can view found,\n    an exception will be raised.\n\n    .. versionchanged:: 1.4a4\n       An exception is raised if no view is found.\n\n    \"\"\"\n    reg = request.registry\n    provides = [IViewClassifier] + [providedBy(x) for x in (request, context)]\n    # XXX not sure what to do here about using _find_views or analogue;\n    # for now let's just keep it as-is\n    view = reg.adapters.lookup(provides, ISecuredView, name=name)\n    if view is None:\n        view = reg.adapters.lookup(provides, IView, name=name)\n        if view is None:\n            raise TypeError(\n                'No registered view satisfies the constraints. '\n                'It would not make sense to claim that this view '\n                '\"is\" or \"is not\" permitted.'\n            )\n        return Allowed(\n            'Allowed: view name %r in context %r (no permission defined)'\n            % (name, context)\n        )\n    return view.__permitted__(context, request)\n\n\nclass PermitsResult(int):\n    def __new__(cls, s, *args):\n        \"\"\"\n        Create a new instance.\n\n        :param fmt: A format string explaining the reason for denial.\n        :param args: Arguments are stored and used with the format string\n                      to generate the ``msg``.\n\n        \"\"\"\n        inst = int.__new__(cls, cls.boolval)\n        inst.s = s\n        inst.args = args\n        return inst\n\n    @property\n    def msg(self):\n        \"\"\" A string indicating why the result was generated.\"\"\"\n        return self.s % self.args\n\n    def __str__(self):\n        return self.msg\n\n    def __repr__(self):\n        return '<%s instance at %s with msg %r>' % (\n            self.__class__.__name__,\n            id(self),\n            self.msg,\n        )\n\n\nclass Denied(PermitsResult):\n    \"\"\"\n    An instance of ``Denied`` is returned when a security-related\n    API or other :app:`Pyramid` code denies an action unrelated to\n    an ACL check.  It evaluates equal to all boolean false types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the deny.\n\n    \"\"\"\n\n    boolval = 0\n\n\nclass Allowed(PermitsResult):\n    \"\"\"\n    An instance of ``Allowed`` is returned when a security-related\n    API or other :app:`Pyramid` code allows an action unrelated to\n    an ACL check.  It evaluates equal to all boolean true types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the allow.\n\n    \"\"\"\n\n    boolval = 1\n\n\nclass ACLPermitsResult(PermitsResult):\n    def __new__(cls, ace, acl, permission, principals, context):\n        \"\"\"\n        Create a new instance.\n\n        :param ace: The :term:`ACE` that matched, triggering the result.\n        :param acl: The :term:`ACL` containing ``ace``.\n        :param permission: The required :term:`permission`.\n        :param principals: The list of :term:`principals <principal>` provided.\n        :param context: The :term:`context` providing the :term:`lineage`\n                        searched.\n\n        \"\"\"\n        fmt = (\n            '%s permission %r via ACE %r in ACL %r on context %r for '\n            'principals %r'\n        )\n        inst = PermitsResult.__new__(\n            cls, fmt, cls.__name__, permission, ace, acl, context, principals\n        )\n        inst.permission = permission\n        inst.ace = ace\n        inst.acl = acl\n        inst.principals = principals\n        inst.context = context\n        return inst\n\n\nclass ACLDenied(ACLPermitsResult, Denied):\n    \"\"\"\n    An instance of ``ACLDenied`` is a specialization of\n    :class:`pyramid.security.Denied` that represents that a security check\n    made explicitly against ACL was denied.  It evaluates equal to all\n    boolean false types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass ACLAllowed(ACLPermitsResult, Allowed):\n    \"\"\"\n    An instance of ``ACLAllowed`` is a specialization of\n    :class:`pyramid.security.Allowed` that represents that a security check\n    made explicitly against ACL was allowed.  It evaluates equal to all\n    boolean true types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass SecurityAPIMixin(object):\n    @property\n    def identity(self):\n        \"\"\"\n        Return an opaque object identifying the current user or ``None`` if no\n        user is authenticated or there is no :term:`security policy` in effect.\n\n        \"\"\"\n        policy = _get_security_policy(self)\n        if policy is None:\n            return None\n        return policy.identify(self)\n\n    def has_permission(self, permission, context=None):\n        \"\"\" Given a permission and an optional context, returns an instance of\n        :data:`pyramid.security.Allowed` if the permission is granted to this\n        request with the provided context, or the context already associated\n        with the request.  Otherwise, returns an instance of\n        :data:`pyramid.security.Denied`.  This method delegates to the current\n        security policy.  Returns\n        :data:`pyramid.security.Allowed` unconditionally if no security\n        policy has been registered for this request.  If ``context`` is not\n        supplied or is supplied as ``None``, the context used is the\n        ``request.context`` attribute.\n\n        :param permission: Does this request have the given permission?\n        :type permission: str\n        :param context: A resource object or ``None``\n        :type context: object\n        :returns: Either :class:`pyramid.security.Allowed` or\n                  :class:`pyramid.security.Denied`.\n\n        \"\"\"\n        if context is None:\n            context = self.context\n        policy = _get_security_policy(self)\n        if policy is None:\n            return Allowed('No security policy in use.')\n        identity = policy.identify(self)\n        return policy.permits(self, context, identity, permission)\n\n\nclass AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return str(security.identify(self))\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)\n\n\n@implementer(ISecurityPolicy)\nclass LegacySecurityPolicy:\n    \"\"\"\n    A :term:`security policy` which provides a backwards compatibility shim for\n    the :term:`authentication policy` and the :term:`authorization policy`.\n\n    \"\"\"\n\n    def _get_authn_policy(self, request):\n        return request.registry.getUtility(IAuthenticationPolicy)\n\n    def _get_authz_policy(self, request):\n        return request.registry.getUtility(IAuthorizationPolicy)\n\n    def identify(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.authenticated_userid(request)\n\n    def remember(self, request, userid, **kw):\n        authn = self._get_authn_policy(request)\n        return authn.remember(request, userid, **kw)\n\n    def forget(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.forget(request)\n\n    def permits(self, request, context, identity, permission):\n        authn = self._get_authn_policy(request)\n        authz = self._get_authz_policy(request)\n        principals = authn.effective_principals(request)\n        return authz.permits(context, principals, permission)\n\n\nclass ACLHelper:\n    \"\"\" A helper for use with constructing a :term:`security policy` which\n    consults an :term:`ACL` object attached to a :term:`context` to determine\n    authorization information about a :term:`principal` or multiple principals.\n    If the context is part of a :term:`lineage`, the context's parents are\n    consulted for ACL information too.\n\n    \"\"\"\n\n    def permits(self, context, principals, permission):\n        \"\"\" Return an instance of :class:`pyramid.security.ACLAllowed` if the\n        ACL allows access a user with the given principals, return an instance\n        of :class:`pyramid.security.ACLDenied` if not.\n\n        When checking if principals are allowed, the security policy consults\n        the ``context`` for an ACL first.  If no ACL exists on the context, or\n        one does exist but the ACL does not explicitly allow or deny access for\n        any of the effective principals, consult the context's parent ACL, and\n        so on, until the lineage is exhausted or we determine that the policy\n        permits or denies.\n\n        During this processing, if any :data:`pyramid.security.Deny`\n        ACE is found matching any principal in ``principals``, stop\n        processing by returning an\n        :class:`pyramid.security.ACLDenied` instance (equals\n        ``False``) immediately.  If any\n        :data:`pyramid.security.Allow` ACE is found matching any\n        principal, stop processing by returning an\n        :class:`pyramid.security.ACLAllowed` instance (equals\n        ``True``) immediately.  If we exhaust the context's\n        :term:`lineage`, and no ACE has explicitly permitted or denied\n        access, return an instance of\n        :class:`pyramid.security.ACLDenied` (equals ``False``).\n\n        \"\"\"\n        acl = '<No ACL found on any object in resource lineage>'\n\n        for location in lineage(context):\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace in acl:\n                ace_action, ace_principal, ace_permissions = ace\n                if ace_principal in principals:\n                    if not is_nonstr_iter(ace_permissions):\n                        ace_permissions = [ace_permissions]\n                    if permission in ace_permissions:\n                        if ace_action == Allow:\n                            return ACLAllowed(\n                                ace, acl, permission, principals, location\n                            )\n                        else:\n                            return ACLDenied(\n                                ace, acl, permission, principals, location\n                            )\n\n        # default deny (if no ACL in lineage at all, or if none of the\n        # principals were mentioned in any ACE we found)\n        return ACLDenied(\n            '<default deny>', acl, permission, principals, context\n        )\n\n    def principals_allowed_by_permission(self, context, permission):\n        \"\"\" Return the set of principals explicitly granted the permission\n        named ``permission`` according to the ACL directly attached to the\n        ``context`` as well as inherited ACLs based on the :term:`lineage`.\n\n        When computing principals allowed by a permission, we compute the set\n        of principals that are explicitly granted the ``permission`` in the\n        provided ``context``.  We do this by walking 'up' the object graph\n        *from the root* to the context.  During this walking process, if we\n        find an explicit :data:`pyramid.security.Allow` ACE for a principal\n        that matches the ``permission``, the principal is included in the allow\n        list.  However, if later in the walking process that principal is\n        mentioned in any :data:`pyramid.security.Deny` ACE for the permission,\n        the principal is removed from the allow list.  If a\n        :data:`pyramid.security.Deny` to the principal\n        :data:`pyramid.security.Everyone` is encountered during the walking\n        process that matches the ``permission``, the allow list is cleared for\n        all principals encountered in previous ACLs.  The walking process ends\n        after we've processed the any ACL directly attached to ``context``; a\n        set of principals is returned.\n\n        \"\"\"\n        allowed = set()\n\n        for location in reversed(list(lineage(context))):\n            # NB: we're walking *up* the object graph from the root\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            allowed_here = set()\n            denied_here = set()\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace_action, ace_principal, ace_permissions in acl:\n                if not is_nonstr_iter(ace_permissions):\n                    ace_permissions = [ace_permissions]\n                if (ace_action == Allow) and (permission in ace_permissions):\n                    if ace_principal not in denied_here:\n                        allowed_here.add(ace_principal)\n                if (ace_action == Deny) and (permission in ace_permissions):\n                    denied_here.add(ace_principal)\n                    if ace_principal == Everyone:\n                        # clear the entire allowed set, as we've hit a\n                        # deny of Everyone ala (Deny, Everyone, ALL)\n                        allowed = set()\n                        break\n                    elif ace_principal in allowed:\n                        allowed.remove(ace_principal)\n\n            allowed.update(allowed_here)\n\n        return allowed\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def identify(self, request):\n        return request.session.get(self.userid_key)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class used for constructing a :term:`security policy` with stores\n    the user identity in a signed cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n        This option is available as of :app:`Pyramid` 1.10.\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='md5',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n",
            "header": {
                "file": {
                    "path": "src/pyramid/security.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "e28ce0f1c",
                "new_commit_hash": "a55320ce6",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/src/pyramid/security.py"
            },
            "plus_file": {
                "path": "b/src/pyramid/security.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 355,
                            "length": 7
                        },
                        "new_range": {
                            "start": 355,
                            "length": 7
                        },
                        "section": "class AuthenticationAPIMixin(object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        if authn is not None:",
                                "type": "context"
                            },
                            {
                                "content": "            return authn.authenticated_userid(self)",
                                "type": "context"
                            },
                            {
                                "content": "        elif security is not None:",
                                "type": "context"
                            },
                            {
                                "content": "            return security.identify(self)",
                                "type": "deleted"
                            },
                            {
                                "content": "            return str(security.identify(self))",
                                "type": "added"
                            },
                            {
                                "content": "        else:",
                                "type": "context"
                            },
                            {
                                "content": "            return None",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "src/pyramid/security.py",
                            "type": "class",
                            "name": "AuthenticationAPIMixin",
                            "content": "class AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 341,
                            "end_lineno": 399,
                            "parent": null
                        },
                        {
                            "file_name": "src/pyramid/security.py",
                            "type": "method",
                            "name": "AuthenticationAPIMixin.authenticated_userid",
                            "content": "class AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 343,
                            "end_lineno": 360,
                            "parent": {
                                "file_name": "src/pyramid/security.py",
                                "type": "class",
                                "name": "AuthenticationAPIMixin",
                                "content": "class AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 341,
                                "end_lineno": 399,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import unittest\nimport warnings\nfrom http.cookies import SimpleCookie\n\nfrom pyramid import testing\nfrom pyramid.util import text_\n\n\nclass TestAllPermissionsList(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _getTargetClass(self):\n        from pyramid.security import AllPermissionsList\n\n        return AllPermissionsList\n\n    def _makeOne(self):\n        return self._getTargetClass()()\n\n    def test_equality_w_self(self):\n        thing = self._makeOne()\n        self.assertTrue(thing.__eq__(thing))\n\n    def test_equality_w_other_instances_of_class(self):\n        thing = self._makeOne()\n        other = self._makeOne()\n        self.assertTrue(thing.__eq__(other))\n\n    def test_equality_miss(self):\n        thing = self._makeOne()\n        other = object()\n        self.assertFalse(thing.__eq__(other))\n\n    def test_contains_w_string(self):\n        thing = self._makeOne()\n        self.assertTrue('anything' in thing)\n\n    def test_contains_w_object(self):\n        thing = self._makeOne()\n        self.assertTrue(object() in thing)\n\n    def test_iterable(self):\n        thing = self._makeOne()\n        self.assertEqual(list(thing), [])\n\n    def test_singleton(self):\n        from pyramid.security import ALL_PERMISSIONS\n\n        self.assertEqual(ALL_PERMISSIONS.__class__, self._getTargetClass())\n\n\nclass TestAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Allowed\n\n        return Allowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        allowed = self._makeOne('hello')\n        self.assertEqual(allowed.msg, 'hello')\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), 'hello')\n        self.assertTrue('<Allowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg 'hello'>\" in repr(allowed))\n\n\nclass TestDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Denied\n\n        return Denied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        denied = self._makeOne('hello')\n        self.assertEqual(denied.msg, 'hello')\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), 'hello')\n        self.assertTrue('<Denied instance at ' in repr(denied))\n        self.assertTrue(\"with msg 'hello'>\" in repr(denied))\n\n\nclass TestACLAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLAllowed\n\n        return ACLAllowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Allowed\n\n        msg = (\n            \"ACLAllowed permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        allowed = self._makeOne(\n            'ace', 'acl', 'permission', 'principals', 'ctx'\n        )\n        self.assertIsInstance(allowed, Allowed)\n        self.assertTrue(msg in allowed.msg)\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), msg)\n        self.assertTrue('<ACLAllowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg %r>\" % msg in repr(allowed))\n\n\nclass TestACLDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLDenied\n\n        return ACLDenied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Denied\n\n        msg = (\n            \"ACLDenied permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        denied = self._makeOne('ace', 'acl', 'permission', 'principals', 'ctx')\n        self.assertIsInstance(denied, Denied)\n        self.assertTrue(msg in denied.msg)\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), msg)\n        self.assertTrue('<ACLDenied instance at ' in repr(denied))\n        self.assertTrue(\"with msg %r>\" % msg in repr(denied))\n\n\nclass TestPrincipalsAllowedByPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import principals_allowed_by_permission\n\n        return principals_allowed_by_permission(*arg)\n\n    def test_no_authorization_policy(self):\n        from pyramid.security import Everyone\n\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, [Everyone])\n\n    def test_with_authorization_policy(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        _registerAuthorizationPolicy(registry, 'yo')\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, 'yo')\n\n\nclass TestRemember(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kwarg):\n        from pyramid.security import remember\n\n        return remember(*arg, **kwarg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [('X-Pyramid-Test', 'me')])\n\n    def test_with_missing_arg(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        self.assertRaises(TypeError, lambda: self._callFUT(request))\n\n\nclass TestForget(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import forget\n\n        return forget(*arg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        result = self._callFUT(request)\n        self.assertEqual(result, [('X-Pyramid-Test', 'logout')])\n\n\nclass TestViewExecutionPermitted(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kw):\n        from pyramid.security import view_execution_permitted\n\n        return view_execution_permitted(*arg, **kw)\n\n    def _registerSecuredView(self, view_name, allow=True):\n        from pyramid.threadlocal import get_current_registry\n        from zope.interface import Interface\n        from pyramid.interfaces import ISecuredView\n        from pyramid.interfaces import IViewClassifier\n\n        class Checker(object):\n            def __permitted__(self, context, request):\n                self.context = context\n                self.request = request\n                return allow\n\n        checker = Checker()\n        reg = get_current_registry()\n        reg.registerAdapter(\n            checker,\n            (IViewClassifier, Interface, Interface),\n            ISecuredView,\n            view_name,\n        )\n        return checker\n\n    def test_no_permission(self):\n        from zope.interface import Interface\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n\n        class DummyView(object):\n            pass\n\n        view = DummyView()\n        reg.registerAdapter(\n            view, (IViewClassifier, Interface, Interface), IView, ''\n        )\n        result = self._callFUT(context, request, '')\n        msg = result.msg\n        self.assertTrue(\"Allowed: view name '' in context\" in msg)\n        self.assertTrue('(no permission defined)' in msg)\n        self.assertEqual(result, True)\n\n    def test_no_view_registered(self):\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n        self.assertRaises(TypeError, self._callFUT, context, request, '')\n\n    def test_with_permission(self):\n        from zope.interface import Interface\n        from zope.interface import directlyProvides\n        from pyramid.interfaces import IRequest\n\n        class IContext(Interface):\n            pass\n\n        context = DummyContext()\n        directlyProvides(context, IContext)\n        self._registerSecuredView('', True)\n        request = testing.DummyRequest({})\n        directlyProvides(request, IRequest)\n        result = self._callFUT(context, request, '')\n        self.assertTrue(result)\n\n\nclass TestIdentity(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity_no_security_policy(self):\n        request = _makeRequest()\n        self.assertEquals(request.identity, None)\n\n    def test_identity(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.identity, 'yo')\n\n\nclass TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n\nclass TestUnAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.unauthenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n\nclass TestEffectivePrincipals(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        from pyramid.security import Everyone\n\n        request = _makeRequest()\n        self.assertEqual(request.effective_principals, [Everyone])\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n\nclass TestHasPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.security import SecurityAPIMixin\n        from pyramid.registry import Registry\n\n        mixin = SecurityAPIMixin()\n        mixin.registry = Registry()\n        mixin.context = object()\n        return mixin\n\n    def test_no_security_policy(self):\n        request = self._makeOne()\n        result = request.has_permission('view')\n        self.assertTrue(result)\n        self.assertEqual(result.msg, 'No security policy in use.')\n\n    def test_with_security_registered(self):\n        request = self._makeOne()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.has_permission('view', context=None), 'yo')\n\n    def test_with_no_context_passed(self):\n        request = self._makeOne()\n        self.assertTrue(request.has_permission('view'))\n\n    def test_with_no_context_passed_or_on_request(self):\n        request = self._makeOne()\n        del request.context\n        self.assertRaises(AttributeError, request.has_permission, 'view')\n\n\nclass TestLegacySecurityPolicy(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, 'userid')\n\n        self.assertEqual(policy.identify(request), 'userid')\n\n    def test_remember(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.remember(request, 'userid'), [('X-Pyramid-Test', 'userid')]\n        )\n\n    def test_forget(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.forget(request), [('X-Pyramid-Test', 'logout')]\n        )\n\n    def test_permits(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, ['p1', 'p2'])\n        _registerAuthorizationPolicy(request.registry, True)\n\n        self.assertIs(\n            policy.permits(request, request.context, 'userid', 'permission'),\n            True,\n        )\n\n\n_TEST_HEADER = 'X-Pyramid-Test'\n\n\nclass DummyContext:\n    def __init__(self, *arg, **kw):\n        self.__dict__.update(kw)\n\n\nclass DummySecurityPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, request):\n        return self.result\n\n    def permits(self, request, context, identity, permission):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthenticationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def effective_principals(self, request):\n        return self.result\n\n    def unauthenticated_userid(self, request):\n        return self.result\n\n    def authenticated_userid(self, request):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthorizationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def permits(self, context, principals, permission):\n        return self.result\n\n    def principals_allowed_by_permission(self, context, permission):\n        return self.result\n\n\ndef _registerSecurityPolicy(reg, result):\n    from pyramid.interfaces import ISecurityPolicy\n\n    policy = DummySecurityPolicy(result)\n    reg.registerUtility(policy, ISecurityPolicy)\n    return policy\n\n\ndef _registerAuthenticationPolicy(reg, result):\n    from pyramid.interfaces import IAuthenticationPolicy\n\n    policy = DummyAuthenticationPolicy(result)\n    reg.registerUtility(policy, IAuthenticationPolicy)\n    return policy\n\n\ndef _registerAuthorizationPolicy(reg, result):\n    from pyramid.interfaces import IAuthorizationPolicy\n\n    policy = DummyAuthorizationPolicy(result)\n    reg.registerUtility(policy, IAuthorizationPolicy)\n    return policy\n\n\ndef _makeRequest():\n    from pyramid.registry import Registry\n\n    request = testing.DummyRequest(environ={})\n    request.registry = Registry()\n    request.context = object()\n    return request\n\n\nclass TestACLHelper(unittest.TestCase):\n    def test_no_acl(self):\n        from pyramid.security import ACLHelper\n\n        context = DummyContext()\n        helper = ACLHelper()\n        result = helper.permits(context, ['foo'], 'permission')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n        self.assertEqual(result.permission, 'permission')\n        self.assertEqual(result.principals, ['foo'])\n        self.assertEqual(result.context, context)\n\n    def test_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Allow\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        from pyramid.security import ALL_PERMISSIONS\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        root = DummyContext()\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [(Allow, Authenticated, VIEW)]\n        community.__acl__ = [\n            (Allow, 'fred', ALL_PERMISSIONS),\n            (Allow, 'wilma', VIEW),\n            DENY_ALL,\n        ]\n        blog.__acl__ = [\n            (Allow, 'barney', MEMBER_PERMS),\n            (Allow, 'wilma', VIEW),\n        ]\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'wilma', VIEW))\n        self.assertEqual(result.acl, blog.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'delete'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'doesntevenexistyet'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'barney', MEMBER_PERMS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'administer'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            root, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, (Allow, Authenticated, VIEW))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(root, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(result.acl, root.__acl__)\n\n        context = DummyContext()\n        result = helper.permits(context, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n\n    def test_string_permissions_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        root = DummyContext()\n        root.__acl__ = [(Allow, 'wilma', 'view_stuff')]\n\n        result = helper.permits(root, ['wilma'], 'view')\n        # would be True if matching against 'view_stuff' instead of against\n        # ['view_stuff']\n        self.assertEqual(result, False)\n\n    def test_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        fn = lambda self: [(Allow, 'bob', 'read')]\n        context.__acl__ = fn.__get__(context, context.__class__)\n        result = helper.permits(context, ['bob'], 'read')\n        self.assertTrue(result)\n\n    def test_principals_allowed_by_permission_direct(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = lambda: [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_string_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Allow, 'chrism', 'read_it')]\n        context.__acl__ = acl\n        result = helper.principals_allowed_by_permission(context, 'read')\n        # would be ['chrism'] if 'read' were compared against 'read_it' instead\n        # of against ['read_it']\n        self.assertEqual(list(result), [])\n\n    def test_principals_allowed_by_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import Deny\n        from pyramid.security import DENY_ALL\n        from pyramid.security import ALL_PERMISSIONS\n\n        helper = ACLHelper()\n        root = DummyContext(__name__='', __parent__=None)\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [\n            (Allow, 'chrism', ('read', 'write')),\n            (Allow, 'other', ('read',)),\n            (Allow, 'jim', ALL_PERMISSIONS),\n        ]\n        community.__acl__ = [\n            (Deny, 'flooz', 'read'),\n            (Allow, 'flooz', 'read'),\n            (Allow, 'mork', 'read'),\n            (Deny, 'jim', 'read'),\n            (Allow, 'someguy', 'manage'),\n        ]\n        blog.__acl__ = [(Allow, 'fred', 'read'), DENY_ALL]\n\n        result = sorted(helper.principals_allowed_by_permission(blog, 'read'))\n        self.assertEqual(result, ['fred'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        self.assertEqual(result, ['chrism', 'mork', 'other'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        result = sorted(helper.principals_allowed_by_permission(root, 'read'))\n        self.assertEqual(result, ['chrism', 'jim', 'other'])\n\n    def test_principals_allowed_by_permission_no_acls(self):\n        from pyramid.security import ACLHelper\n\n        helper = ACLHelper()\n        context = DummyContext()\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_not_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'write')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'read')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n\nVIEW = 'view'\nEDIT = 'edit'\nCREATE = 'create'\nDELETE = 'delete'\nMODERATE = 'moderate'\nADMINISTER = 'administer'\nCOMMENT = 'comment'\n\nGUEST_PERMS = (VIEW, COMMENT)\nMEMBER_PERMS = GUEST_PERMS + (EDIT, CREATE, DELETE)\nMODERATOR_PERMS = MEMBER_PERMS + (MODERATE,)\nADMINISTRATOR_PERMS = MODERATOR_PERMS + (ADMINISTER,)\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.security import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_identify(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.security import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.security import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass DummyAuthTktModule(object):\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n",
            "new_file_content": "import unittest\nimport warnings\nfrom http.cookies import SimpleCookie\n\nfrom pyramid import testing\nfrom pyramid.util import text_\n\n\nclass TestAllPermissionsList(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _getTargetClass(self):\n        from pyramid.security import AllPermissionsList\n\n        return AllPermissionsList\n\n    def _makeOne(self):\n        return self._getTargetClass()()\n\n    def test_equality_w_self(self):\n        thing = self._makeOne()\n        self.assertTrue(thing.__eq__(thing))\n\n    def test_equality_w_other_instances_of_class(self):\n        thing = self._makeOne()\n        other = self._makeOne()\n        self.assertTrue(thing.__eq__(other))\n\n    def test_equality_miss(self):\n        thing = self._makeOne()\n        other = object()\n        self.assertFalse(thing.__eq__(other))\n\n    def test_contains_w_string(self):\n        thing = self._makeOne()\n        self.assertTrue('anything' in thing)\n\n    def test_contains_w_object(self):\n        thing = self._makeOne()\n        self.assertTrue(object() in thing)\n\n    def test_iterable(self):\n        thing = self._makeOne()\n        self.assertEqual(list(thing), [])\n\n    def test_singleton(self):\n        from pyramid.security import ALL_PERMISSIONS\n\n        self.assertEqual(ALL_PERMISSIONS.__class__, self._getTargetClass())\n\n\nclass TestAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Allowed\n\n        return Allowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        allowed = self._makeOne('hello')\n        self.assertEqual(allowed.msg, 'hello')\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), 'hello')\n        self.assertTrue('<Allowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg 'hello'>\" in repr(allowed))\n\n\nclass TestDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Denied\n\n        return Denied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        denied = self._makeOne('hello')\n        self.assertEqual(denied.msg, 'hello')\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), 'hello')\n        self.assertTrue('<Denied instance at ' in repr(denied))\n        self.assertTrue(\"with msg 'hello'>\" in repr(denied))\n\n\nclass TestACLAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLAllowed\n\n        return ACLAllowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Allowed\n\n        msg = (\n            \"ACLAllowed permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        allowed = self._makeOne(\n            'ace', 'acl', 'permission', 'principals', 'ctx'\n        )\n        self.assertIsInstance(allowed, Allowed)\n        self.assertTrue(msg in allowed.msg)\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), msg)\n        self.assertTrue('<ACLAllowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg %r>\" % msg in repr(allowed))\n\n\nclass TestACLDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLDenied\n\n        return ACLDenied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Denied\n\n        msg = (\n            \"ACLDenied permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        denied = self._makeOne('ace', 'acl', 'permission', 'principals', 'ctx')\n        self.assertIsInstance(denied, Denied)\n        self.assertTrue(msg in denied.msg)\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), msg)\n        self.assertTrue('<ACLDenied instance at ' in repr(denied))\n        self.assertTrue(\"with msg %r>\" % msg in repr(denied))\n\n\nclass TestPrincipalsAllowedByPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import principals_allowed_by_permission\n\n        return principals_allowed_by_permission(*arg)\n\n    def test_no_authorization_policy(self):\n        from pyramid.security import Everyone\n\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, [Everyone])\n\n    def test_with_authorization_policy(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        _registerAuthorizationPolicy(registry, 'yo')\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, 'yo')\n\n\nclass TestRemember(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kwarg):\n        from pyramid.security import remember\n\n        return remember(*arg, **kwarg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [('X-Pyramid-Test', 'me')])\n\n    def test_with_missing_arg(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        self.assertRaises(TypeError, lambda: self._callFUT(request))\n\n\nclass TestForget(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import forget\n\n        return forget(*arg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        result = self._callFUT(request)\n        self.assertEqual(result, [('X-Pyramid-Test', 'logout')])\n\n\nclass TestViewExecutionPermitted(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kw):\n        from pyramid.security import view_execution_permitted\n\n        return view_execution_permitted(*arg, **kw)\n\n    def _registerSecuredView(self, view_name, allow=True):\n        from pyramid.threadlocal import get_current_registry\n        from zope.interface import Interface\n        from pyramid.interfaces import ISecuredView\n        from pyramid.interfaces import IViewClassifier\n\n        class Checker(object):\n            def __permitted__(self, context, request):\n                self.context = context\n                self.request = request\n                return allow\n\n        checker = Checker()\n        reg = get_current_registry()\n        reg.registerAdapter(\n            checker,\n            (IViewClassifier, Interface, Interface),\n            ISecuredView,\n            view_name,\n        )\n        return checker\n\n    def test_no_permission(self):\n        from zope.interface import Interface\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n\n        class DummyView(object):\n            pass\n\n        view = DummyView()\n        reg.registerAdapter(\n            view, (IViewClassifier, Interface, Interface), IView, ''\n        )\n        result = self._callFUT(context, request, '')\n        msg = result.msg\n        self.assertTrue(\"Allowed: view name '' in context\" in msg)\n        self.assertTrue('(no permission defined)' in msg)\n        self.assertEqual(result, True)\n\n    def test_no_view_registered(self):\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n        self.assertRaises(TypeError, self._callFUT, context, request, '')\n\n    def test_with_permission(self):\n        from zope.interface import Interface\n        from zope.interface import directlyProvides\n        from pyramid.interfaces import IRequest\n\n        class IContext(Interface):\n            pass\n\n        context = DummyContext()\n        directlyProvides(context, IContext)\n        self._registerSecuredView('', True)\n        request = testing.DummyRequest({})\n        directlyProvides(request, IRequest)\n        result = self._callFUT(context, request, '')\n        self.assertTrue(result)\n\n\nclass TestIdentity(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity_no_security_policy(self):\n        request = _makeRequest()\n        self.assertEquals(request.identity, None)\n\n    def test_identity(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.identity, 'yo')\n\n\nclass TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        # Ensure the identity is stringified.\n        _registerSecurityPolicy(request.registry, 123)\n        self.assertEqual(request.authenticated_userid, '123')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n\nclass TestUnAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.unauthenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n\nclass TestEffectivePrincipals(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        from pyramid.security import Everyone\n\n        request = _makeRequest()\n        self.assertEqual(request.effective_principals, [Everyone])\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n\nclass TestHasPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.security import SecurityAPIMixin\n        from pyramid.registry import Registry\n\n        mixin = SecurityAPIMixin()\n        mixin.registry = Registry()\n        mixin.context = object()\n        return mixin\n\n    def test_no_security_policy(self):\n        request = self._makeOne()\n        result = request.has_permission('view')\n        self.assertTrue(result)\n        self.assertEqual(result.msg, 'No security policy in use.')\n\n    def test_with_security_registered(self):\n        request = self._makeOne()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.has_permission('view', context=None), 'yo')\n\n    def test_with_no_context_passed(self):\n        request = self._makeOne()\n        self.assertTrue(request.has_permission('view'))\n\n    def test_with_no_context_passed_or_on_request(self):\n        request = self._makeOne()\n        del request.context\n        self.assertRaises(AttributeError, request.has_permission, 'view')\n\n\nclass TestLegacySecurityPolicy(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, 'userid')\n\n        self.assertEqual(policy.identify(request), 'userid')\n\n    def test_remember(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.remember(request, 'userid'), [('X-Pyramid-Test', 'userid')]\n        )\n\n    def test_forget(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.forget(request), [('X-Pyramid-Test', 'logout')]\n        )\n\n    def test_permits(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, ['p1', 'p2'])\n        _registerAuthorizationPolicy(request.registry, True)\n\n        self.assertIs(\n            policy.permits(request, request.context, 'userid', 'permission'),\n            True,\n        )\n\n\n_TEST_HEADER = 'X-Pyramid-Test'\n\n\nclass DummyContext:\n    def __init__(self, *arg, **kw):\n        self.__dict__.update(kw)\n\n\nclass DummySecurityPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, request):\n        return self.result\n\n    def permits(self, request, context, identity, permission):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthenticationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def effective_principals(self, request):\n        return self.result\n\n    def unauthenticated_userid(self, request):\n        return self.result\n\n    def authenticated_userid(self, request):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthorizationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def permits(self, context, principals, permission):\n        return self.result\n\n    def principals_allowed_by_permission(self, context, permission):\n        return self.result\n\n\ndef _registerSecurityPolicy(reg, result):\n    from pyramid.interfaces import ISecurityPolicy\n\n    policy = DummySecurityPolicy(result)\n    reg.registerUtility(policy, ISecurityPolicy)\n    return policy\n\n\ndef _registerAuthenticationPolicy(reg, result):\n    from pyramid.interfaces import IAuthenticationPolicy\n\n    policy = DummyAuthenticationPolicy(result)\n    reg.registerUtility(policy, IAuthenticationPolicy)\n    return policy\n\n\ndef _registerAuthorizationPolicy(reg, result):\n    from pyramid.interfaces import IAuthorizationPolicy\n\n    policy = DummyAuthorizationPolicy(result)\n    reg.registerUtility(policy, IAuthorizationPolicy)\n    return policy\n\n\ndef _makeRequest():\n    from pyramid.registry import Registry\n\n    request = testing.DummyRequest(environ={})\n    request.registry = Registry()\n    request.context = object()\n    return request\n\n\nclass TestACLHelper(unittest.TestCase):\n    def test_no_acl(self):\n        from pyramid.security import ACLHelper\n\n        context = DummyContext()\n        helper = ACLHelper()\n        result = helper.permits(context, ['foo'], 'permission')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n        self.assertEqual(result.permission, 'permission')\n        self.assertEqual(result.principals, ['foo'])\n        self.assertEqual(result.context, context)\n\n    def test_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Allow\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        from pyramid.security import ALL_PERMISSIONS\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        root = DummyContext()\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [(Allow, Authenticated, VIEW)]\n        community.__acl__ = [\n            (Allow, 'fred', ALL_PERMISSIONS),\n            (Allow, 'wilma', VIEW),\n            DENY_ALL,\n        ]\n        blog.__acl__ = [\n            (Allow, 'barney', MEMBER_PERMS),\n            (Allow, 'wilma', VIEW),\n        ]\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'wilma', VIEW))\n        self.assertEqual(result.acl, blog.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'delete'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'doesntevenexistyet'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'barney', MEMBER_PERMS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'administer'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            root, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, (Allow, Authenticated, VIEW))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(root, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(result.acl, root.__acl__)\n\n        context = DummyContext()\n        result = helper.permits(context, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n\n    def test_string_permissions_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        root = DummyContext()\n        root.__acl__ = [(Allow, 'wilma', 'view_stuff')]\n\n        result = helper.permits(root, ['wilma'], 'view')\n        # would be True if matching against 'view_stuff' instead of against\n        # ['view_stuff']\n        self.assertEqual(result, False)\n\n    def test_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        fn = lambda self: [(Allow, 'bob', 'read')]\n        context.__acl__ = fn.__get__(context, context.__class__)\n        result = helper.permits(context, ['bob'], 'read')\n        self.assertTrue(result)\n\n    def test_principals_allowed_by_permission_direct(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = lambda: [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_string_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Allow, 'chrism', 'read_it')]\n        context.__acl__ = acl\n        result = helper.principals_allowed_by_permission(context, 'read')\n        # would be ['chrism'] if 'read' were compared against 'read_it' instead\n        # of against ['read_it']\n        self.assertEqual(list(result), [])\n\n    def test_principals_allowed_by_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import Deny\n        from pyramid.security import DENY_ALL\n        from pyramid.security import ALL_PERMISSIONS\n\n        helper = ACLHelper()\n        root = DummyContext(__name__='', __parent__=None)\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [\n            (Allow, 'chrism', ('read', 'write')),\n            (Allow, 'other', ('read',)),\n            (Allow, 'jim', ALL_PERMISSIONS),\n        ]\n        community.__acl__ = [\n            (Deny, 'flooz', 'read'),\n            (Allow, 'flooz', 'read'),\n            (Allow, 'mork', 'read'),\n            (Deny, 'jim', 'read'),\n            (Allow, 'someguy', 'manage'),\n        ]\n        blog.__acl__ = [(Allow, 'fred', 'read'), DENY_ALL]\n\n        result = sorted(helper.principals_allowed_by_permission(blog, 'read'))\n        self.assertEqual(result, ['fred'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        self.assertEqual(result, ['chrism', 'mork', 'other'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        result = sorted(helper.principals_allowed_by_permission(root, 'read'))\n        self.assertEqual(result, ['chrism', 'jim', 'other'])\n\n    def test_principals_allowed_by_permission_no_acls(self):\n        from pyramid.security import ACLHelper\n\n        helper = ACLHelper()\n        context = DummyContext()\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_not_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'write')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'read')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n\nVIEW = 'view'\nEDIT = 'edit'\nCREATE = 'create'\nDELETE = 'delete'\nMODERATE = 'moderate'\nADMINISTER = 'administer'\nCOMMENT = 'comment'\n\nGUEST_PERMS = (VIEW, COMMENT)\nMEMBER_PERMS = GUEST_PERMS + (EDIT, CREATE, DELETE)\nMODERATOR_PERMS = MEMBER_PERMS + (MODERATE,)\nADMINISTRATOR_PERMS = MODERATOR_PERMS + (ADMINISTER,)\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.security import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_identify(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.security import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.security import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass DummyAuthTktModule(object):\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n",
            "header": {
                "file": {
                    "path": "tests/test_security.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "b66632baa",
                "new_commit_hash": "97aec42c6",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/tests/test_security.py"
            },
            "plus_file": {
                "path": "b/tests/test_security.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 357,
                            "length": 8
                        },
                        "new_range": {
                            "start": 357,
                            "length": 9
                        },
                        "section": "class TestAuthenticatedUserId(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_with_security_policy(self):",
                                "type": "context"
                            },
                            {
                                "content": "        request = _makeRequest()",
                                "type": "context"
                            },
                            {
                                "content": "        _registerSecurityPolicy(request.registry, 'yo')",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.assertEqual(request.authenticated_userid, 'yo')",
                                "type": "deleted"
                            },
                            {
                                "content": "        # Ensure the identity is stringified.",
                                "type": "added"
                            },
                            {
                                "content": "        _registerSecurityPolicy(request.registry, 123)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(request.authenticated_userid, '123')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_with_authentication_policy_no_reg_on_request(self):",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.threadlocal import get_current_registry",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "tests/test_security.py",
                            "type": "class",
                            "name": "TestAuthenticatedUserId",
                            "content": "class TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 341,
                            "end_lineno": 370,
                            "parent": null
                        },
                        {
                            "file_name": "tests/test_security.py",
                            "type": "method",
                            "name": "TestAuthenticatedUserId.test_with_security_policy",
                            "content": "class TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 358,
                            "end_lineno": 361,
                            "parent": {
                                "file_name": "tests/test_security.py",
                                "type": "class",
                                "name": "TestAuthenticatedUserId",
                                "content": "class TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 341,
                                "end_lineno": 370,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "47f8935bb5423718ec293bba4709307be7d2f51c^",
    "new_commit_hash": "47f8935bb5423718ec293bba4709307be7d2f51c",
    "commit_message": "Stringify identity in legacy authenticated_userid.",
    "commit_date": "2019-04-15T19:04:35-07:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "47f8935bb5423718ec293bba4709307be7d2f51c",
    "test_file_codes": [
        "import unittest\nimport warnings\nfrom http.cookies import SimpleCookie\n\nfrom pyramid import testing\nfrom pyramid.util import text_\n\n\nclass TestAllPermissionsList(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _getTargetClass(self):\n        from pyramid.security import AllPermissionsList\n\n        return AllPermissionsList\n\n    def _makeOne(self):\n        return self._getTargetClass()()\n\n    def test_equality_w_self(self):\n        thing = self._makeOne()\n        self.assertTrue(thing.__eq__(thing))\n\n    def test_equality_w_other_instances_of_class(self):\n        thing = self._makeOne()\n        other = self._makeOne()\n        self.assertTrue(thing.__eq__(other))\n\n    def test_equality_miss(self):\n        thing = self._makeOne()\n        other = object()\n        self.assertFalse(thing.__eq__(other))\n\n    def test_contains_w_string(self):\n        thing = self._makeOne()\n        self.assertTrue('anything' in thing)\n\n    def test_contains_w_object(self):\n        thing = self._makeOne()\n        self.assertTrue(object() in thing)\n\n    def test_iterable(self):\n        thing = self._makeOne()\n        self.assertEqual(list(thing), [])\n\n    def test_singleton(self):\n        from pyramid.security import ALL_PERMISSIONS\n\n        self.assertEqual(ALL_PERMISSIONS.__class__, self._getTargetClass())\n\n\nclass TestAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Allowed\n\n        return Allowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        allowed = self._makeOne('hello')\n        self.assertEqual(allowed.msg, 'hello')\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), 'hello')\n        self.assertTrue('<Allowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg 'hello'>\" in repr(allowed))\n\n\nclass TestDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import Denied\n\n        return Denied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        denied = self._makeOne('hello')\n        self.assertEqual(denied.msg, 'hello')\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), 'hello')\n        self.assertTrue('<Denied instance at ' in repr(denied))\n        self.assertTrue(\"with msg 'hello'>\" in repr(denied))\n\n\nclass TestACLAllowed(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLAllowed\n\n        return ACLAllowed\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Allowed\n\n        msg = (\n            \"ACLAllowed permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        allowed = self._makeOne(\n            'ace', 'acl', 'permission', 'principals', 'ctx'\n        )\n        self.assertIsInstance(allowed, Allowed)\n        self.assertTrue(msg in allowed.msg)\n        self.assertEqual(allowed, True)\n        self.assertTrue(allowed)\n        self.assertEqual(str(allowed), msg)\n        self.assertTrue('<ACLAllowed instance at ' in repr(allowed))\n        self.assertTrue(\"with msg %r>\" % msg in repr(allowed))\n\n\nclass TestACLDenied(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import ACLDenied\n\n        return ACLDenied\n\n    def _makeOne(self, *arg, **kw):\n        klass = self._getTargetClass()\n        return klass(*arg, **kw)\n\n    def test_it(self):\n        from pyramid.security import Denied\n\n        msg = (\n            \"ACLDenied permission 'permission' via ACE 'ace' in ACL 'acl' \"\n            \"on context 'ctx' for principals 'principals'\"\n        )\n        denied = self._makeOne('ace', 'acl', 'permission', 'principals', 'ctx')\n        self.assertIsInstance(denied, Denied)\n        self.assertTrue(msg in denied.msg)\n        self.assertEqual(denied, False)\n        self.assertFalse(denied)\n        self.assertEqual(str(denied), msg)\n        self.assertTrue('<ACLDenied instance at ' in repr(denied))\n        self.assertTrue(\"with msg %r>\" % msg in repr(denied))\n\n\nclass TestPrincipalsAllowedByPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import principals_allowed_by_permission\n\n        return principals_allowed_by_permission(*arg)\n\n    def test_no_authorization_policy(self):\n        from pyramid.security import Everyone\n\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, [Everyone])\n\n    def test_with_authorization_policy(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        _registerAuthorizationPolicy(registry, 'yo')\n        context = DummyContext()\n        result = self._callFUT(context, 'view')\n        self.assertEqual(result, 'yo')\n\n\nclass TestRemember(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kwarg):\n        from pyramid.security import remember\n\n        return remember(*arg, **kwarg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        result = self._callFUT(request, 'me')\n        self.assertEqual(result, [('X-Pyramid-Test', 'me')])\n\n    def test_with_missing_arg(self):\n        request = _makeRequest()\n        registry = request.registry\n        _registerSecurityPolicy(registry, 'yo')\n        self.assertRaises(TypeError, lambda: self._callFUT(request))\n\n\nclass TestForget(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg):\n        from pyramid.security import forget\n\n        return forget(*arg)\n\n    def test_no_security_policy(self):\n        request = _makeRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, [])\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        result = self._callFUT(request)\n        self.assertEqual(result, [('X-Pyramid-Test', 'logout')])\n\n\nclass TestViewExecutionPermitted(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, *arg, **kw):\n        from pyramid.security import view_execution_permitted\n\n        return view_execution_permitted(*arg, **kw)\n\n    def _registerSecuredView(self, view_name, allow=True):\n        from pyramid.threadlocal import get_current_registry\n        from zope.interface import Interface\n        from pyramid.interfaces import ISecuredView\n        from pyramid.interfaces import IViewClassifier\n\n        class Checker(object):\n            def __permitted__(self, context, request):\n                self.context = context\n                self.request = request\n                return allow\n\n        checker = Checker()\n        reg = get_current_registry()\n        reg.registerAdapter(\n            checker,\n            (IViewClassifier, Interface, Interface),\n            ISecuredView,\n            view_name,\n        )\n        return checker\n\n    def test_no_permission(self):\n        from zope.interface import Interface\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n        from pyramid.interfaces import IView\n        from pyramid.interfaces import IViewClassifier\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n\n        class DummyView(object):\n            pass\n\n        view = DummyView()\n        reg.registerAdapter(\n            view, (IViewClassifier, Interface, Interface), IView, ''\n        )\n        result = self._callFUT(context, request, '')\n        msg = result.msg\n        self.assertTrue(\"Allowed: view name '' in context\" in msg)\n        self.assertTrue('(no permission defined)' in msg)\n        self.assertEqual(result, True)\n\n    def test_no_view_registered(self):\n        from pyramid.threadlocal import get_current_registry\n        from pyramid.interfaces import ISettings\n\n        settings = dict(debug_authorization=True)\n        reg = get_current_registry()\n        reg.registerUtility(settings, ISettings)\n        context = DummyContext()\n        request = testing.DummyRequest({})\n        self.assertRaises(TypeError, self._callFUT, context, request, '')\n\n    def test_with_permission(self):\n        from zope.interface import Interface\n        from zope.interface import directlyProvides\n        from pyramid.interfaces import IRequest\n\n        class IContext(Interface):\n            pass\n\n        context = DummyContext()\n        directlyProvides(context, IContext)\n        self._registerSecuredView('', True)\n        request = testing.DummyRequest({})\n        directlyProvides(request, IRequest)\n        result = self._callFUT(context, request, '')\n        self.assertTrue(result)\n\n\nclass TestIdentity(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity_no_security_policy(self):\n        request = _makeRequest()\n        self.assertEquals(request.identity, None)\n\n    def test_identity(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.identity, 'yo')\n\n\nclass TestAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.authenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        # Ensure the identity is stringified.\n        _registerSecurityPolicy(request.registry, 123)\n        self.assertEqual(request.authenticated_userid, '123')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.authenticated_userid, 'yo')\n\n\nclass TestUnAuthenticatedUserId(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        request = _makeRequest()\n        self.assertEqual(request.unauthenticated_userid, None)\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        _registerSecurityPolicy(request.registry, 'wat')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.unauthenticated_userid, 'yo')\n\n\nclass TestEffectivePrincipals(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_no_authentication_policy(self):\n        from pyramid.security import Everyone\n\n        request = _makeRequest()\n        self.assertEqual(request.effective_principals, [Everyone])\n\n    def test_with_authentication_policy(self):\n        request = _makeRequest()\n        _registerAuthenticationPolicy(request.registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n    def test_with_authentication_policy_no_reg_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n\n        registry = get_current_registry()\n        request = _makeRequest()\n        del request.registry\n        _registerAuthenticationPolicy(registry, 'yo')\n        self.assertEqual(request.effective_principals, 'yo')\n\n\nclass TestHasPermission(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.security import SecurityAPIMixin\n        from pyramid.registry import Registry\n\n        mixin = SecurityAPIMixin()\n        mixin.registry = Registry()\n        mixin.context = object()\n        return mixin\n\n    def test_no_security_policy(self):\n        request = self._makeOne()\n        result = request.has_permission('view')\n        self.assertTrue(result)\n        self.assertEqual(result.msg, 'No security policy in use.')\n\n    def test_with_security_registered(self):\n        request = self._makeOne()\n        _registerSecurityPolicy(request.registry, 'yo')\n        self.assertEqual(request.has_permission('view', context=None), 'yo')\n\n    def test_with_no_context_passed(self):\n        request = self._makeOne()\n        self.assertTrue(request.has_permission('view'))\n\n    def test_with_no_context_passed_or_on_request(self):\n        request = self._makeOne()\n        del request.context\n        self.assertRaises(AttributeError, request.has_permission, 'view')\n\n\nclass TestLegacySecurityPolicy(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def test_identity(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, 'userid')\n\n        self.assertEqual(policy.identify(request), 'userid')\n\n    def test_remember(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.remember(request, 'userid'), [('X-Pyramid-Test', 'userid')]\n        )\n\n    def test_forget(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, None)\n\n        self.assertEqual(\n            policy.forget(request), [('X-Pyramid-Test', 'logout')]\n        )\n\n    def test_permits(self):\n        from pyramid.security import LegacySecurityPolicy\n\n        request = _makeRequest()\n        policy = LegacySecurityPolicy()\n        _registerAuthenticationPolicy(request.registry, ['p1', 'p2'])\n        _registerAuthorizationPolicy(request.registry, True)\n\n        self.assertIs(\n            policy.permits(request, request.context, 'userid', 'permission'),\n            True,\n        )\n\n\n_TEST_HEADER = 'X-Pyramid-Test'\n\n\nclass DummyContext:\n    def __init__(self, *arg, **kw):\n        self.__dict__.update(kw)\n\n\nclass DummySecurityPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, request):\n        return self.result\n\n    def permits(self, request, context, identity, permission):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthenticationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def effective_principals(self, request):\n        return self.result\n\n    def unauthenticated_userid(self, request):\n        return self.result\n\n    def authenticated_userid(self, request):\n        return self.result\n\n    def remember(self, request, userid, **kw):\n        headers = [(_TEST_HEADER, userid)]\n        self._header_remembered = headers[0]\n        return headers\n\n    def forget(self, request):\n        headers = [(_TEST_HEADER, 'logout')]\n        self._header_forgotten = headers[0]\n        return headers\n\n\nclass DummyAuthorizationPolicy:\n    def __init__(self, result):\n        self.result = result\n\n    def permits(self, context, principals, permission):\n        return self.result\n\n    def principals_allowed_by_permission(self, context, permission):\n        return self.result\n\n\ndef _registerSecurityPolicy(reg, result):\n    from pyramid.interfaces import ISecurityPolicy\n\n    policy = DummySecurityPolicy(result)\n    reg.registerUtility(policy, ISecurityPolicy)\n    return policy\n\n\ndef _registerAuthenticationPolicy(reg, result):\n    from pyramid.interfaces import IAuthenticationPolicy\n\n    policy = DummyAuthenticationPolicy(result)\n    reg.registerUtility(policy, IAuthenticationPolicy)\n    return policy\n\n\ndef _registerAuthorizationPolicy(reg, result):\n    from pyramid.interfaces import IAuthorizationPolicy\n\n    policy = DummyAuthorizationPolicy(result)\n    reg.registerUtility(policy, IAuthorizationPolicy)\n    return policy\n\n\ndef _makeRequest():\n    from pyramid.registry import Registry\n\n    request = testing.DummyRequest(environ={})\n    request.registry = Registry()\n    request.context = object()\n    return request\n\n\nclass TestACLHelper(unittest.TestCase):\n    def test_no_acl(self):\n        from pyramid.security import ACLHelper\n\n        context = DummyContext()\n        helper = ACLHelper()\n        result = helper.permits(context, ['foo'], 'permission')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n        self.assertEqual(result.permission, 'permission')\n        self.assertEqual(result.principals, ['foo'])\n        self.assertEqual(result.context, context)\n\n    def test_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Allow\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        from pyramid.security import ALL_PERMISSIONS\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        root = DummyContext()\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [(Allow, Authenticated, VIEW)]\n        community.__acl__ = [\n            (Allow, 'fred', ALL_PERMISSIONS),\n            (Allow, 'wilma', VIEW),\n            DENY_ALL,\n        ]\n        blog.__acl__ = [\n            (Allow, 'barney', MEMBER_PERMS),\n            (Allow, 'wilma', VIEW),\n        ]\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'wilma', VIEW))\n        self.assertEqual(result.acl, blog.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'wilma'], 'delete'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'fred'], 'doesntevenexistyet'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Allow, 'fred', ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, blog)\n        self.assertEqual(result.ace, (Allow, 'barney', MEMBER_PERMS))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'barney'], 'administer'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(\n            root, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, True)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, (Allow, Authenticated, VIEW))\n        result = helper.permits(\n            blog, [Everyone, Authenticated, 'someguy'], 'view'\n        )\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, community)\n        self.assertEqual(result.ace, (Deny, Everyone, ALL_PERMISSIONS))\n        self.assertEqual(result.acl, community.__acl__)\n\n        result = helper.permits(root, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.context, root)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(result.acl, root.__acl__)\n\n        context = DummyContext()\n        result = helper.permits(context, [Everyone], 'view')\n        self.assertEqual(result, False)\n        self.assertEqual(result.ace, '<default deny>')\n        self.assertEqual(\n            result.acl, '<No ACL found on any object in resource lineage>'\n        )\n\n    def test_string_permissions_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        root = DummyContext()\n        root.__acl__ = [(Allow, 'wilma', 'view_stuff')]\n\n        result = helper.permits(root, ['wilma'], 'view')\n        # would be True if matching against 'view_stuff' instead of against\n        # ['view_stuff']\n        self.assertEqual(result, False)\n\n    def test_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        fn = lambda self: [(Allow, 'bob', 'read')]\n        context.__acl__ = fn.__get__(context, context.__class__)\n        result = helper.permits(context, ['bob'], 'read')\n        self.assertTrue(result)\n\n    def test_principals_allowed_by_permission_direct(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_callable_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import DENY_ALL\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = lambda: [\n            (Allow, 'chrism', ('read', 'write')),\n            DENY_ALL,\n            (Allow, 'other', 'read'),\n        ]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, ['chrism'])\n\n    def test_principals_allowed_by_permission_string_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Allow, 'chrism', 'read_it')]\n        context.__acl__ = acl\n        result = helper.principals_allowed_by_permission(context, 'read')\n        # would be ['chrism'] if 'read' were compared against 'read_it' instead\n        # of against ['read_it']\n        self.assertEqual(list(result), [])\n\n    def test_principals_allowed_by_permission(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Allow\n        from pyramid.security import Deny\n        from pyramid.security import DENY_ALL\n        from pyramid.security import ALL_PERMISSIONS\n\n        helper = ACLHelper()\n        root = DummyContext(__name__='', __parent__=None)\n        community = DummyContext(__name__='community', __parent__=root)\n        blog = DummyContext(__name__='blog', __parent__=community)\n        root.__acl__ = [\n            (Allow, 'chrism', ('read', 'write')),\n            (Allow, 'other', ('read',)),\n            (Allow, 'jim', ALL_PERMISSIONS),\n        ]\n        community.__acl__ = [\n            (Deny, 'flooz', 'read'),\n            (Allow, 'flooz', 'read'),\n            (Allow, 'mork', 'read'),\n            (Deny, 'jim', 'read'),\n            (Allow, 'someguy', 'manage'),\n        ]\n        blog.__acl__ = [(Allow, 'fred', 'read'), DENY_ALL]\n\n        result = sorted(helper.principals_allowed_by_permission(blog, 'read'))\n        self.assertEqual(result, ['fred'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        self.assertEqual(result, ['chrism', 'mork', 'other'])\n        result = sorted(\n            helper.principals_allowed_by_permission(community, 'read')\n        )\n        result = sorted(helper.principals_allowed_by_permission(root, 'read'))\n        self.assertEqual(result, ['chrism', 'jim', 'other'])\n\n    def test_principals_allowed_by_permission_no_acls(self):\n        from pyramid.security import ACLHelper\n\n        helper = ACLHelper()\n        context = DummyContext()\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_not_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'write')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n    def test_principals_allowed_by_permission_deny_permission_in_acl(self):\n        from pyramid.security import ACLHelper\n        from pyramid.security import Deny\n        from pyramid.security import Everyone\n\n        helper = ACLHelper()\n        context = DummyContext()\n        acl = [(Deny, Everyone, 'read')]\n        context.__acl__ = acl\n        result = sorted(\n            helper.principals_allowed_by_permission(context, 'read')\n        )\n        self.assertEqual(result, [])\n\n\nVIEW = 'view'\nEDIT = 'edit'\nCREATE = 'create'\nDELETE = 'delete'\nMODERATE = 'moderate'\nADMINISTER = 'administer'\nCOMMENT = 'comment'\n\nGUEST_PERMS = (VIEW, COMMENT)\nMEMBER_PERMS = GUEST_PERMS + (EDIT, CREATE, DELETE)\nMODERATOR_PERMS = MEMBER_PERMS + (MODERATE,)\nADMINISTRATOR_PERMS = MODERATOR_PERMS + (ADMINISTER,)\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.security import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_identify(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.identify(request), 'fred')\n\n    def test_identify_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.identify(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.security import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.security import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.security import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.security import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass DummyAuthTktModule(object):\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\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 11 packages in 1.01s\nPrepared 1 package in 920ms\nInstalled 11 packages in 13ms\n + hupper==1.12.1\n + pastedeploy==3.1.0\n + plaster==1.1.2\n + plaster-pastedeploy==1.0.1\n + pyramid==2.0.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c)\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 20 packages in 21ms\nInstalled 9 packages in 10ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + nose==1.3.7\n + soupsieve==2.6\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 7ms\nInstalled 16 packages in 26ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + distlib==0.3.9\n + exceptiongroup==1.2.2\n + filelock==3.16.1\n + iniconfig==2.0.0\n + packaging==24.2\n + platformdirs==4.3.6\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 + virtualenv==20.29.0\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_47f8935bb5423718ec293bba4709307be7d2f51c\nconfigfile: pyproject.toml\ncollected 927 items\n\nr2e_tests/test_1.py .................................................... [  5%]\n........................................................................ [ 13%]\n                                                                         [ 13%]\nr2e_tests/test_config/test_actions.py .................................. [ 17%]\n............                                                             [ 18%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 20%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 24%]\n.....................................F.F................................ [ 32%]\n                                                                         [ 32%]\nr2e_tests/test_config/test_factories.py ..........F.F..F.F               [ 34%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF.F                        [ 35%]\nr2e_tests/test_config/test_init.py .............................F..F.... [ 39%]\n....F......F.......F...........F................F..F.FF...FFF...         [ 46%]\nr2e_tests/test_config/test_predicates.py .......................         [ 48%]\nr2e_tests/test_config/test_rendering.py ...                              [ 49%]\nr2e_tests/test_config/test_routes.py ............F................       [ 52%]\nr2e_tests/test_config/test_security.py ..............                    [ 53%]\nr2e_tests/test_config/test_settings.py ........................          [ 56%]\nr2e_tests/test_config/test_testing.py ....F.......                       [ 57%]\nr2e_tests/test_config/test_tweens.py F.........F..F...................   [ 61%]\nr2e_tests/test_config/test_views.py ..........F.........F............F.. [ 65%]\nF.........F....................F.....................F.................. [ 73%]\n...........................FF.....FFF................................... [ 80%]\n.............................................................F.......F.  [ 88%]\nr2e_tests/test_scripts/test_common.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 ...F.......FFFF.F.FF.F..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 ..........FFFF..FFFFFF.            [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    \n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'tests.test_config.test_adapters.DummyResourceURL',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:332: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x7c5911cf6f40>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7c5911cf6f40>)\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 0x7c5911cf6f40>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7c5911cf6f40>), <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(\n            intr.discriminator, ('resource url adapter', DummyIface)\n        )\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'tests.test_config.test_adapters.DummyIface'>\",\n        )\nE       AssertionError: \"reso[30 chars]iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[30 chars]iface <class '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 'tests.test_config.test_adapters.DummyIface'>\n\nr2e_tests/test_config/test_adapters.py:377: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'tests.test_config.test_adapters.DummyTraverser',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:286: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x7c5911d94070>\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 0x7c5911d94070>, <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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:131: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:157: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/foo.pt',\n            'tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:79: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:183: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:105: 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 tests.test_config\n    \n        provider = self._makeOne(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[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:359: 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 tests.test_config\n    \n        provider = self._makeOne(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[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:413: 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(\n            source.get_filename('test_assets.py'),\n            os.path.join(here, 'test_assets.py'),\n        )\nE       AssertionError: '/hom[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:825: 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(\n            source.get_filename(''), os.path.join(here, 'test_assets.py')\n        )\nE       AssertionError: '/hom[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:832: AssertionError\n____________ TestFactoriesMixin.test_set_request_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_request_factory_dottedname>\n\n    def test_set_request_factory_dottedname(self):\n        from pyramid.interfaces import IRequestFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_request_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IRequestFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_factories.py:26: AssertionError\n___________ TestFactoriesMixin.test_set_response_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_response_factory_dottedname>\n\n    def test_set_response_factory_dottedname(self):\n        from pyramid.interfaces import IResponseFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_response_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IResponseFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_factories.py:43: AssertionError\n_____________ TestFactoriesMixin.test_set_root_factory_dottedname ______________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_root_factory_dottedname>\n\n    def test_set_root_factory_dottedname(self):\n        from pyramid.interfaces import IRootFactory\n    \n        config = self._makeOne()\n        config.set_root_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(IRootFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(IRootFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_factories.py:77: AssertionError\n____________ TestFactoriesMixin.test_set_session_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_session_factory_dottedname>\n\n    def test_set_session_factory_dottedname(self):\n        from pyramid.interfaces import ISessionFactory\n    \n        config = self._makeOne()\n        config.set_session_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(ISessionFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ISessionFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_factories.py:99: 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    \n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:131: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:573: in wrapper\n    result = wrapped(self, *arg, **kw)\nsrc/pyramid/config/i18n.py:127: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\nsrc/pyramid/config/actions.py:95: 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(\n                    '\"%s\" is not a directory' % directory\n                )\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\nsrc/pyramid/config/i18n.py:103: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:68: 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    \n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[73 chars]293bba4709307be7d2f51c/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[73 chars]293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale',\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                      ++++\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:80: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:157: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale', '/home/gcpu[114 chars]le2'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 760 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_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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale3')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale3, locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale3', '/home/gcp[245 chars]le2'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale3'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:102: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale3', override=True\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2, locale3],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale', '/home/gcpu[245 chars]le3'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:117: 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    \n        config = self._makeOne()\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]3718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]3718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:145: 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    \n        config = self._makeOne(autocommit=True)\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]3718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]3718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:169: AssertionError\n_______ TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_set_locale_negotiator_dottedname>\n\n    def test_set_locale_negotiator_dottedname(self):\n        from pyramid.interfaces import ILocaleNegotiator\n    \n        config = self._makeOne(autocommit=True)\n        config.set_locale_negotiator('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(ILocaleNegotiator), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_i18n.py:43: 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    \n        config = Configurator()\n        this_pkg = sys.modules['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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:73: 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    \n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:198: 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        import tests\n        from tests import test_config\n    \n        config = self._makeOne(root_package=tests)\n        results = {}\n    \n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n    \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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:957: AssertionError\n_____________ ConfiguratorTests.test_include_with_python_callable ______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_with_python_callable>\n\n    def test_include_with_python_callable(self):\n        from tests import test_config\n    \n        config = self._makeOne()\n        config.include(dummy_include)\n        after = config.action_state\n        actions = after.actions\n        self.assertEqual(len(actions), 1)\n        action = actions[0]\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:870: 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 tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n    \n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1150: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:152: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\nsrc/pyramid/config/actions.py:293: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x7c5911d89700>, 'discriminat...5911d89af0>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.actions.ConflictResolverState object at 0x7c59120e9370>\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 = [\n                    'Actions were added to order={0} after execution had moved '\n                    'on to order={1}. Conflicting actions: '.format(\n                        order, state.min_order\n                    )\n                ]\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 (\n                        includepath[: len(basepath)] != basepath\n                        or includepath == basepath\n                    ):\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 (\n                        includepath[: len(basepath)] != basepath\n                        or includepath == basepath  # not a prefix\n                    ):\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 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\nsrc/pyramid/config/actions.py:484: 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 tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n    \n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n    \n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n    \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:1161: 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    \n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:586: AssertionError\n_________________ ConfiguratorTests.test_setup_registry_tweens _________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_tweens>\n\n    def test_setup_registry_tweens(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.registry import Registry\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        settings = {'pyramid.tweens': 'tests.test_config.dummy_tween_factory'}\n        config.setup_registry(settings=settings)\n        config.commit()\n        tweens = config.registry.getUtility(ITweens)\n>       self.assertEqual(\n            tweens.explicit,\n            [('tests.test_config.dummy_tween_factory', dummy_tween_factory)],\n        )\nE       AssertionError: Lists differ: [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7c5911fb0d30>)] != [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7c591241a040>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c5911fb0d30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c591241a040>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7c5911fb0d30>)]\nE       ?                                            ^^ ^^\nE       \nE       +   <function dummy_tween_factory at 0x7c591241a040>)]\nE       ?                                           ++ ^ ^\n\nr2e_tests/test_config/test_init.py:807: AssertionError\n__________________ ConfiguratorTests.test_with_package_module __________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_with_package_module>\n\n    def test_with_package_module(self):\n        from . import test_init\n    \n        config = self._makeOne()\n        newconfig = config.with_package(test_init)\n        import tests.test_config\n    \n>       self.assertEqual(newconfig.package, tests.test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:348: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_callable', 'tests.test_config.dummy_callable'\n        )\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1276: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_partial', 'tests.test_config.dummy_partial'\n        )\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1261: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1246: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive('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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1289: 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(\n            discriminator,\n            callable=None,\n            args=(),\n            kw=None,\n            order=0,\n            introspectables=(),\n            **extra\n        ):\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', 'testing', 'tests.test_config.test_init.DummyPredicate'\n        )\n\nr2e_tests/test_config/test_init.py:1366: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/predicates.py:49: in _add_predicate\n    self.action(\nr2e_tests/test_config/test_init.py:1363: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n_____ RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname ______\n\nself = <r2e_tests.test_config.test_routes.RoutesConfiguratorMixinTests testMethod=test_add_route_with_factory_dottedname>\n\n    def test_add_route_with_factory_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        config.add_route(\n            'name', 'path', factory='tests.test_config.dummyfactory'\n        )\n        route = self._assertRoute(config, 'name', 'path')\n>       self.assertEqual(route.factory, dummyfactory)\nE       AssertionError: <function dummyfactory at 0x7c5911def4c0> != <function dummyfactory at 0x7c591241a3a0>\n\nr2e_tests/test_config/test_routes.py:108: AssertionError\n_____ TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname _____\n\nself = <r2e_tests.test_config.test_testing.TestingConfiguratorMixinTests testMethod=test_testing_add_subscriber_dottedname>\n\n    def test_testing_add_subscriber_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        L = config.testing_add_subscriber('tests.test_config.IDummy')\n        event = DummyEvent()\n        config.registry.notify(event)\n>       self.assertEqual(len(L), 1)\nE       AssertionError: 0 != 1\n\nr2e_tests/test_config/test_testing.py:106: AssertionError\n____________ TestTweensConfiguratorMixin.test_add_tween_dottedname _____________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tween_dottedname>\n\n    def test_add_tween_dottedname(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n>       self.assertEqual(\n            tweens.implicit(),\n            [\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[73 chars]7c5911fb0d30>), ('pyramid.tweens.excview_tween[58 chars]40>)] != [('te[73 chars]7c591241a040>), ('pyramid.tweens.excview_tween[58 chars]40>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c5911fb0d30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c591241a040>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7c5911fb0d30>),\nE       ?                                            ^^ ^^\nE       \nE       +   <function dummy_tween_factory at 0x7c591241a040>),\nE       ?                                           ++ ^ ^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7c591267a940>)]\n\nr2e_tests/test_config/test_tweens.py:107: AssertionError\n__________ TestTweensConfiguratorMixin.test_add_tweens_names_distinct __________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_distinct>\n\n    def test_add_tweens_names_distinct(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        def factory1(handler, registry):  # pragma: no cover\n            return handler\n    \n        def factory2(handler, registry):  # pragma: no cover\n            return handler\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.add_tween('tests.test_config.dummy_tween_factory2')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[75 chars]7c5911fb0f70>), ('tests.test_config.dummy_twee[151 chars]40>)] != [('te[75 chars]7c591241a0d0>), ('tests.test_config.dummy_twee[151 chars]40>)]\nE       \nE       First differing element 0:\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7c5911fb0f70>)\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7c591241a0d0>)\nE       \nE         [('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7c5911fb0f70>),\nE       ?                                             ^^ ^^\nE       \nE       +   <function dummy_tween_factory2 at 0x7c591241a0d0>),\nE       ?                                            ++ ^ ^\nE       \nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7c5911fb0d30>),\nE       ?                                            ^^ ^^\nE       \nE       +   <function dummy_tween_factory at 0x7c591241a040>),\nE       ?                                           ++ ^ ^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7c591267a940>)]\n\nr2e_tests/test_config/test_tweens.py:32: AssertionError\n_______ TestTweensConfiguratorMixin.test_add_tweens_names_with_underover _______\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_with_underover>\n\n    def test_add_tweens_names_with_underover(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n        from pyramid.tweens import MAIN\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory', over=MAIN)\n        config.add_tween(\n            'tests.test_config.dummy_tween_factory2',\n            over=MAIN,\n            under='tests.test_config.dummy_tween_factory',\n        )\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('py[167 chars]7c5911fb0d30>), ('tests.test_config.dummy_twee[59 chars]70>)] != [('py[167 chars]7c591241a040>), ('tests.test_config.dummy_twee[59 chars]d0>)]\nE       \nE       First differing element 1:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c5911fb0d30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7c591241a040>)\nE       \nE         [('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7c591267a940>),\nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7c5911fb0d30>),\nE       ?                                            ^^ ^^\nE       \nE       +   <function dummy_tween_factory at 0x7c591241a040>),\nE       ?                                           ++ ^ ^\nE       \nE          ('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7c5911fb0f70>)]\nE       ?                                             ^^ ^^\nE       \nE       +   <function dummy_tween_factory2 at 0x7c591241a0d0>)]\nE       ?                                            ++ ^ ^\n\nr2e_tests/test_config/test_tweens.py:62: AssertionError\n____ TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_exception_view_with_view_defaults>\n\n    def test_add_exception_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_exception_view(\n            view=view, context=Exception, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(\n            config, exc_iface=implementedBy(Exception)\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2401: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c5911e7a970>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c5911df0430>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_forbidden_view_with_view_defaults>\n\n    def test_add_forbidden_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPForbidden\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_forbidden_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPForbidden),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2626: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c5912f6fe20>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c5911bf4460>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_notfound_view_with_view_defaults>\n\n    def test_add_notfound_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPNotFound\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_notfound_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPNotFound),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2790: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c59118b5760>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c59122ab820>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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    \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, [(config, 'static', 'tests.test_config:files', {})]\n        )\nE       AssertionError: Lists differ: [(<py[35 chars] 0x7c5912287d60>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[35 chars] 0x7c5912287d60>, 'static', 'tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[33 chars]t 0x7c5912287d60>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[33 chars]t 0x7c5912287d60>, 'static', 'tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x7c5912287d60>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?    ----\nE       \nE       +   'tests.test_config:files',\nE           {})]\n\nr2e_tests/test_config/test_views.py:2509: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_context_as_dottedname ________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_context_as_dottedname>\n\n    def test_add_view_context_as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            context='tests.test_config.IDummy',\n            view=view,\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[64 chars]7b80>\n\nr2e_tests/test_config/test_views.py:450: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_for__as_dottedname _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_for__as_dottedname>\n\n    def test_add_view_for__as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            for_='tests.test_config.IDummy', view=view, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[61 chars]6430>\n\nr2e_tests/test_config/test_views.py:461: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_containment_dottedname _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_containment_dottedname>\n\n    def test_add_view_with_containment_dottedname(self):\n        from pyramid.renderers import null_renderer\n        from zope.interface import directlyProvides\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view=view,\n            containment='tests.test_config.IDummy',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n>       self.assertEqual(wrapper(context, None), 'OK')\n\nr2e_tests/test_config/test_views.py:1861: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c5911b0fe80>\nrequest = None\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view <lambda> (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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 tests import test_config\n        from pyramid.interfaces import ISettings\n    \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    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1490: 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 tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1536: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_with_view_defaults _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults>\n\n    def test_add_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2166: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c5911d946a0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c5911ebba00>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_kwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_kwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view='tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2185: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c591179b9d0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c59115eeb20>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            'tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2204: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7c5911d92040>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7c591289f070>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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                'tests.test_config:path/', 'tests.test_config:other_path/'\n            )\n    \n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n    \n                return cb_\n    \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:3969: 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():  # pragma: no cover\n            pass\n    \n        result = self._callFUT(view)\n>       self.assertEqual(result, 'function tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?          ----\nE       + function tests.test_config.test_views.view\n\nr2e_tests/test_config/test_views.py:4173: AssertionError\n______________________ TestPRoutesCommand.test_class_view ______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_class_view>\n\n    def test_class_view(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=dummy.DummyView,\n            attr='view',\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',\n            '/a/b',\n            'tests.test_scripts.dummy.DummyView.view',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.DummyView.view'\nE       'tests.test_scripts.dummy.DummyView.view'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:247: 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):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, 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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:360: 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):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(route_name='foo', view=view1, renderer=nr)\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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:386: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:417: 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    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n    \n        registry.registerUtility(\n            IMyRoute, IRouteRequest, name='very_long_name_123'\n        )\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123', '/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            [\n                'very_long_name_123',\n                '/and_very_long_pattern_as_well',\n                'tests.test_scripts.test_proutes.view',\n            ],\n        )\nE       AssertionError: Lists differ: ['ver[32 chars]g_pattern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[32 chars]g_pattern_as_well', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       '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       +  'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:211: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'GET']\n\nr2e_tests/test_scripts/test_proutes.py:557: 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):  # pragma: no cover\n            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', view=view1, renderer=nr, 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',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '<route',\n            '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', 'tests.test_scripts.test_proutes.view1', '[16 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '<route', 'mismatch>']\nE       - ['foo',\nE       -  '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       -  '<route',\nE       -  'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:446: 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        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            [\n                '__static/',\n                '/static/*subpath',\n                'tests.test_scripts:static/',\n                '*',\n            ],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            [\n                '__pyramid_scaffold/',\n                '/pyramid_scaffold/*subpath',\n                'pyramid:scaffolds/starter/+package+/static/',\n                '*',\n            ],\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', 'tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                    ----\nE           \nE           + ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\n\nr2e_tests/test_scripts/test_proutes.py:484: AssertionError\n__________ TestPRoutesCommand.test_single_route_multiview_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_multiview_registered>\n\n    def test_single_route_multiview_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 IMultiView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        multiview1 = dummy.DummyMultiView(\n            view, context='context', view_name='a1'\n        )\n    \n        registry.registerAdapter(\n            multiview1, (IViewClassifier, IMyRoute, Interface), IMultiView, ''\n        )\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        view_module = 'tests.test_scripts.dummy'\n        view_str = '<tests.test_scripts.dummy.DummyMultiView'\n        final = '%s.%s' % (view_module, view_str)\n    \n>       self.assertEqual(compare_to, ['a', '/a', final])\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.dummy.<r2e_tests.t[29 chars]iew'] != ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scri[21 chars]iew']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView'\nE       'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView'\nE       \nE       - ['a',\nE       -  '/a',\nE       -  'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^                          ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^^^^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:323: 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    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\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, ['a', '/a', 'tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?              ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:172: 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):  # pragma: no cover\n            return 'view1'\n    \n        def view2(context, request):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:634: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:589: 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        loader = self.loader('/base/path.ini')\n        loader.settings = {\n            'pserve': {'watch_files': 'foo\\n/baz\\ntests.test_scripts:*.py'}\n        }\n        inst.pserve_file_config(loader, global_conf={'a': '1'})\n        self.assertEqual(loader.calls[0]['defaults'], {'a': '1'})\n>       self.assertEqual(\n            inst.watch_files,\n            set(\n                [\n                    os.path.abspath('/base/foo'),\n                    os.path.abspath('/baz'),\n                    os.path.abspath(os.path.join(here, '*.py')),\n                ]\n            ),\n        )\nE       AssertionError: Items in the first set but not the second:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_scripts/*.py'\nE       Items in the second set but not the first:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_scripts/*.py'\n\nr2e_tests/test_scripts/test_pserve.py:90: AssertionError\n____________ TestPViewsCommand.test_views_command_multi_view_nested ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multi_view_nested>\n\n    def test_views_command_multi_view_nested(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view1 = dummy.DummyView(context='context', view_name='a1')\n        view1.__name__ = 'view1'\n        view1.__view_attr__ = 'call'\n        multiview1 = dummy.DummyMultiView(\n            view1, context='context', view_name='a1'\n        )\n        multiview2 = dummy.DummyMultiView(\n            multiview1, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview2\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], '    tests.test_scripts.dummy.DummyMultiView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyMultiView' != '    tests.test_scripts.dummy.DummyMultiView'\nE       -     r2e_tests.test_scripts.dummy.DummyMultiView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyMultiView\n\nr2e_tests/test_scripts/test_pviews.py:481: AssertionError\n________________ TestPViewsCommand.test_views_command_multiview ________________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview>\n\n    def test_views_command_multiview(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:537: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_permission ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_permission>\n\n    def test_views_command_multiview_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__permission__ = 'test'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:561: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_predicates ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_predicates>\n\n    def test_views_command_multiview_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__predicates__ = [predicate]\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:591: 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    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def view():  # pragma: no cover\n            pass\n    \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], '    tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?     ----\nE       +     tests.test_scripts.test_pviews.view\n\nr2e_tests/test_scripts/test_pviews.py:384: AssertionError\n____________ TestPViewsCommand.test_views_command_single_view_route ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route>\n\n    def test_views_command_single_view_route(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        route = dummy.DummyRoute('a', '/a', matchdict={})\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\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[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n>       self.assertEqual(L[15], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:455: AssertionError\n_ TestPViewsCommand.test_views_command_single_view_route_with_route_predicates _\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route_with_route_predicates>\n\n    def test_views_command_single_view_route_with_route_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        route = dummy.DummyRoute('a', '/a', matchdict={}, predicate=predicate)\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\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[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n        self.assertEqual(L[12], '    route predicates (predicate = x)')\n>       self.assertEqual(L[16], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:514: AssertionError\n__________ TestPViewsCommand.test_views_command_single_view_traversal __________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal>\n\n    def test_views_command_single_view_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:362: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_permission __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_permission>\n\n    def test_views_command_single_view_traversal_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__permission__ = 'test'\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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:403: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_predicates __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_predicates>\n\n    def test_views_command_single_view_traversal_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__predicates__ = [predicate]\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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:428: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_contains_w_object\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_contains_w_string\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_miss\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_w_other_instances_of_class\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_w_self\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_iterable\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_singleton\nPASSED r2e_tests/test_1.py::TestAllowed::test_it\nPASSED r2e_tests/test_1.py::TestDenied::test_it\nPASSED r2e_tests/test_1.py::TestACLAllowed::test_it\nPASSED r2e_tests/test_1.py::TestACLDenied::test_it\nPASSED r2e_tests/test_1.py::TestPrincipalsAllowedByPermission::test_no_authorization_policy\nPASSED r2e_tests/test_1.py::TestPrincipalsAllowedByPermission::test_with_authorization_policy\nPASSED r2e_tests/test_1.py::TestRemember::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestRemember::test_with_missing_arg\nPASSED r2e_tests/test_1.py::TestRemember::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestForget::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestForget::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_no_permission\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_no_view_registered\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_with_permission\nPASSED r2e_tests/test_1.py::TestIdentity::test_identity\nPASSED r2e_tests/test_1.py::TestIdentity::test_identity_no_security_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestHasPermission::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_no_context_passed\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_no_context_passed_or_on_request\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_security_registered\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_identity\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_permits\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestACLHelper::test_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_callable_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_no_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_callable_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_deny_not_permission_in_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_deny_permission_in_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_direct\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_no_acls\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_string_permission\nPASSED r2e_tests/test_1.py::TestACLHelper::test_string_permissions_in_acl\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify_none\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify_with_prefix\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_1.py::TestBadTicket::test_it\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout_aged\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_None_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nondefault_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_nondefault\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test___str__\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_class_conforms\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_ctor\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_instance_conforms\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_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_execution_policy\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy_to_None\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_response_factory\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_session_factory\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_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_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_context_manager\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_security_policy\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_threadlocals_active\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_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_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_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::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_close_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_default_specificities\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_inherit_type_prefs\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_order\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_specific_type_order\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_accept_list\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_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_inherit_errors\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_root_slash_with_route_prefix\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_route_prefix_with_inherit_slash\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_wildcard_accept_raises\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_authentication_policy_with_security_policy\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_security.py::ConfiguratorSecurityMethodsTests::test_set_security_policy\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_does_not_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::TestSettingsConfiguratorMixin::test_settings_parameter_dict_is_never_updated\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_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_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_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::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_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_override\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_type_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_wildcard\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_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_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_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_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_does_not_accept_iterable_accept\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_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_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_wildcard_accept_raises\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_default_accept_view_order\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_config/test_views.py::Test_viewdefaults::test_dunder_attrs_copied\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_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_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_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_file_finds_open_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_guess_server_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_original_ignore_files\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_reload_call_hupper_with_correct_args\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_command_setup_generator\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_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::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_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\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_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\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_include_with_python_callable\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::ConfiguratorTests::test_setup_registry_tweens\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\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_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nFAILED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\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_context_as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\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::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\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_class_view\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_multiview_registered\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_multi_view_nested\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\n======================== 81 failed, 846 passed in 6.64s ========================\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_47f8935bb5423718ec293bba4709307be7d2f51c\nconfigfile: pyproject.toml\ncollected 927 items\n\nr2e_tests/test_1.py ..........................F......................... [  5%]\n........................................................................ [ 13%]\n                                                                         [ 13%]\nr2e_tests/test_config/test_actions.py .................................. [ 17%]\n............                                                             [ 18%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 20%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 24%]\n.....................................F.F................................ [ 32%]\n                                                                         [ 32%]\nr2e_tests/test_config/test_factories.py ..........F.F..F.F               [ 34%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF.F                        [ 35%]\nr2e_tests/test_config/test_init.py .............................F..F.... [ 39%]\n....F......F.......F...........F................F..F.FF...FFF...         [ 46%]\nr2e_tests/test_config/test_predicates.py .......................         [ 48%]\nr2e_tests/test_config/test_rendering.py ...                              [ 49%]\nr2e_tests/test_config/test_routes.py ............F................       [ 52%]\nr2e_tests/test_config/test_security.py ..............                    [ 53%]\nr2e_tests/test_config/test_settings.py ........................          [ 56%]\nr2e_tests/test_config/test_testing.py ....F.......                       [ 57%]\nr2e_tests/test_config/test_tweens.py F.........F..F...................   [ 61%]\nr2e_tests/test_config/test_views.py ..........F.........F............F.. [ 65%]\nF.........F....................F.....................F.................. [ 73%]\n...........................FF.....FFF................................... [ 80%]\n.............................................................F.......F.  [ 88%]\nr2e_tests/test_scripts/test_common.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 ...F.......FFFF.F.FF.F..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 ..........FFFF..FFFFFF.            [100%]\n\n=================================== FAILURES ===================================\n______________ TestAuthenticatedUserId.test_with_security_policy _______________\n\nself = <r2e_tests.test_1.TestAuthenticatedUserId testMethod=test_with_security_policy>\n\n    def test_with_security_policy(self):\n        request = _makeRequest()\n        # Ensure the identity is stringified.\n        _registerSecurityPolicy(request.registry, 123)\n>       self.assertEqual(request.authenticated_userid, '123')\nE       AssertionError: 123 != '123'\n\nr2e_tests/test_1.py:362: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'tests.test_config.test_adapters.DummyResourceURL',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:332: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x7929b32a7460>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7929b32a7460>)\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 0x7929b32a7460>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7929b32a7460>), <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(\n            intr.discriminator, ('resource url adapter', DummyIface)\n        )\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'tests.test_config.test_adapters.DummyIface'>\",\n        )\nE       AssertionError: \"reso[30 chars]iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[30 chars]iface <class '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 'tests.test_config.test_adapters.DummyIface'>\n\nr2e_tests/test_config/test_adapters.py:377: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'tests.test_config.test_adapters.DummyTraverser',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:286: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x7929b3227730>\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 0x7929b3227730>, <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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:131: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:157: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/foo.pt',\n            'tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:79: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:183: 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    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \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(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]f51c/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:105: 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 tests.test_config\n    \n        provider = self._makeOne(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[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:359: 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 tests.test_config\n    \n        provider = self._makeOne(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[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:413: 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(\n            source.get_filename('test_assets.py'),\n            os.path.join(here, 'test_assets.py'),\n        )\nE       AssertionError: '/hom[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:825: 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(\n            source.get_filename(''), os.path.join(here, 'test_assets.py')\n        )\nE       AssertionError: '/hom[69 chars]8ec293bba4709307be7d2f51c/tests/test_config/test_assets.py' != '/hom[69 chars]8ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:832: AssertionError\n____________ TestFactoriesMixin.test_set_request_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_request_factory_dottedname>\n\n    def test_set_request_factory_dottedname(self):\n        from pyramid.interfaces import IRequestFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_request_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IRequestFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_factories.py:26: AssertionError\n___________ TestFactoriesMixin.test_set_response_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_response_factory_dottedname>\n\n    def test_set_response_factory_dottedname(self):\n        from pyramid.interfaces import IResponseFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_response_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IResponseFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_factories.py:43: AssertionError\n_____________ TestFactoriesMixin.test_set_root_factory_dottedname ______________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_root_factory_dottedname>\n\n    def test_set_root_factory_dottedname(self):\n        from pyramid.interfaces import IRootFactory\n    \n        config = self._makeOne()\n        config.set_root_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(IRootFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(IRootFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_factories.py:77: AssertionError\n____________ TestFactoriesMixin.test_set_session_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_session_factory_dottedname>\n\n    def test_set_session_factory_dottedname(self):\n        from pyramid.interfaces import ISessionFactory\n    \n        config = self._makeOne()\n        config.set_session_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(ISessionFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ISessionFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_factories.py:99: 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    \n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:131: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:573: in wrapper\n    result = wrapped(self, *arg, **kw)\nsrc/pyramid/config/i18n.py:127: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\nsrc/pyramid/config/actions.py:95: 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(\n                    '\"%s\" is not a directory' % directory\n                )\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\nsrc/pyramid/config/i18n.py:103: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:68: 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    \n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[73 chars]293bba4709307be7d2f51c/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[73 chars]293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale',\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                      ++++\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:80: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:157: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale', '/home/gcpu[114 chars]le2'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 760 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_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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale3')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale3, locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale3', '/home/gcp[245 chars]le2'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale3'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:102: 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    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale3', override=True\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2, locale3],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]f51c/tests/pkgs/localeapp/locale', '/home/gcpu[245 chars]le3'] != ['/ho[91 chars]f51c/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:117: 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    \n        config = self._makeOne()\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]3718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]3718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:145: 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    \n        config = self._makeOne(autocommit=True)\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]3718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]3718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]23718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:169: AssertionError\n_______ TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_set_locale_negotiator_dottedname>\n\n    def test_set_locale_negotiator_dottedname(self):\n        from pyramid.interfaces import ILocaleNegotiator\n    \n        config = self._makeOne(autocommit=True)\n        config.set_locale_negotiator('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(ILocaleNegotiator), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_i18n.py:43: 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    \n        config = Configurator()\n        this_pkg = sys.modules['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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:73: 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    \n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:198: 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        import tests\n        from tests import test_config\n    \n        config = self._makeOne(root_package=tests)\n        results = {}\n    \n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n    \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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:957: AssertionError\n_____________ ConfiguratorTests.test_include_with_python_callable ______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_with_python_callable>\n\n    def test_include_with_python_callable(self):\n        from tests import test_config\n    \n        config = self._makeOne()\n        config.include(dummy_include)\n        after = config.action_state\n        actions = after.actions\n        self.assertEqual(len(actions), 1)\n        action = actions[0]\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:870: 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 tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n    \n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1150: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:152: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\nsrc/pyramid/config/actions.py:293: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x7929b2beca60>, 'discriminat...29b2a35700>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.actions.ConflictResolverState object at 0x7929b2a5b220>\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 = [\n                    'Actions were added to order={0} after execution had moved '\n                    'on to order={1}. Conflicting actions: '.format(\n                        order, state.min_order\n                    )\n                ]\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 (\n                        includepath[: len(basepath)] != basepath\n                        or includepath == basepath\n                    ):\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 (\n                        includepath[: len(basepath)] != basepath\n                        or includepath == basepath  # not a prefix\n                    ):\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 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 5 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\nsrc/pyramid/config/actions.py:484: 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 tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n    \n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n    \n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n    \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:1161: 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    \n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:586: AssertionError\n_________________ ConfiguratorTests.test_setup_registry_tweens _________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_tweens>\n\n    def test_setup_registry_tweens(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.registry import Registry\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        settings = {'pyramid.tweens': 'tests.test_config.dummy_tween_factory'}\n        config.setup_registry(settings=settings)\n        config.commit()\n        tweens = config.registry.getUtility(ITweens)\n>       self.assertEqual(\n            tweens.explicit,\n            [('tests.test_config.dummy_tween_factory', dummy_tween_factory)],\n        )\nE       AssertionError: Lists differ: [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7929b2deed30>)] != [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7929b3560a60>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b2deed30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b3560a60>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7929b2deed30>)]\nE       ?                                           -----\nE       \nE       +   <function dummy_tween_factory at 0x7929b3560a60>)]\nE       ?                                            +++++\n\nr2e_tests/test_config/test_init.py:807: AssertionError\n__________________ ConfiguratorTests.test_with_package_module __________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_with_package_module>\n\n    def test_with_package_module(self):\n        from . import test_init\n    \n        config = self._makeOne()\n        newconfig = config.with_package(test_init)\n        import tests.test_config\n    \n>       self.assertEqual(newconfig.package, tests.test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:348: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_callable', 'tests.test_config.dummy_callable'\n        )\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1276: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_partial', 'tests.test_config.dummy_partial'\n        )\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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1261: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1246: 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 tests import test_config\n    \n        config = self.config\n        config.add_directive('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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1289: 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(\n            discriminator,\n            callable=None,\n            args=(),\n            kw=None,\n            order=0,\n            introspectables=(),\n            **extra\n        ):\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', 'testing', 'tests.test_config.test_init.DummyPredicate'\n        )\n\nr2e_tests/test_config/test_init.py:1366: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/predicates.py:49: in _add_predicate\n    self.action(\nr2e_tests/test_config/test_init.py:1363: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n_____ RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname ______\n\nself = <r2e_tests.test_config.test_routes.RoutesConfiguratorMixinTests testMethod=test_add_route_with_factory_dottedname>\n\n    def test_add_route_with_factory_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        config.add_route(\n            'name', 'path', factory='tests.test_config.dummyfactory'\n        )\n        route = self._assertRoute(config, 'name', 'path')\n>       self.assertEqual(route.factory, dummyfactory)\nE       AssertionError: <function dummyfactory at 0x7929b2c55700> != <function dummyfactory at 0x7929b3560dc0>\n\nr2e_tests/test_config/test_routes.py:108: AssertionError\n_____ TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname _____\n\nself = <r2e_tests.test_config.test_testing.TestingConfiguratorMixinTests testMethod=test_testing_add_subscriber_dottedname>\n\n    def test_testing_add_subscriber_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        L = config.testing_add_subscriber('tests.test_config.IDummy')\n        event = DummyEvent()\n        config.registry.notify(event)\n>       self.assertEqual(len(L), 1)\nE       AssertionError: 0 != 1\n\nr2e_tests/test_config/test_testing.py:106: AssertionError\n____________ TestTweensConfiguratorMixin.test_add_tween_dottedname _____________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tween_dottedname>\n\n    def test_add_tween_dottedname(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n>       self.assertEqual(\n            tweens.implicit(),\n            [\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[73 chars]7929b2deed30>), ('pyramid.tweens.excview_tween[58 chars]30>)] != [('te[73 chars]7929b3560a60>), ('pyramid.tweens.excview_tween[58 chars]30>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b2deed30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b3560a60>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7929b2deed30>),\nE       ?                                           -----\nE       \nE       +   <function dummy_tween_factory at 0x7929b3560a60>),\nE       ?                                            +++++\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7929b405d430>)]\n\nr2e_tests/test_config/test_tweens.py:107: AssertionError\n__________ TestTweensConfiguratorMixin.test_add_tweens_names_distinct __________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_distinct>\n\n    def test_add_tweens_names_distinct(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        def factory1(handler, registry):  # pragma: no cover\n            return handler\n    \n        def factory2(handler, registry):  # pragma: no cover\n            return handler\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.add_tween('tests.test_config.dummy_tween_factory2')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[75 chars]7929b2deef70>), ('tests.test_config.dummy_twee[151 chars]30>)] != [('te[75 chars]7929b3560af0>), ('tests.test_config.dummy_twee[151 chars]30>)]\nE       \nE       First differing element 0:\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7929b2deef70>)\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7929b3560af0>)\nE       \nE         [('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7929b2deef70>),\nE       ?                                            ^^^^ -\nE       \nE       +   <function dummy_tween_factory2 at 0x7929b3560af0>),\nE       ?                                            ^^^^^\nE       \nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7929b2deed30>),\nE       ?                                           -----\nE       \nE       +   <function dummy_tween_factory at 0x7929b3560a60>),\nE       ?                                            +++++\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7929b405d430>)]\n\nr2e_tests/test_config/test_tweens.py:32: AssertionError\n_______ TestTweensConfiguratorMixin.test_add_tweens_names_with_underover _______\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_with_underover>\n\n    def test_add_tweens_names_with_underover(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n        from pyramid.tweens import MAIN\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory', over=MAIN)\n        config.add_tween(\n            'tests.test_config.dummy_tween_factory2',\n            over=MAIN,\n            under='tests.test_config.dummy_tween_factory',\n        )\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('py[167 chars]7929b2deed30>), ('tests.test_config.dummy_twee[59 chars]70>)] != [('py[167 chars]7929b3560a60>), ('tests.test_config.dummy_twee[59 chars]f0>)]\nE       \nE       First differing element 1:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b2deed30>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7929b3560a60>)\nE       \nE         [('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7929b405d430>),\nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7929b2deed30>),\nE       ?                                           -----\nE       \nE       +   <function dummy_tween_factory at 0x7929b3560a60>),\nE       ?                                            +++++\nE       \nE          ('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7929b2deef70>)]\nE       ?                                            ^^^^ -\nE       \nE       +   <function dummy_tween_factory2 at 0x7929b3560af0>)]\nE       ?                                            ^^^^^\n\nr2e_tests/test_config/test_tweens.py:62: AssertionError\n____ TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_exception_view_with_view_defaults>\n\n    def test_add_exception_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_exception_view(\n            view=view, context=Exception, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(\n            config, exc_iface=implementedBy(Exception)\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2401: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2ab4490>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b2aae190>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_forbidden_view_with_view_defaults>\n\n    def test_add_forbidden_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPForbidden\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_forbidden_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPForbidden),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2626: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2aae5e0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b402fbb0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_notfound_view_with_view_defaults>\n\n    def test_add_notfound_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPNotFound\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_notfound_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPNotFound),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2790: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2a93c40>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b2a49b50>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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    \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, [(config, 'static', 'tests.test_config:files', {})]\n        )\nE       AssertionError: Lists differ: [(<py[35 chars] 0x7929b2be9a60>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[35 chars] 0x7929b2be9a60>, 'static', 'tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[33 chars]t 0x7929b2be9a60>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[33 chars]t 0x7929b2be9a60>, 'static', 'tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x7929b2be9a60>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?    ----\nE       \nE       +   'tests.test_config:files',\nE           {})]\n\nr2e_tests/test_config/test_views.py:2509: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_context_as_dottedname ________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_context_as_dottedname>\n\n    def test_add_view_context_as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            context='tests.test_config.IDummy',\n            view=view,\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[64 chars]8160>\n\nr2e_tests/test_config/test_views.py:450: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_for__as_dottedname _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_for__as_dottedname>\n\n    def test_add_view_for__as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            for_='tests.test_config.IDummy', view=view, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[61 chars]8ca0>\n\nr2e_tests/test_config/test_views.py:461: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_containment_dottedname _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_containment_dottedname>\n\n    def test_add_view_with_containment_dottedname(self):\n        from pyramid.renderers import null_renderer\n        from zope.interface import directlyProvides\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view=view,\n            containment='tests.test_config.IDummy',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n>       self.assertEqual(wrapper(context, None), 'OK')\n\nr2e_tests/test_config/test_views.py:1861: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2a68820>\nrequest = None\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view <lambda> (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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 tests import test_config\n        from pyramid.interfaces import ISettings\n    \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    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1490: 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 tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = '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 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1536: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_with_view_defaults _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults>\n\n    def test_add_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        class view(object):\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2166: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2be98e0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b2d7a760>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_kwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_kwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view='tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2185: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2d0dc10>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b3284700>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            'tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2204: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:184: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7929b2e3dd90>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7929b2cdffa0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:206: PredicateMismatch\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                'tests.test_config:path/', 'tests.test_config:other_path/'\n            )\n    \n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n    \n                return cb_\n    \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:3969: 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():  # pragma: no cover\n            pass\n    \n        result = self._callFUT(view)\n>       self.assertEqual(result, 'function tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?          ----\nE       + function tests.test_config.test_views.view\n\nr2e_tests/test_config/test_views.py:4173: AssertionError\n______________________ TestPRoutesCommand.test_class_view ______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_class_view>\n\n    def test_class_view(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=dummy.DummyView,\n            attr='view',\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',\n            '/a/b',\n            'tests.test_scripts.dummy.DummyView.view',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.DummyView.view'\nE       'tests.test_scripts.dummy.DummyView.view'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:247: 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):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, 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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:360: 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):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(route_name='foo', view=view1, renderer=nr)\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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:386: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:417: 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    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n    \n        registry.registerUtility(\n            IMyRoute, IRouteRequest, name='very_long_name_123'\n        )\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123', '/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            [\n                'very_long_name_123',\n                '/and_very_long_pattern_as_well',\n                'tests.test_scripts.test_proutes.view',\n            ],\n        )\nE       AssertionError: Lists differ: ['ver[32 chars]g_pattern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[32 chars]g_pattern_as_well', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       '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       +  'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:211: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', 'GET']\n\nr2e_tests/test_scripts/test_proutes.py:557: 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):  # pragma: no cover\n            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', view=view1, renderer=nr, 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',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '<route',\n            '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', 'tests.test_scripts.test_proutes.view1', '[16 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '<route', 'mismatch>']\nE       - ['foo',\nE       -  '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       -  '<route',\nE       -  'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:446: 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        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            [\n                '__static/',\n                '/static/*subpath',\n                'tests.test_scripts:static/',\n                '*',\n            ],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            [\n                '__pyramid_scaffold/',\n                '/pyramid_scaffold/*subpath',\n                'pyramid:scaffolds/starter/+package+/static/',\n                '*',\n            ],\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', 'tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                    ----\nE           \nE           + ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\n\nr2e_tests/test_scripts/test_proutes.py:484: AssertionError\n__________ TestPRoutesCommand.test_single_route_multiview_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_multiview_registered>\n\n    def test_single_route_multiview_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 IMultiView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        multiview1 = dummy.DummyMultiView(\n            view, context='context', view_name='a1'\n        )\n    \n        registry.registerAdapter(\n            multiview1, (IViewClassifier, IMyRoute, Interface), IMultiView, ''\n        )\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        view_module = 'tests.test_scripts.dummy'\n        view_str = '<tests.test_scripts.dummy.DummyMultiView'\n        final = '%s.%s' % (view_module, view_str)\n    \n>       self.assertEqual(compare_to, ['a', '/a', final])\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.dummy.<r2e_tests.t[29 chars]iew'] != ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scri[21 chars]iew']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView'\nE       'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView'\nE       \nE       - ['a',\nE       -  '/a',\nE       -  'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^                          ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^^^^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:323: 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    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\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, ['a', '/a', 'tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?              ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:172: 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):  # pragma: no cover\n            return 'view1'\n    \n        def view2(context, request):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:634: 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):  # pragma: no cover\n            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',\n            '/a/b',\n            '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       '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', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:589: 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        loader = self.loader('/base/path.ini')\n        loader.settings = {\n            'pserve': {'watch_files': 'foo\\n/baz\\ntests.test_scripts:*.py'}\n        }\n        inst.pserve_file_config(loader, global_conf={'a': '1'})\n        self.assertEqual(loader.calls[0]['defaults'], {'a': '1'})\n>       self.assertEqual(\n            inst.watch_files,\n            set(\n                [\n                    os.path.abspath('/base/foo'),\n                    os.path.abspath('/baz'),\n                    os.path.abspath(os.path.join(here, '*.py')),\n                ]\n            ),\n        )\nE       AssertionError: Items in the first set but not the second:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/tests/test_scripts/*.py'\nE       Items in the second set but not the first:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_47f8935bb5423718ec293bba4709307be7d2f51c/r2e_tests/test_scripts/*.py'\n\nr2e_tests/test_scripts/test_pserve.py:90: AssertionError\n____________ TestPViewsCommand.test_views_command_multi_view_nested ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multi_view_nested>\n\n    def test_views_command_multi_view_nested(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view1 = dummy.DummyView(context='context', view_name='a1')\n        view1.__name__ = 'view1'\n        view1.__view_attr__ = 'call'\n        multiview1 = dummy.DummyMultiView(\n            view1, context='context', view_name='a1'\n        )\n        multiview2 = dummy.DummyMultiView(\n            multiview1, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview2\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], '    tests.test_scripts.dummy.DummyMultiView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyMultiView' != '    tests.test_scripts.dummy.DummyMultiView'\nE       -     r2e_tests.test_scripts.dummy.DummyMultiView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyMultiView\n\nr2e_tests/test_scripts/test_pviews.py:481: AssertionError\n________________ TestPViewsCommand.test_views_command_multiview ________________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview>\n\n    def test_views_command_multiview(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:537: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_permission ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_permission>\n\n    def test_views_command_multiview_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__permission__ = 'test'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:561: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_predicates ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_predicates>\n\n    def test_views_command_multiview_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__predicates__ = [predicate]\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\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], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:591: 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    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def view():  # pragma: no cover\n            pass\n    \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], '    tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?     ----\nE       +     tests.test_scripts.test_pviews.view\n\nr2e_tests/test_scripts/test_pviews.py:384: AssertionError\n____________ TestPViewsCommand.test_views_command_single_view_route ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route>\n\n    def test_views_command_single_view_route(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        route = dummy.DummyRoute('a', '/a', matchdict={})\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\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[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n>       self.assertEqual(L[15], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:455: AssertionError\n_ TestPViewsCommand.test_views_command_single_view_route_with_route_predicates _\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route_with_route_predicates>\n\n    def test_views_command_single_view_route_with_route_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        route = dummy.DummyRoute('a', '/a', matchdict={}, predicate=predicate)\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\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[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n        self.assertEqual(L[12], '    route predicates (predicate = x)')\n>       self.assertEqual(L[16], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:514: AssertionError\n__________ TestPViewsCommand.test_views_command_single_view_traversal __________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal>\n\n    def test_views_command_single_view_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:362: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_permission __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_permission>\n\n    def test_views_command_single_view_traversal_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__permission__ = 'test'\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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:403: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_predicates __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_predicates>\n\n    def test_views_command_single_view_traversal_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__predicates__ = [predicate]\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], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:428: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_contains_w_object\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_contains_w_string\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_miss\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_w_other_instances_of_class\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_equality_w_self\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_iterable\nPASSED r2e_tests/test_1.py::TestAllPermissionsList::test_singleton\nPASSED r2e_tests/test_1.py::TestAllowed::test_it\nPASSED r2e_tests/test_1.py::TestDenied::test_it\nPASSED r2e_tests/test_1.py::TestACLAllowed::test_it\nPASSED r2e_tests/test_1.py::TestACLDenied::test_it\nPASSED r2e_tests/test_1.py::TestPrincipalsAllowedByPermission::test_no_authorization_policy\nPASSED r2e_tests/test_1.py::TestPrincipalsAllowedByPermission::test_with_authorization_policy\nPASSED r2e_tests/test_1.py::TestRemember::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestRemember::test_with_missing_arg\nPASSED r2e_tests/test_1.py::TestRemember::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestForget::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestForget::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_no_permission\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_no_view_registered\nPASSED r2e_tests/test_1.py::TestViewExecutionPermitted::test_with_permission\nPASSED r2e_tests/test_1.py::TestIdentity::test_identity\nPASSED r2e_tests/test_1.py::TestIdentity::test_identity_no_security_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestUnAuthenticatedUserId::test_with_security_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_no_authentication_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_with_authentication_policy\nPASSED r2e_tests/test_1.py::TestEffectivePrincipals::test_with_authentication_policy_no_reg_on_request\nPASSED r2e_tests/test_1.py::TestHasPermission::test_no_security_policy\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_no_context_passed\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_no_context_passed_or_on_request\nPASSED r2e_tests/test_1.py::TestHasPermission::test_with_security_registered\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_identity\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_permits\nPASSED r2e_tests/test_1.py::TestLegacySecurityPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestACLHelper::test_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_callable_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_no_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_callable_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_deny_not_permission_in_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_deny_permission_in_acl\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_direct\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_no_acls\nPASSED r2e_tests/test_1.py::TestACLHelper::test_principals_allowed_by_permission_string_permission\nPASSED r2e_tests/test_1.py::TestACLHelper::test_string_permissions_in_acl\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify_none\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_identify_with_prefix\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_1.py::TestBadTicket::test_it\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout_aged\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_None_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nondefault_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_nondefault\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test___str__\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_class_conforms\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_ctor\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_instance_conforms\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_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_execution_policy\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy_to_None\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_response_factory\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_session_factory\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_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_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_context_manager\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_security_policy\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_threadlocals_active\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_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_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_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::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_close_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_default_specificities\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_inherit_type_prefs\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_order\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_specific_type_order\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_accept_list\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_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_inherit_errors\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_root_slash_with_route_prefix\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_route_prefix_with_inherit_slash\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_wildcard_accept_raises\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_authentication_policy_with_security_policy\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_security.py::ConfiguratorSecurityMethodsTests::test_set_security_policy\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_does_not_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::TestSettingsConfiguratorMixin::test_settings_parameter_dict_is_never_updated\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_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_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_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::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_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_override\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_type_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_wildcard\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_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_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_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_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_does_not_accept_iterable_accept\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_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_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_wildcard_accept_raises\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_default_accept_view_order\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_config/test_views.py::Test_viewdefaults::test_dunder_attrs_copied\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_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_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_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_file_finds_open_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_guess_server_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_original_ignore_files\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_reload_call_hupper_with_correct_args\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_command_setup_generator\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_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::Test_main::test_it\nFAILED r2e_tests/test_1.py::TestAuthenticatedUserId::test_with_security_policy\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_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\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_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\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_include_with_python_callable\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::ConfiguratorTests::test_setup_registry_tweens\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\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_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nFAILED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\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_context_as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\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::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\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_class_view\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_multiview_registered\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_multi_view_nested\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\n======================== 82 failed, 845 passed in 5.67s ========================\n",
    "old_commit_res_stderr": ""
}
src/pyramid/security.py tests/test_security.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]

**Title:** `authenticated_userid` Returns Non-String Type Causing Assertion Failure

**Description:**
When a legacy security policy is used, the `authenticated_userid` method returns an integer instead of a string. This leads to assertion failures in tests that expect the user ID to be a string.

**Example Code:**
```python
def test_with_security_policy(self):
    request = _makeRequest()
    _registerSecurityPolicy(request.registry, 123)
    self.assertEqual(request.authenticated_userid, '123')
```

**Expected Behavior:**
The `authenticated_userid` should consistently return a string representation of the user ID, ensuring compatibility and preventing type-related issues.

**Actual Behavior:**
When the security policy is registered with an integer (e.g., `123`), the `authenticated_userid` returns an integer (`123`) instead of a string (`'123'`), causing the assertion to fail.

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

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

--- BEGIN FILE ---
```
### src/pyramid/security.py
from codecs import utf_8_decode
from codecs import utf_8_encode
import hashlib
import base64
import time as time_mod
from urllib.parse import quote, unquote
import warnings
import re

from webob.cookies import CookieProfile

from zope.interface import implementer, providedBy

from pyramid.interfaces import (
    ISecurityPolicy,
    IAuthenticationPolicy,
    IAuthorizationPolicy,
    ISecuredView,
    IView,
    IViewClassifier,
)

from pyramid.location import lineage

from pyramid.util import is_nonstr_iter, strings_differ, bytes_, ascii_, text_

from pyramid.util import SimpleSerializer

from pyramid.threadlocal import get_current_registry

VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$")

Everyone = 'system.Everyone'
Authenticated = 'system.Authenticated'
Allow = 'Allow'
Deny = 'Deny'


class AllPermissionsList(object):
    """ Stand in 'permission list' to represent all permissions """

    def __iter__(self):
        return iter(())

    def __contains__(self, other):
        return True

    def __eq__(self, other):
        return isinstance(other, self.__class__)


ALL_PERMISSIONS = AllPermissionsList()
DENY_ALL = (Deny, Everyone, ALL_PERMISSIONS)

NO_PERMISSION_REQUIRED = '__no_permission_required__'


def _get_security_policy(request):
    return request.registry.queryUtility(ISecurityPolicy)


def _get_authentication_policy(request):
    return request.registry.queryUtility(IAuthenticationPolicy)


def remember(request, userid, **kw):
    """
    Returns a sequence of header tuples (e.g. ``[('Set-Cookie', 'foo=abc')]``)
    on this request's response.
    These headers are suitable for 'remembering' a set of credentials
    implied by the data passed as ``userid`` and ``*kw`` using the
    current :term:`security policy`.  Common usage might look
    like so within the body of a view function (``response`` is
    assumed to be a :term:`WebOb` -style :term:`response` object
    computed previously by the view code):

    .. code-block:: python

       from pyramid.security import remember
       headers = remember(request, 'chrism', password='123', max_age='86400')
       response = request.response
       response.headerlist.extend(headers)
       return response

    If no :term:`security policy` is in use, this function will
    always return an empty sequence. If used, the composition and
    meaning of ``**kw`` must be agreed upon by the calling code and
    the effective security policy.

    .. versionchanged:: 1.6
        Deprecated the ``principal`` argument in favor of ``userid`` to clarify
        its relationship to the authentication policy.

    .. versionchanged:: 1.10
        Removed the deprecated ``principal`` argument.
    """
    policy = _get_security_policy(request)
    if policy is None:
        return []
    return policy.remember(request, userid, **kw)


def forget(request):
    """
    Return a sequence of header tuples (e.g. ``[('Set-Cookie',
    'foo=abc')]``) suitable for 'forgetting' the set of credentials
    possessed by the currently authenticated user.  A common usage
    might look like so within the body of a view function
    (``response`` is assumed to be an :term:`WebOb` -style
    :term:`response` object computed previously by the view code):

    .. code-block:: python

       from pyramid.security import forget
       headers = forget(request)
       response.headerlist.extend(headers)
       return response

    If no :term:`security policy` is in use, this function will
    always return an empty sequence.
    """
    policy = _get_security_policy(request)
    if policy is None:
        return []
    return policy.forget(request)


def principals_allowed_by_permission(context, permission):
    """ Provided a ``context`` (a resource object), and a ``permission``
    string, if an :term:`authorization policy` is
    in effect, return a sequence of :term:`principal` ids that possess
    the permission in the ``context``.  If no authorization policy is
    in effect, this will return a sequence with the single value
    :mod:`pyramid.security.Everyone` (the special principal
    identifier representing all principals).

    .. note::

       Even if an :term:`authorization policy` is in effect,
       some (exotic) authorization policies may not implement the
       required machinery for this function; those will cause a
       :exc:`NotImplementedError` exception to be raised when this
       function is invoked.

    """
    reg = get_current_registry()
    policy = reg.queryUtility(IAuthorizationPolicy)
    if policy is None:
        return [Everyone]
    return policy.principals_allowed_by_permission(context, permission)


def view_execution_permitted(context, request, name=''):
    """ If the view specified by ``context`` and ``name`` is protected
    by a :term:`permission`, check the permission associated with the
    view using the effective authentication/authorization policies and
    the ``request``.  Return a boolean result.  If no
    :term:`authorization policy` is in effect, or if the view is not
    protected by a permission, return ``True``. If no view can view found,
    an exception will be raised.

    .. versionchanged:: 1.4a4
       An exception is raised if no view is found.

    """
    reg = request.registry
    provides = [IViewClassifier] + [providedBy(x) for x in (request, context)]
    # XXX not sure what to do here about using _find_views or analogue;
    # for now let's just keep it as-is
    view = reg.adapters.lookup(provides, ISecuredView, name=name)
    if view is None:
        view = reg.adapters.lookup(provides, IView, name=name)
        if view is None:
            raise TypeError(
                'No registered view satisfies the constraints. '
                'It would not make sense to claim that this view '
                '"is" or "is not" permitted.'
            )
        return Allowed(
            'Allowed: view name %r in context %r (no permission defined)'
            % (name, context)
        )
    return view.__permitted__(context, request)


class PermitsResult(int):
    def __new__(cls, s, *args):
        """
        Create a new instance.

        :param fmt: A format string explaining the reason for denial.
        :param args: Arguments are stored and used with the format string
                      to generate the ``msg``.

        """
        inst = int.__new__(cls, cls.boolval)
        inst.s = s
        inst.args = args
        return inst

    @property
    def msg(self):
        """ A string indicating why the result was generated."""
        return self.s % self.args

    def __str__(self):
        return self.msg

    def __repr__(self):
        return '<%s instance at %s with msg %r>' % (
            self.__class__.__name__,
            id(self),
            self.msg,
        )


class Denied(PermitsResult):
    """
    An instance of ``Denied`` is returned when a security-related
    API or other :app:`Pyramid` code denies an action unrelated to
    an ACL check.  It evaluates equal to all boolean false types.  It
    has an attribute named ``msg`` describing the circumstances for
    the deny.

    """

    boolval = 0


class Allowed(PermitsResult):
    """
    An instance of ``Allowed`` is returned when a security-related
    API or other :app:`Pyramid` code allows an action unrelated to
    an ACL check.  It evaluates equal to all boolean true types.  It
    has an attribute named ``msg`` describing the circumstances for
    the allow.

    """

    boolval = 1


class ACLPermitsResult(PermitsResult):
    def __new__(cls, ace, acl, permission, principals, context):
        """
        Create a new instance.

        :param ace: The :term:`ACE` that matched, triggering the result.
        :param acl: The :term:`ACL` containing ``ace``.
        :param permission: The required :term:`permission`.
        :param principals: The list of :term:`principals <principal>` provided.
        :param context: The :term:`context` providing the :term:`lineage`
                        searched.

        """
        fmt = (
            '%s permission %r via ACE %r in ACL %r on context %r for '
            'principals %r'
        )
        inst = PermitsResult.__new__(
            cls, fmt, cls.__name__, permission, ace, acl, context, principals
        )
        inst.permission = permission
        inst.ace = ace
        inst.acl = acl
        inst.principals = principals
        inst.context = context
        return inst


class ACLDenied(ACLPermitsResult, Denied):
    """
    An instance of ``ACLDenied`` is a specialization of
    :class:`pyramid.security.Denied` that represents that a security check
    made explicitly against ACL was denied.  It evaluates equal to all
    boolean false types.  It also has the following attributes: ``acl``,
    ``ace``, ``permission``, ``principals``, and ``context``.  These
    attributes indicate the security values involved in the request.  Its
    ``__str__`` method prints a summary of these attributes for debugging
    purposes. The same summary is available as the ``msg`` attribute.

    """


class ACLAllowed(ACLPermitsResult, Allowed):
    """
    An instance of ``ACLAllowed`` is a specialization of
    :class:`pyramid.security.Allowed` that represents that a security check
    made explicitly against ACL was allowed.  It evaluates equal to all
    boolean true types.  It also has the following attributes: ``acl``,
    ``ace``, ``permission``, ``principals``, and ``context``.  These
    attributes indicate the security values involved in the request.  Its
    ``__str__`` method prints a summary of these attributes for debugging
    purposes. The same summary is available as the ``msg`` attribute.

    """


class SecurityAPIMixin(object):
    @property
    def identity(self):
        """
        Return an opaque object identifying the current user or ``None`` if no
        user is authenticated or there is no :term:`security policy` in effect.

        """
        policy = _get_security_policy(self)
        if policy is None:
            return None
        return policy.identify(self)

    def has_permission(self, permission, context=None):
        """ Given a permission and an optional context, returns an instance of
        :data:`pyramid.security.Allowed` if the permission is granted to this
        request with the provided context, or the context already associated
        with the request.  Otherwise, returns an instance of
        :data:`pyramid.security.Denied`.  This method delegates to the current
        security policy.  Returns
        :data:`pyramid.security.Allowed` unconditionally if no security
        policy has been registered for this request.  If ``context`` is not
        supplied or is supplied as ``None``, the context used is the
        ``request.context`` attribute.

        :param permission: Does this request have the given permission?
        :type permission: str
        :param context: A resource object or ``None``
        :type context: object
        :returns: Either :class:`pyramid.security.Allowed` or
                  :class:`pyramid.security.Denied`.

        """
        if context is None:
            context = self.context
        policy = _get_security_policy(self)
        if policy is None:
            return Allowed('No security policy in use.')
        identity = policy.identify(self)
        return policy.permits(self, context, identity, permission)


class AuthenticationAPIMixin(object):
    @property
    def authenticated_userid(self):
        """ Return the userid of the currently authenticated user or
        ``None`` if there is no :term:`authentication policy` in effect or
        there is no currently authenticated user.

        .. deprecated:: 2.0

            Use ``request.identity`` instead.

        """
        authn = _get_authentication_policy(self)
        security = _get_security_policy(self)
        if authn is not None:
            return authn.authenticated_userid(self)
        elif security is not None:
            return security.identify(self)
        else:
            return None

    @property
    def unauthenticated_userid(self):
        """ Return an object which represents the *claimed* (not verified) user
        id of the credentials present in the request. ``None`` if there is no
        :term:`authentication policy` in effect or there is no user data
        associated with the current request.  This differs from
        :attr:`~pyramid.request.Request.authenticated_userid`, because the
        effective authentication policy will not ensure that a record
        associated with the userid exists in persistent storage.

        .. deprecated:: 2.0

            Use ``request.identity`` instead.

        """
        authn = _get_authentication_policy(self)
        security = _get_security_policy(self)
        if authn is not None:
            return authn.unauthenticated_userid(self)
        elif security is not None:
            return security.identify(self)
        else:
            return None

    @property
    def effective_principals(self):
        """ Return the list of 'effective' :term:`principal` identifiers
        for the ``request``. If no :term:`authentication policy` is in effect,
        this will return a one-element list containing the
        :data:`pyramid.security.Everyone` principal.

        .. deprecated:: 2.0

        """
        policy = _get_authentication_policy(self)
        if policy is None:
            return [Everyone]
        return policy.effective_principals(self)


@implementer(ISecurityPolicy)
class LegacySecurityPolicy:
    """
    A :term:`security policy` which provides a backwards compatibility shim for
    the :term:`authentication policy` and the :term:`authorization policy`.

    """

    def _get_authn_policy(self, request):
        return request.registry.getUtility(IAuthenticationPolicy)

    def _get_authz_policy(self, request):
        return request.registry.getUtility(IAuthorizationPolicy)

    def identify(self, request):
        authn = self._get_authn_policy(request)
        return authn.authenticated_userid(request)

    def remember(self, request, userid, **kw):
        authn = self._get_authn_policy(request)
        return authn.remember(request, userid, **kw)

    def forget(self, request):
        authn = self._get_authn_policy(request)
        return authn.forget(request)

    def permits(self, request, context, identity, permission):
        authn = self._get_authn_policy(request)
        authz = self._get_authz_policy(request)
        principals = authn.effective_principals(request)
        return authz.permits(context, principals, permission)


class ACLHelper:
    """ A helper for use with constructing a :term:`security policy` which
    consults an :term:`ACL` object attached to a :term:`context` to determine
    authorization information about a :term:`principal` or multiple principals.
    If the context is part of a :term:`lineage`, the context's parents are
    consulted for ACL information too.

    """

    def permits(self, context, principals, permission):
        """ Return an instance of :class:`pyramid.security.ACLAllowed` if the
        ACL allows access a user with the given principals, return an instance
        of :class:`pyramid.security.ACLDenied` if not.

        When checking if principals are allowed, the security policy consults
        the ``context`` for an ACL first.  If no ACL exists on the context, or
        one does exist but the ACL does not explicitly allow or deny access for
        any of the effective principals, consult the context's parent ACL, and
        so on, until the lineage is exhausted or we determine that the policy
        permits or denies.

        During this processing, if any :data:`pyramid.security.Deny`
        ACE is found matching any principal in ``principals``, stop
        processing by returning an
        :class:`pyramid.security.ACLDenied` instance (equals
        ``False``) immediately.  If any
        :data:`pyramid.security.Allow` ACE is found matching any
        principal, stop processing by returning an
        :class:`pyramid.security.ACLAllowed` instance (equals
        ``True``) immediately.  If we exhaust the context's
        :term:`lineage`, and no ACE has explicitly permitted or denied
        access, return an instance of
        :class:`pyramid.security.ACLDenied` (equals ``False``).

        """
        acl = '<No ACL found on any object in resource lineage>'

        for location in lineage(context):
            try:
                acl = location.__acl__
            except AttributeError:
                continue

            if acl and callable(acl):
                acl = acl()

            for ace in acl:
                ace_action, ace_principal, ace_permissions = ace
                if ace_principal in principals:
                    if not is_nonstr_iter(ace_permissions):
                        ace_permissions = [ace_permissions]
                    if permission in ace_permissions:
                        if ace_action == Allow:
                            return ACLAllowed(
                                ace, acl, permission, principals, location
                            )
                        else:
                            return ACLDenied(
                                ace, acl, permission, principals, location
                            )

        # default deny (if no ACL in lineage at all, or if none of the
        # principals were mentioned in any ACE we found)
        return ACLDenied(
            '<default deny>', acl, permission, principals, context
        )

    def principals_allowed_by_permission(self, context, permission):
        """ Return the set of principals explicitly granted the permission
        named ``permission`` according to the ACL directly attached to the
        ``context`` as well as inherited ACLs based on the :term:`lineage`.

        When computing principals allowed by a permission, we compute the set
        of principals that are explicitly granted the ``permission`` in the
        provided ``context``.  We do this by walking 'up' the object graph
        *from the root* to the context.  During this walking process, if we
        find an explicit :data:`pyramid.security.Allow` ACE for a principal
        that matches the ``permission``, the principal is included in the allow
        list.  However, if later in the walking process that principal is
        mentioned in any :data:`pyramid.security.Deny` ACE for the permission,
        the principal is removed from the allow list.  If a
        :data:`pyramid.security.Deny` to the principal
        :data:`pyramid.security.Everyone` is encountered during the walking
        process that matches the ``permission``, the allow list is cleared for
        all principals encountered in previous ACLs.  The walking process ends
        after we've processed the any ACL directly attached to ``context``; a
        set of principals is returned.

        """
        allowed = set()

        for location in reversed(list(lineage(context))):
            # NB: we're walking *up* the object graph from the root
            try:
                acl = location.__acl__
            except AttributeError:
                continue

            allowed_here = set()
            denied_here = set()

            if acl and callable(acl):
                acl = acl()

            for ace_action, ace_principal, ace_permissions in acl:
                if not is_nonstr_iter(ace_permissions):
                    ace_permissions = [ace_permissions]
                if (ace_action == Allow) and (permission in ace_permissions):
                    if ace_principal not in denied_here:
                        allowed_here.add(ace_principal)
                if (ace_action == Deny) and (permission in ace_permissions):
                    denied_here.add(ace_principal)
                    if ace_principal == Everyone:
                        # clear the entire allowed set, as we've hit a
                        # deny of Everyone ala (Deny, Everyone, ALL)
                        allowed = set()
                        break
                    elif ace_principal in allowed:
                        allowed.remove(ace_principal)

            allowed.update(allowed_here)

        return allowed


class SessionAuthenticationHelper:
    """ A helper for use with a :term:`security policy` which stores user data
    in the configured :term:`session`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    """

    def __init__(self, prefix='auth.'):
        self.userid_key = prefix + 'userid'

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        request.session[self.userid_key] = userid
        return []

    def forget(self, request):
        """ Remove the stored userid from the session."""
        if self.userid_key in request.session:
            del request.session[self.userid_key]
        return []

    def identify(self, request):
        return request.session.get(self.userid_key)


def b64encode(v):
    return base64.b64encode(bytes_(v)).strip().replace(b'\n', b'')


def b64decode(v):
    return base64.b64decode(bytes_(v))


# this class licensed under the MIT license (stolen from Paste)
class AuthTicket(object):
    """
    This class represents an authentication token.  You must pass in
    the shared secret, the userid, and the IP address.  Optionally you
    can include tokens (a list of strings, representing role names),
    'user_data', which is arbitrary data available for your own use in
    later scripts.  Lastly, you can override the cookie name and
    timestamp.

    Once you provide all the arguments, use .cookie_value() to
    generate the appropriate authentication ticket.

    Usage::

        token = AuthTicket('sharedsecret', 'username',
            os.environ['REMOTE_ADDR'], tokens=['admin'])
        val = token.cookie_value()

    """

    def __init__(
        self,
        secret,
        userid,
        ip,
        tokens=(),
        user_data='',
        time=None,
        cookie_name='auth_tkt',
        secure=False,
        hashalg='md5',
    ):
        self.secret = secret
        self.userid = userid
        self.ip = ip
        self.tokens = ','.join(tokens)
        self.user_data = user_data
        if time is None:
            self.time = time_mod.time()
        else:
            self.time = time
        self.cookie_name = cookie_name
        self.secure = secure
        self.hashalg = hashalg

    def digest(self):
        return calculate_digest(
            self.ip,
            self.time,
            self.secret,
            self.userid,
            self.tokens,
            self.user_data,
            self.hashalg,
        )

    def cookie_value(self):
        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))
        if self.tokens:
            v += self.tokens + '!'
        v += self.user_data
        return v


# this class licensed under the MIT license (stolen from Paste)
class BadTicket(Exception):
    """
    Exception raised when a ticket can't be parsed.  If we get far enough to
    determine what the expected digest should have been, expected is set.
    This should not be shown by default, but can be useful for debugging.
    """

    def __init__(self, msg, expected=None):
        self.expected = expected
        Exception.__init__(self, msg)


# this function licensed under the MIT license (stolen from Paste)
def parse_ticket(secret, ticket, ip, hashalg='md5'):
    """
    Parse the ticket, returning (timestamp, userid, tokens, user_data).

    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised
    with an explanation.
    """
    ticket = text_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size : digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8 :].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else:  # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

    expected = calculate_digest(
        ip, timestamp, secret, userid, tokens, user_data, hashalg
    )

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(expected, digest):
        raise BadTicket(
            'Digest signature is not correct', expected=(expected, digest)
        )

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)


# this function licensed under the MIT license (stolen from Paste)
def calculate_digest(
    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'
):
    secret = bytes_(secret, 'utf-8')
    userid = bytes_(userid, 'utf-8')
    tokens = bytes_(tokens, 'utf-8')
    user_data = bytes_(user_data, 'utf-8')
    hash_obj = hashlib.new(hashalg)

    # Check to see if this is an IPv6 address
    if ':' in ip:
        ip_timestamp = ip + str(int(timestamp))
        ip_timestamp = bytes_(ip_timestamp)
    else:
        # encode_ip_timestamp not required, left in for backwards compatibility
        ip_timestamp = encode_ip_timestamp(ip, timestamp)

    hash_obj.update(
        ip_timestamp + secret + userid + b'\0' + tokens + b'\0' + user_data
    )
    digest = hash_obj.hexdigest()
    hash_obj2 = hashlib.new(hashalg)
    hash_obj2.update(bytes_(digest) + secret)
    return hash_obj2.hexdigest()


# this function licensed under the MIT license (stolen from Paste)
def encode_ip_timestamp(ip, timestamp):
    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))
    t = int(timestamp)
    ts = (
        (t & 0xFF000000) >> 24,
        (t & 0xFF0000) >> 16,
        (t & 0xFF00) >> 8,
        t & 0xFF,
    )
    ts_chars = ''.join(map(chr, ts))
    return bytes_(ip_chars + ts_chars)


class AuthTktCookieHelper:
    """
    A helper class used for constructing a :term:`security policy` with stores
    the user identity in a signed cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option.

        This option is available as of :app:`Pyramid` 1.10.
    """

    parse_ticket = staticmethod(parse_ticket)  # for tests
    AuthTicket = AuthTicket  # for tests
    BadTicket = BadTicket  # for tests
    now = None  # for tests

    userid_type_decoders = {
        'int': int,
        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies
        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],
        'b64str': lambda x: b64decode(x),
    }

    userid_type_encoders = {
        int: ('int', str),
        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        bytes: ('b64str', lambda x: b64encode(x)),
    }

    def __init__(
        self,
        secret,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        http_only=False,
        path="/",
        wild_domain=True,
        hashalg='md5',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie_profile = CookieProfile(
            cookie_name=cookie_name,
            secure=secure,
            max_age=max_age,
            httponly=http_only,
            path=path,
            serializer=SimpleSerializer(),
            samesite=samesite,
        )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout if timeout is None else int(timeout)
        self.reissue_time = (
            reissue_time if reissue_time is None else int(reissue_time)
        )
        self.max_age = max_age if max_age is None else int(max_age)
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

    def _get_cookies(self, request, value, max_age=None):
        cur_domain = request.domain

        domains = []
        if self.domain:
            domains.append(self.domain)
        else:
            if self.parent_domain and cur_domain.count('.') > 1:
                domains.append('.' + cur_domain.split('.', 1)[1])
            else:
                domains.append(None)
                domains.append(cur_domain)
                if self.wild_domain:
                    domains.append('.' + cur_domain)

        profile = self.cookie_profile(request)

        kw = {}
        kw['domains'] = domains
        if max_age is not None:
            kw['max_age'] = max_age

        headers = profile.get_headers(value, **kw)
        return headers

    def identify(self, request):
        """ Return a dictionary with authentication information, or ``None``
        if no valid auth_tkt is attached to ``request``"""
        environ = request.environ
        cookie = request.cookies.get(self.cookie_name)

        if cookie is None:
            return None

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        try:
            timestamp, userid, tokens, user_data = self.parse_ticket(
                self.secret, cookie, remote_addr, self.hashalg
            )
        except self.BadTicket:
            return None

        now = self.now  # service tests

        if now is None:
            now = time_mod.time()

        if self.timeout and ((timestamp + self.timeout) < now):
            # the auth_tkt data has expired
            return None

        userid_typename = 'userid_type:'
        user_data_info = user_data.split('|')
        for datum in filter(None, user_data_info):
            if datum.startswith(userid_typename):
                userid_type = datum[len(userid_typename) :]
                decoder = self.userid_type_decoders.get(userid_type)
                if decoder:
                    userid = decoder(userid)

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if (now - timestamp) > self.reissue_time:
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(
                    request, userid, max_age=self.max_age, tokens=tokens
                )

                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))

                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

        environ['REMOTE_USER_TOKENS'] = tokens
        environ['REMOTE_USER_DATA'] = user_data
        environ['AUTH_TYPE'] = 'cookie'

        identity = {}
        identity['timestamp'] = timestamp
        identity['userid'] = userid
        identity['tokens'] = tokens
        identity['userdata'] = user_data
        return identity

    def forget(self, request):
        """ Return a set of expires Set-Cookie headers, which will destroy
        any existing auth_tkt cookie when attached to a response"""
        request._authtkt_reissue_revoked = True
        return self._get_cookies(request, None)

    def remember(self, request, userid, max_age=None, tokens=()):
        """ Return a set of Set-Cookie headers; when set into a response,
        these headers will represent a valid authentication ticket.

        ``max_age``
          The max age of the auth_tkt cookie, in seconds.  When this value is
          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,
          allowing the auth_tkt cookie to last between browser sessions.  If
          this value is ``None``, the ``max_age`` value provided to the
          helper itself will be used as the ``max_age`` value.  Default:
          ``None``.

        ``tokens``
          A sequence of strings that will be placed into the auth_tkt tokens
          field.  Each string in the sequence must be of the Python ``str``
          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.
          Tokens are available in the returned identity when an auth_tkt is
          found in the request and unpacked.  Default: ``()``.
        """
        max_age = self.max_age if max_age is None else int(max_age)

        environ = request.environ

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        user_data = ''

        encoding_data = self.userid_type_encoders.get(type(userid))

        if encoding_data:
            encoding, encoder = encoding_data
        else:
            warnings.warn(
                "userid is of type {}, and is not supported by the "
                "AuthTktAuthenticationPolicy. Explicitly converting to string "
                "and storing as base64. Subsequent requests will receive a "
                "string as the userid, it will not be decoded back to the "
                "type provided.".format(type(userid)),
                RuntimeWarning,
            )
            encoding, encoder = self.userid_type_encoders.get(str)
            userid = str(userid)

        userid = encoder(userid)
        user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, str):
                try:
                    token = ascii_(token)
                except UnicodeEncodeError:
                    raise ValueError("Invalid token %r" % (token,))
            if not (isinstance(token, str) and VALID_TOKEN.match(token)):
                raise ValueError("Invalid token %r" % (token,))
            new_tokens.append(token)
        tokens = tuple(new_tokens)

        if hasattr(request, '_authtkt_reissued'):
            request._authtkt_reissue_revoked = True

        ticket = self.AuthTicket(
            self.secret,
            userid,
            remote_addr,
            tokens=tokens,
            user_data=user_data,
            cookie_name=self.cookie_name,
            secure=self.secure,
            hashalg=self.hashalg,
        )

        cookie_value = ticket.cookie_value()
        return self._get_cookies(request, cookie_value, max_age)

```
--- 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:** `authenticated_userid` Returns Non-String Type Causing Assertion Failure

**Description:**
When a legacy security policy is used, the `authenticated_userid` method returns an integer instead of a string. This leads to assertion failures in tests that expect the user ID to be a string.

**Example Code:**
```python
def test_with_security_policy(self):
    request = _makeRequest()
    _registerSecurityPolicy(request.registry, 123)
    self.assertEqual(request.authenticated_userid, '123')
```

**Expected Behavior:**
The `authenticated_userid` should consistently return a string representation of the user ID, ensuring compatibility and preventing type-related issues.

**Actual Behavior:**
When the security policy is registered with an integer (e.g., `123`), the `authenticated_userid` returns an integer (`123`) instead of a string (`'123'`), causing the assertion to fail.

[/ISSUE]
{
    "TestAllPermissionsList.test_contains_w_object": "PASSED",
    "TestAllPermissionsList.test_contains_w_string": "PASSED",
    "TestAllPermissionsList.test_equality_miss": "PASSED",
    "TestAllPermissionsList.test_equality_w_other_instances_of_class": "PASSED",
    "TestAllPermissionsList.test_equality_w_self": "PASSED",
    "TestAllPermissionsList.test_iterable": "PASSED",
    "TestAllPermissionsList.test_singleton": "PASSED",
    "TestAllowed.test_it": "PASSED",
    "TestDenied.test_it": "PASSED",
    "TestACLAllowed.test_it": "PASSED",
    "TestACLDenied.test_it": "PASSED",
    "TestPrincipalsAllowedByPermission.test_no_authorization_policy": "PASSED",
    "TestPrincipalsAllowedByPermission.test_with_authorization_policy": "PASSED",
    "TestRemember.test_no_security_policy": "PASSED",
    "TestRemember.test_with_missing_arg": "PASSED",
    "TestRemember.test_with_security_policy": "PASSED",
    "TestForget.test_no_security_policy": "PASSED",
    "TestForget.test_with_security_policy": "PASSED",
    "TestViewExecutionPermitted.test_no_permission": "PASSED",
    "TestViewExecutionPermitted.test_no_view_registered": "PASSED",
    "TestViewExecutionPermitted.test_with_permission": "PASSED",
    "TestIdentity.test_identity": "PASSED",
    "TestIdentity.test_identity_no_security_policy": "PASSED",
    "TestAuthenticatedUserId.test_no_authentication_policy": "PASSED",
    "TestAuthenticatedUserId.test_with_authentication_policy": "PASSED",
    "TestAuthenticatedUserId.test_with_authentication_policy_no_reg_on_request": "PASSED",
    "TestAuthenticatedUserId.test_with_security_policy": "PASSED",
    "TestUnAuthenticatedUserId.test_no_authentication_policy": "PASSED",
    "TestUnAuthenticatedUserId.test_with_authentication_policy": "PASSED",
    "TestUnAuthenticatedUserId.test_with_authentication_policy_no_reg_on_request": "PASSED",
    "TestUnAuthenticatedUserId.test_with_security_policy": "PASSED",
    "TestEffectivePrincipals.test_no_authentication_policy": "PASSED",
    "TestEffectivePrincipals.test_with_authentication_policy": "PASSED",
    "TestEffectivePrincipals.test_with_authentication_policy_no_reg_on_request": "PASSED",
    "TestHasPermission.test_no_security_policy": "PASSED",
    "TestHasPermission.test_with_no_context_passed": "PASSED",
    "TestHasPermission.test_with_no_context_passed_or_on_request": "PASSED",
    "TestHasPermission.test_with_security_registered": "PASSED",
    "TestLegacySecurityPolicy.test_forget": "PASSED",
    "TestLegacySecurityPolicy.test_identity": "PASSED",
    "TestLegacySecurityPolicy.test_permits": "PASSED",
    "TestLegacySecurityPolicy.test_remember": "PASSED",
    "TestACLHelper.test_acl": "PASSED",
    "TestACLHelper.test_callable_acl": "PASSED",
    "TestACLHelper.test_no_acl": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_callable_acl": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_deny_not_permission_in_acl": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_deny_permission_in_acl": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_direct": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_no_acls": "PASSED",
    "TestACLHelper.test_principals_allowed_by_permission_string_permission": "PASSED",
    "TestACLHelper.test_string_permissions_in_acl": "PASSED",
    "TestSessionAuthenticationHelper.test_forget": "PASSED",
    "TestSessionAuthenticationHelper.test_forget_no_identity": "PASSED",
    "TestSessionAuthenticationHelper.test_identify": "PASSED",
    "TestSessionAuthenticationHelper.test_identify_none": "PASSED",
    "TestSessionAuthenticationHelper.test_identify_with_prefix": "PASSED",
    "TestSessionAuthenticationHelper.test_remember": "PASSED",
    "TestAuthTicket.test_cookie_value": "PASSED",
    "TestAuthTicket.test_ctor_with_time": "PASSED",
    "TestAuthTicket.test_ctor_with_tokens": "PASSED",
    "TestAuthTicket.test_digest": "PASSED",
    "TestAuthTicket.test_digest_sha512": "PASSED",
    "TestAuthTicket.test_ipv4": "PASSED",
    "TestAuthTicket.test_ipv6": "PASSED",
    "TestBadTicket.test_it": "PASSED",
    "Test_parse_ticket.test_bad_timestamp": "PASSED",
    "Test_parse_ticket.test_bad_userid_or_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data_sha512": "PASSED",
    "Test_parse_ticket.test_digest_sig_incorrect": "PASSED",
    "Test_parse_ticket.test_ipv4": "PASSED",
    "Test_parse_ticket.test_ipv6": "PASSED",
    "TestAuthTktCookieHelper.test_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_bad_cookie": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_already_reissued_this_request": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_notyet": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_remember": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_with_tokens_default": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_timeout": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_timeout": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_timeout_aged": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_value_is_None": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_b64str_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_b64unicode_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_dont_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_include_ipv6": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_int_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_unknown_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_nocookie": "PASSED",
    "TestAuthTktCookieHelper.test_identify_nonuseridtype_user_data": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_reissue_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_timeout_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember": "PASSED",
    "TestAuthTktCookieHelper.test_remember_None_samesite": "PASSED",
    "TestAuthTktCookieHelper.test_remember_binary_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_domain_supercedes_parent_and_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_explicit_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_http_only": "PASSED",
    "TestAuthTktCookieHelper.test_remember_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_remember_insane_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_int_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_invalid_token_format": "PASSED",
    "TestAuthTktCookieHelper.test_remember_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nonascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nondefault_samesite": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain_supercedes_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_path": "PASSED",
    "TestAuthTktCookieHelper.test_remember_samesite_default": "PASSED",
    "TestAuthTktCookieHelper.test_remember_samesite_nondefault": "PASSED",
    "TestAuthTktCookieHelper.test_remember_secure": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_tokens": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_but_ascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_wild_domain_disabled": "PASSED",
    "ActionConfiguratorMixinTests.test_action_autocommit_with_introspectables": "PASSED",
    "ActionConfiguratorMixinTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_kw_is_None": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_kw_is_not_None": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ActionConfiguratorMixinTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ActionConfiguratorMixinTests.test_autocommit_no_conflicts": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_simple": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_with_two_includes": "PASSED",
    "ActionConfiguratorMixinTests.test_conflict_set_forbidden_view": "PASSED",
    "ActionConfiguratorMixinTests.test_conflict_set_notfound_view": "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",
    "TestActionInfo.test___str__": "PASSED",
    "TestActionInfo.test_class_conforms": "PASSED",
    "TestActionInfo.test_ctor": "PASSED",
    "TestActionInfo.test_instance_conforms": "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_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_execution_policy": "PASSED",
    "TestFactoriesMixin.test_set_execution_policy_to_None": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_response_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "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",
    "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_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_context_manager": "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_security_policy": "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_threadlocals_active": "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_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_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "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",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "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_close_matches": "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_sort_accept_offers.test_default_specificities": "PASSED",
    "Test_sort_accept_offers.test_params_inherit_type_prefs": "PASSED",
    "Test_sort_accept_offers.test_params_order": "PASSED",
    "Test_sort_accept_offers.test_specific_type_order": "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_accept_list": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_inherit_errors": "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_root_slash_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix_with_inherit_slash": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_wildcard_accept_raises": "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_authentication_policy_with_security_policy": "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",
    "ConfiguratorSecurityMethodsTests.test_set_security_policy": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_does_not_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",
    "TestSettingsConfiguratorMixin.test_settings_parameter_dict_is_never_updated": "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_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_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_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "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",
    "TestViewsConfigurationMixin.test_add_accept_view_order_override": "PASSED",
    "TestViewsConfigurationMixin.test_add_accept_view_order_throws_on_type_mismatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_accept_view_order_throws_on_wildcard": "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_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_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_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_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_does_not_accept_iterable_accept": "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_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_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_wildcard_accept_raises": "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_default_accept_view_order": "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",
    "Test_viewdefaults.test_dunder_attrs_copied": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "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",
    "Test_main.test_it": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_bad_format": "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_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_file_finds_open_url": "PASSED",
    "TestPServeCommand.test_guess_server_url": "PASSED",
    "TestPServeCommand.test_original_ignore_files": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_reload_call_hupper_with_correct_args": "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_command_setup_generator": "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_not_found": "PASSED",
    "TestPViewsCommand.test_views_command_not_found_url_starts_without_slash": "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",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_response_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "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",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "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_include_with_python_callable": "FAILED",
    "ConfiguratorTests.test_scan_integration_conflict": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_setup_registry_tweens": "FAILED",
    "ConfiguratorTests.test_with_package_module": "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",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "FAILED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tween_dottedname": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_distinct": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "FAILED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_context_as_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_for__as_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "FAILED",
    "TestStaticURLInfo.test_generate_url_cachebust_with_overrides": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRoutesCommand.test_class_view": "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_multiview_registered": "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_multi_view_nested": "FAILED",
    "TestPViewsCommand.test_views_command_multiview": "FAILED",
    "TestPViewsCommand.test_views_command_multiview_with_permission": "FAILED",
    "TestPViewsCommand.test_views_command_multiview_with_predicates": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_route": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_route_with_route_predicates": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_permission": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_predicates": "FAILED"
}
diff --git a/src/pyramid/security.py b/src/pyramid/security.py
index e28ce0f1c..a55320ce6 100644
--- a/src/pyramid/security.py
+++ b/src/pyramid/security.py
@@ -355,7 +355,7 @@ class AuthenticationAPIMixin(object):
         if authn is not None:
             return authn.authenticated_userid(self)
         elif security is not None:
-            return security.identify(self)
+            return str(security.identify(self))
         else:
             return None
 

{"src/pyramid/security.py": "from codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nimport re\n\nfrom webob.cookies import CookieProfile\n\nfrom zope.interface import implementer, providedBy\n\nfrom pyramid.interfaces import (\n    ISecurityPolicy,\n    IAuthenticationPolicy,\n    IAuthorizationPolicy,\n    ISecuredView,\n    IView,\n    IViewClassifier,\n)\n\nfrom pyramid.location import lineage\n\nfrom pyramid.util import is_nonstr_iter, strings_differ, bytes_, ascii_, text_\n\nfrom pyramid.util import SimpleSerializer\n\nfrom pyramid.threadlocal import get_current_registry\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nEveryone = 'system.Everyone'\nAuthenticated = 'system.Authenticated'\nAllow = 'Allow'\nDeny = 'Deny'\n\n\nclass AllPermissionsList(object):\n    \"\"\" Stand in 'permission list' to represent all permissions \"\"\"\n\n    def __iter__(self):\n        return iter(())\n\n    def __contains__(self, other):\n        return True\n\n    def __eq__(self, other):\n        return isinstance(other, self.__class__)\n\n\nALL_PERMISSIONS = AllPermissionsList()\nDENY_ALL = (Deny, Everyone, ALL_PERMISSIONS)\n\nNO_PERMISSION_REQUIRED = '__no_permission_required__'\n\n\ndef _get_security_policy(request):\n    return request.registry.queryUtility(ISecurityPolicy)\n\n\ndef _get_authentication_policy(request):\n    return request.registry.queryUtility(IAuthenticationPolicy)\n\n\ndef remember(request, userid, **kw):\n    \"\"\"\n    Returns a sequence of header tuples (e.g. ``[('Set-Cookie', 'foo=abc')]``)\n    on this request's response.\n    These headers are suitable for 'remembering' a set of credentials\n    implied by the data passed as ``userid`` and ``*kw`` using the\n    current :term:`security policy`.  Common usage might look\n    like so within the body of a view function (``response`` is\n    assumed to be a :term:`WebOb` -style :term:`response` object\n    computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import remember\n       headers = remember(request, 'chrism', password='123', max_age='86400')\n       response = request.response\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence. If used, the composition and\n    meaning of ``**kw`` must be agreed upon by the calling code and\n    the effective security policy.\n\n    .. versionchanged:: 1.6\n        Deprecated the ``principal`` argument in favor of ``userid`` to clarify\n        its relationship to the authentication policy.\n\n    .. versionchanged:: 1.10\n        Removed the deprecated ``principal`` argument.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.remember(request, userid, **kw)\n\n\ndef forget(request):\n    \"\"\"\n    Return a sequence of header tuples (e.g. ``[('Set-Cookie',\n    'foo=abc')]``) suitable for 'forgetting' the set of credentials\n    possessed by the currently authenticated user.  A common usage\n    might look like so within the body of a view function\n    (``response`` is assumed to be an :term:`WebOb` -style\n    :term:`response` object computed previously by the view code):\n\n    .. code-block:: python\n\n       from pyramid.security import forget\n       headers = forget(request)\n       response.headerlist.extend(headers)\n       return response\n\n    If no :term:`security policy` is in use, this function will\n    always return an empty sequence.\n    \"\"\"\n    policy = _get_security_policy(request)\n    if policy is None:\n        return []\n    return policy.forget(request)\n\n\ndef principals_allowed_by_permission(context, permission):\n    \"\"\" Provided a ``context`` (a resource object), and a ``permission``\n    string, if an :term:`authorization policy` is\n    in effect, return a sequence of :term:`principal` ids that possess\n    the permission in the ``context``.  If no authorization policy is\n    in effect, this will return a sequence with the single value\n    :mod:`pyramid.security.Everyone` (the special principal\n    identifier representing all principals).\n\n    .. note::\n\n       Even if an :term:`authorization policy` is in effect,\n       some (exotic) authorization policies may not implement the\n       required machinery for this function; those will cause a\n       :exc:`NotImplementedError` exception to be raised when this\n       function is invoked.\n\n    \"\"\"\n    reg = get_current_registry()\n    policy = reg.queryUtility(IAuthorizationPolicy)\n    if policy is None:\n        return [Everyone]\n    return policy.principals_allowed_by_permission(context, permission)\n\n\ndef view_execution_permitted(context, request, name=''):\n    \"\"\" If the view specified by ``context`` and ``name`` is protected\n    by a :term:`permission`, check the permission associated with the\n    view using the effective authentication/authorization policies and\n    the ``request``.  Return a boolean result.  If no\n    :term:`authorization policy` is in effect, or if the view is not\n    protected by a permission, return ``True``. If no view can view found,\n    an exception will be raised.\n\n    .. versionchanged:: 1.4a4\n       An exception is raised if no view is found.\n\n    \"\"\"\n    reg = request.registry\n    provides = [IViewClassifier] + [providedBy(x) for x in (request, context)]\n    # XXX not sure what to do here about using _find_views or analogue;\n    # for now let's just keep it as-is\n    view = reg.adapters.lookup(provides, ISecuredView, name=name)\n    if view is None:\n        view = reg.adapters.lookup(provides, IView, name=name)\n        if view is None:\n            raise TypeError(\n                'No registered view satisfies the constraints. '\n                'It would not make sense to claim that this view '\n                '\"is\" or \"is not\" permitted.'\n            )\n        return Allowed(\n            'Allowed: view name %r in context %r (no permission defined)'\n            % (name, context)\n        )\n    return view.__permitted__(context, request)\n\n\nclass PermitsResult(int):\n    def __new__(cls, s, *args):\n        \"\"\"\n        Create a new instance.\n\n        :param fmt: A format string explaining the reason for denial.\n        :param args: Arguments are stored and used with the format string\n                      to generate the ``msg``.\n\n        \"\"\"\n        inst = int.__new__(cls, cls.boolval)\n        inst.s = s\n        inst.args = args\n        return inst\n\n    @property\n    def msg(self):\n        \"\"\" A string indicating why the result was generated.\"\"\"\n        return self.s % self.args\n\n    def __str__(self):\n        return self.msg\n\n    def __repr__(self):\n        return '<%s instance at %s with msg %r>' % (\n            self.__class__.__name__,\n            id(self),\n            self.msg,\n        )\n\n\nclass Denied(PermitsResult):\n    \"\"\"\n    An instance of ``Denied`` is returned when a security-related\n    API or other :app:`Pyramid` code denies an action unrelated to\n    an ACL check.  It evaluates equal to all boolean false types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the deny.\n\n    \"\"\"\n\n    boolval = 0\n\n\nclass Allowed(PermitsResult):\n    \"\"\"\n    An instance of ``Allowed`` is returned when a security-related\n    API or other :app:`Pyramid` code allows an action unrelated to\n    an ACL check.  It evaluates equal to all boolean true types.  It\n    has an attribute named ``msg`` describing the circumstances for\n    the allow.\n\n    \"\"\"\n\n    boolval = 1\n\n\nclass ACLPermitsResult(PermitsResult):\n    def __new__(cls, ace, acl, permission, principals, context):\n        \"\"\"\n        Create a new instance.\n\n        :param ace: The :term:`ACE` that matched, triggering the result.\n        :param acl: The :term:`ACL` containing ``ace``.\n        :param permission: The required :term:`permission`.\n        :param principals: The list of :term:`principals <principal>` provided.\n        :param context: The :term:`context` providing the :term:`lineage`\n                        searched.\n\n        \"\"\"\n        fmt = (\n            '%s permission %r via ACE %r in ACL %r on context %r for '\n            'principals %r'\n        )\n        inst = PermitsResult.__new__(\n            cls, fmt, cls.__name__, permission, ace, acl, context, principals\n        )\n        inst.permission = permission\n        inst.ace = ace\n        inst.acl = acl\n        inst.principals = principals\n        inst.context = context\n        return inst\n\n\nclass ACLDenied(ACLPermitsResult, Denied):\n    \"\"\"\n    An instance of ``ACLDenied`` is a specialization of\n    :class:`pyramid.security.Denied` that represents that a security check\n    made explicitly against ACL was denied.  It evaluates equal to all\n    boolean false types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass ACLAllowed(ACLPermitsResult, Allowed):\n    \"\"\"\n    An instance of ``ACLAllowed`` is a specialization of\n    :class:`pyramid.security.Allowed` that represents that a security check\n    made explicitly against ACL was allowed.  It evaluates equal to all\n    boolean true types.  It also has the following attributes: ``acl``,\n    ``ace``, ``permission``, ``principals``, and ``context``.  These\n    attributes indicate the security values involved in the request.  Its\n    ``__str__`` method prints a summary of these attributes for debugging\n    purposes. The same summary is available as the ``msg`` attribute.\n\n    \"\"\"\n\n\nclass SecurityAPIMixin(object):\n    @property\n    def identity(self):\n        \"\"\"\n        Return an opaque object identifying the current user or ``None`` if no\n        user is authenticated or there is no :term:`security policy` in effect.\n\n        \"\"\"\n        policy = _get_security_policy(self)\n        if policy is None:\n            return None\n        return policy.identify(self)\n\n    def has_permission(self, permission, context=None):\n        \"\"\" Given a permission and an optional context, returns an instance of\n        :data:`pyramid.security.Allowed` if the permission is granted to this\n        request with the provided context, or the context already associated\n        with the request.  Otherwise, returns an instance of\n        :data:`pyramid.security.Denied`.  This method delegates to the current\n        security policy.  Returns\n        :data:`pyramid.security.Allowed` unconditionally if no security\n        policy has been registered for this request.  If ``context`` is not\n        supplied or is supplied as ``None``, the context used is the\n        ``request.context`` attribute.\n\n        :param permission: Does this request have the given permission?\n        :type permission: str\n        :param context: A resource object or ``None``\n        :type context: object\n        :returns: Either :class:`pyramid.security.Allowed` or\n                  :class:`pyramid.security.Denied`.\n\n        \"\"\"\n        if context is None:\n            context = self.context\n        policy = _get_security_policy(self)\n        if policy is None:\n            return Allowed('No security policy in use.')\n        identity = policy.identify(self)\n        return policy.permits(self, context, identity, permission)\n\n\nclass AuthenticationAPIMixin(object):\n    @property\n    def authenticated_userid(self):\n        \"\"\" Return the userid of the currently authenticated user or\n        ``None`` if there is no :term:`authentication policy` in effect or\n        there is no currently authenticated user.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.authenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def unauthenticated_userid(self):\n        \"\"\" Return an object which represents the *claimed* (not verified) user\n        id of the credentials present in the request. ``None`` if there is no\n        :term:`authentication policy` in effect or there is no user data\n        associated with the current request.  This differs from\n        :attr:`~pyramid.request.Request.authenticated_userid`, because the\n        effective authentication policy will not ensure that a record\n        associated with the userid exists in persistent storage.\n\n        .. deprecated:: 2.0\n\n            Use ``request.identity`` instead.\n\n        \"\"\"\n        authn = _get_authentication_policy(self)\n        security = _get_security_policy(self)\n        if authn is not None:\n            return authn.unauthenticated_userid(self)\n        elif security is not None:\n            return security.identify(self)\n        else:\n            return None\n\n    @property\n    def effective_principals(self):\n        \"\"\" Return the list of 'effective' :term:`principal` identifiers\n        for the ``request``. If no :term:`authentication policy` is in effect,\n        this will return a one-element list containing the\n        :data:`pyramid.security.Everyone` principal.\n\n        .. deprecated:: 2.0\n\n        \"\"\"\n        policy = _get_authentication_policy(self)\n        if policy is None:\n            return [Everyone]\n        return policy.effective_principals(self)\n\n\n@implementer(ISecurityPolicy)\nclass LegacySecurityPolicy:\n    \"\"\"\n    A :term:`security policy` which provides a backwards compatibility shim for\n    the :term:`authentication policy` and the :term:`authorization policy`.\n\n    \"\"\"\n\n    def _get_authn_policy(self, request):\n        return request.registry.getUtility(IAuthenticationPolicy)\n\n    def _get_authz_policy(self, request):\n        return request.registry.getUtility(IAuthorizationPolicy)\n\n    def identify(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.authenticated_userid(request)\n\n    def remember(self, request, userid, **kw):\n        authn = self._get_authn_policy(request)\n        return authn.remember(request, userid, **kw)\n\n    def forget(self, request):\n        authn = self._get_authn_policy(request)\n        return authn.forget(request)\n\n    def permits(self, request, context, identity, permission):\n        authn = self._get_authn_policy(request)\n        authz = self._get_authz_policy(request)\n        principals = authn.effective_principals(request)\n        return authz.permits(context, principals, permission)\n\n\nclass ACLHelper:\n    \"\"\" A helper for use with constructing a :term:`security policy` which\n    consults an :term:`ACL` object attached to a :term:`context` to determine\n    authorization information about a :term:`principal` or multiple principals.\n    If the context is part of a :term:`lineage`, the context's parents are\n    consulted for ACL information too.\n\n    \"\"\"\n\n    def permits(self, context, principals, permission):\n        \"\"\" Return an instance of :class:`pyramid.security.ACLAllowed` if the\n        ACL allows access a user with the given principals, return an instance\n        of :class:`pyramid.security.ACLDenied` if not.\n\n        When checking if principals are allowed, the security policy consults\n        the ``context`` for an ACL first.  If no ACL exists on the context, or\n        one does exist but the ACL does not explicitly allow or deny access for\n        any of the effective principals, consult the context's parent ACL, and\n        so on, until the lineage is exhausted or we determine that the policy\n        permits or denies.\n\n        During this processing, if any :data:`pyramid.security.Deny`\n        ACE is found matching any principal in ``principals``, stop\n        processing by returning an\n        :class:`pyramid.security.ACLDenied` instance (equals\n        ``False``) immediately.  If any\n        :data:`pyramid.security.Allow` ACE is found matching any\n        principal, stop processing by returning an\n        :class:`pyramid.security.ACLAllowed` instance (equals\n        ``True``) immediately.  If we exhaust the context's\n        :term:`lineage`, and no ACE has explicitly permitted or denied\n        access, return an instance of\n        :class:`pyramid.security.ACLDenied` (equals ``False``).\n\n        \"\"\"\n        acl = '<No ACL found on any object in resource lineage>'\n\n        for location in lineage(context):\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace in acl:\n                ace_action, ace_principal, ace_permissions = ace\n                if ace_principal in principals:\n                    if not is_nonstr_iter(ace_permissions):\n                        ace_permissions = [ace_permissions]\n                    if permission in ace_permissions:\n                        if ace_action == Allow:\n                            return ACLAllowed(\n                                ace, acl, permission, principals, location\n                            )\n                        else:\n                            return ACLDenied(\n                                ace, acl, permission, principals, location\n                            )\n\n        # default deny (if no ACL in lineage at all, or if none of the\n        # principals were mentioned in any ACE we found)\n        return ACLDenied(\n            '<default deny>', acl, permission, principals, context\n        )\n\n    def principals_allowed_by_permission(self, context, permission):\n        \"\"\" Return the set of principals explicitly granted the permission\n        named ``permission`` according to the ACL directly attached to the\n        ``context`` as well as inherited ACLs based on the :term:`lineage`.\n\n        When computing principals allowed by a permission, we compute the set\n        of principals that are explicitly granted the ``permission`` in the\n        provided ``context``.  We do this by walking 'up' the object graph\n        *from the root* to the context.  During this walking process, if we\n        find an explicit :data:`pyramid.security.Allow` ACE for a principal\n        that matches the ``permission``, the principal is included in the allow\n        list.  However, if later in the walking process that principal is\n        mentioned in any :data:`pyramid.security.Deny` ACE for the permission,\n        the principal is removed from the allow list.  If a\n        :data:`pyramid.security.Deny` to the principal\n        :data:`pyramid.security.Everyone` is encountered during the walking\n        process that matches the ``permission``, the allow list is cleared for\n        all principals encountered in previous ACLs.  The walking process ends\n        after we've processed the any ACL directly attached to ``context``; a\n        set of principals is returned.\n\n        \"\"\"\n        allowed = set()\n\n        for location in reversed(list(lineage(context))):\n            # NB: we're walking *up* the object graph from the root\n            try:\n                acl = location.__acl__\n            except AttributeError:\n                continue\n\n            allowed_here = set()\n            denied_here = set()\n\n            if acl and callable(acl):\n                acl = acl()\n\n            for ace_action, ace_principal, ace_permissions in acl:\n                if not is_nonstr_iter(ace_permissions):\n                    ace_permissions = [ace_permissions]\n                if (ace_action == Allow) and (permission in ace_permissions):\n                    if ace_principal not in denied_here:\n                        allowed_here.add(ace_principal)\n                if (ace_action == Deny) and (permission in ace_permissions):\n                    denied_here.add(ace_principal)\n                    if ace_principal == Everyone:\n                        # clear the entire allowed set, as we've hit a\n                        # deny of Everyone ala (Deny, Everyone, ALL)\n                        allowed = set()\n                        break\n                    elif ace_principal in allowed:\n                        allowed.remove(ace_principal)\n\n            allowed.update(allowed_here)\n\n        return allowed\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def identify(self, request):\n        return request.session.get(self.userid_key)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class used for constructing a :term:`security policy` with stores\n    the user identity in a signed cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n        This option is available as of :app:`Pyramid` 1.10.\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='md5',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\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:** `authenticated_userid` Returns Non-String Type Causing Assertion Failure

**Description:**
When a legacy security policy is used, the `authenticated_userid` method returns an integer instead of a string. This leads to assertion failures in tests that expect the user ID to be a string.

**Example Code:**
```python
def test_with_security_policy(self):
    request = _makeRequest()
    _registerSecurityPolicy(request.registry, 123)
    self.assertEqual(request.authenticated_userid, '123')
```

**Expected Behavior:**
The `authenticated_userid` should consistently return a string representation of the user ID, ensuring compatibility and preventing type-related issues.

**Actual Behavior:**
When the security policy is registered with an integer (e.g., `123`), the `authenticated_userid` returns an integer (`123`) instead of a string (`'123'`), causing the assertion to fail.

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

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

--- BEGIN FILE ---
```
### src/pyramid/security.py
from codecs import utf_8_decode
from codecs import utf_8_encode
import hashlib
import base64
import time as time_mod
from urllib.parse import quote, unquote
import warnings
import re

from webob.cookies import CookieProfile

from zope.interface import implementer, providedBy

from pyramid.interfaces import (
    ISecurityPolicy,
    IAuthenticationPolicy,
    IAuthorizationPolicy,
    ISecuredView,
    IView,
    IViewClassifier,
)

from pyramid.location import lineage

from pyramid.util import is_nonstr_iter, strings_differ, bytes_, ascii_, text_

from pyramid.util import SimpleSerializer

from pyramid.threadlocal import get_current_registry

VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$")

Everyone = 'system.Everyone'
Authenticated = 'system.Authenticated'
Allow = 'Allow'
Deny = 'Deny'


class AllPermissionsList(object):
    """ Stand in 'permission list' to represent all permissions """

    def __iter__(self):
        return iter(())

    def __contains__(self, other):
        return True

    def __eq__(self, other):
        return isinstance(other, self.__class__)


ALL_PERMISSIONS = AllPermissionsList()
DENY_ALL = (Deny, Everyone, ALL_PERMISSIONS)

NO_PERMISSION_REQUIRED = '__no_permission_required__'


def _get_security_policy(request):
    return request.registry.queryUtility(ISecurityPolicy)


def _get_authentication_policy(request):
    return request.registry.queryUtility(IAuthenticationPolicy)


def remember(request, userid, **kw):
    """
    Returns a sequence of header tuples (e.g. ``[('Set-Cookie', 'foo=abc')]``)
    on this request's response.
    These headers are suitable for 'remembering' a set of credentials
    implied by the data passed as ``userid`` and ``*kw`` using the
    current :term:`security policy`.  Common usage might look
    like so within the body of a view function (``response`` is
    assumed to be a :term:`WebOb` -style :term:`response` object
    computed previously by the view code):

    .. code-block:: python

       from pyramid.security import remember
       headers = remember(request, 'chrism', password='123', max_age='86400')
       response = request.response
       response.headerlist.extend(headers)
       return response

    If no :term:`security policy` is in use, this function will
    always return an empty sequence. If used, the composition and
    meaning of ``**kw`` must be agreed upon by the calling code and
    the effective security policy.

    .. versionchanged:: 1.6
        Deprecated the ``principal`` argument in favor of ``userid`` to clarify
        its relationship to the authentication policy.

    .. versionchanged:: 1.10
        Removed the deprecated ``principal`` argument.
    """
    policy = _get_security_policy(request)
    if policy is None:
        return []
    return policy.remember(request, userid, **kw)


def forget(request):
    """
    Return a sequence of header tuples (e.g. ``[('Set-Cookie',
    'foo=abc')]``) suitable for 'forgetting' the set of credentials
    possessed by the currently authenticated user.  A common usage
    might look like so within the body of a view function
    (``response`` is assumed to be an :term:`WebOb` -style
    :term:`response` object computed previously by the view code):

    .. code-block:: python

       from pyramid.security import forget
       headers = forget(request)
       response.headerlist.extend(headers)
       return response

    If no :term:`security policy` is in use, this function will
    always return an empty sequence.
    """
    policy = _get_security_policy(request)
    if policy is None:
        return []
    return policy.forget(request)


def principals_allowed_by_permission(context, permission):
    """ Provided a ``context`` (a resource object), and a ``permission``
    string, if an :term:`authorization policy` is
    in effect, return a sequence of :term:`principal` ids that possess
    the permission in the ``context``.  If no authorization policy is
    in effect, this will return a sequence with the single value
    :mod:`pyramid.security.Everyone` (the special principal
    identifier representing all principals).

    .. note::

       Even if an :term:`authorization policy` is in effect,
       some (exotic) authorization policies may not implement the
       required machinery for this function; those will cause a
       :exc:`NotImplementedError` exception to be raised when this
       function is invoked.

    """
    reg = get_current_registry()
    policy = reg.queryUtility(IAuthorizationPolicy)
    if policy is None:
        return [Everyone]
    return policy.principals_allowed_by_permission(context, permission)


def view_execution_permitted(context, request, name=''):
    """ If the view specified by ``context`` and ``name`` is protected
    by a :term:`permission`, check the permission associated with the
    view using the effective authentication/authorization policies and
    the ``request``.  Return a boolean result.  If no
    :term:`authorization policy` is in effect, or if the view is not
    protected by a permission, return ``True``. If no view can view found,
    an exception will be raised.

    .. versionchanged:: 1.4a4
       An exception is raised if no view is found.

    """
    reg = request.registry
    provides = [IViewClassifier] + [providedBy(x) for x in (request, context)]
    # XXX not sure what to do here about using _find_views or analogue;
    # for now let's just keep it as-is
    view = reg.adapters.lookup(provides, ISecuredView, name=name)
    if view is None:
        view = reg.adapters.lookup(provides, IView, name=name)
        if view is None:
            raise TypeError(
                'No registered view satisfies the constraints. '
                'It would not make sense to claim that this view '
                '"is" or "is not" permitted.'
            )
        return Allowed(
            'Allowed: view name %r in context %r (no permission defined)'
            % (name, context)
        )
    return view.__permitted__(context, request)


class PermitsResult(int):
    def __new__(cls, s, *args):
        """
        Create a new instance.

        :param fmt: A format string explaining the reason for denial.
        :param args: Arguments are stored and used with the format string
                      to generate the ``msg``.

        """
        inst = int.__new__(cls, cls.boolval)
        inst.s = s
        inst.args = args
        return inst

    @property
    def msg(self):
        """ A string indicating why the result was generated."""
        return self.s % self.args

    def __str__(self):
        return self.msg

    def __repr__(self):
        return '<%s instance at %s with msg %r>' % (
            self.__class__.__name__,
            id(self),
            self.msg,
        )


class Denied(PermitsResult):
    """
    An instance of ``Denied`` is returned when a security-related
    API or other :app:`Pyramid` code denies an action unrelated to
    an ACL check.  It evaluates equal to all boolean false types.  It
    has an attribute named ``msg`` describing the circumstances for
    the deny.

    """

    boolval = 0


class Allowed(PermitsResult):
    """
    An instance of ``Allowed`` is returned when a security-related
    API or other :app:`Pyramid` code allows an action unrelated to
    an ACL check.  It evaluates equal to all boolean true types.  It
    has an attribute named ``msg`` describing the circumstances for
    the allow.

    """

    boolval = 1


class ACLPermitsResult(PermitsResult):
    def __new__(cls, ace, acl, permission, principals, context):
        """
        Create a new instance.

        :param ace: The :term:`ACE` that matched, triggering the result.
        :param acl: The :term:`ACL` containing ``ace``.
        :param permission: The required :term:`permission`.
        :param principals: The list of :term:`principals <principal>` provided.
        :param context: The :term:`context` providing the :term:`lineage`
                        searched.

        """
        fmt = (
            '%s permission %r via ACE %r in ACL %r on context %r for '
            'principals %r'
        )
        inst = PermitsResult.__new__(
            cls, fmt, cls.__name__, permission, ace, acl, context, principals
        )
        inst.permission = permission
        inst.ace = ace
        inst.acl = acl
        inst.principals = principals
        inst.context = context
        return inst


class ACLDenied(ACLPermitsResult, Denied):
    """
    An instance of ``ACLDenied`` is a specialization of
    :class:`pyramid.security.Denied` that represents that a security check
    made explicitly against ACL was denied.  It evaluates equal to all
    boolean false types.  It also has the following attributes: ``acl``,
    ``ace``, ``permission``, ``principals``, and ``context``.  These
    attributes indicate the security values involved in the request.  Its
    ``__str__`` method prints a summary of these attributes for debugging
    purposes. The same summary is available as the ``msg`` attribute.

    """


class ACLAllowed(ACLPermitsResult, Allowed):
    """
    An instance of ``ACLAllowed`` is a specialization of
    :class:`pyramid.security.Allowed` that represents that a security check
    made explicitly against ACL was allowed.  It evaluates equal to all
    boolean true types.  It also has the following attributes: ``acl``,
    ``ace``, ``permission``, ``principals``, and ``context``.  These
    attributes indicate the security values involved in the request.  Its
    ``__str__`` method prints a summary of these attributes for debugging
    purposes. The same summary is available as the ``msg`` attribute.

    """


class SecurityAPIMixin(object):
    @property
    def identity(self):
        """
        Return an opaque object identifying the current user or ``None`` if no
        user is authenticated or there is no :term:`security policy` in effect.

        """
        policy = _get_security_policy(self)
        if policy is None:
            return None
        return policy.identify(self)

    def has_permission(self, permission, context=None):
        """ Given a permission and an optional context, returns an instance of
        :data:`pyramid.security.Allowed` if the permission is granted to this
        request with the provided context, or the context already associated
        with the request.  Otherwise, returns an instance of
        :data:`pyramid.security.Denied`.  This method delegates to the current
        security policy.  Returns
        :data:`pyramid.security.Allowed` unconditionally if no security
        policy has been registered for this request.  If ``context`` is not
        supplied or is supplied as ``None``, the context used is the
        ``request.context`` attribute.

        :param permission: Does this request have the given permission?
        :type permission: str
        :param context: A resource object or ``None``
        :type context: object
        :returns: Either :class:`pyramid.security.Allowed` or
                  :class:`pyramid.security.Denied`.

        """
        if context is None:
            context = self.context
        policy = _get_security_policy(self)
        if policy is None:
            return Allowed('No security policy in use.')
        identity = policy.identify(self)
        return policy.permits(self, context, identity, permission)


class AuthenticationAPIMixin(object):
    @property
    def authenticated_userid(self):
        """ Return the userid of the currently authenticated user or
        ``None`` if there is no :term:`authentication policy` in effect or
        there is no currently authenticated user.

        .. deprecated:: 2.0

            Use ``request.identity`` instead.

        """
        authn = _get_authentication_policy(self)
        security = _get_security_policy(self)
        if authn is not None:
            return authn.authenticated_userid(self)
        elif security is not None:
            return security.identify(self)
        else:
            return None

    @property
    def unauthenticated_userid(self):
        """ Return an object which represents the *claimed* (not verified) user
        id of the credentials present in the request. ``None`` if there is no
        :term:`authentication policy` in effect or there is no user data
        associated with the current request.  This differs from
        :attr:`~pyramid.request.Request.authenticated_userid`, because the
        effective authentication policy will not ensure that a record
        associated with the userid exists in persistent storage.

        .. deprecated:: 2.0

            Use ``request.identity`` instead.

        """
        authn = _get_authentication_policy(self)
        security = _get_security_policy(self)
        if authn is not None:
            return authn.unauthenticated_userid(self)
        elif security is not None:
            return security.identify(self)
        else:
            return None

    @property
    def effective_principals(self):
        """ Return the list of 'effective' :term:`principal` identifiers
        for the ``request``. If no :term:`authentication policy` is in effect,
        this will return a one-element list containing the
        :data:`pyramid.security.Everyone` principal.

        .. deprecated:: 2.0

        """
        policy = _get_authentication_policy(self)
        if policy is None:
            return [Everyone]
        return policy.effective_principals(self)


@implementer(ISecurityPolicy)
class LegacySecurityPolicy:
    """
    A :term:`security policy` which provides a backwards compatibility shim for
    the :term:`authentication policy` and the :term:`authorization policy`.

    """

    def _get_authn_policy(self, request):
        return request.registry.getUtility(IAuthenticationPolicy)

    def _get_authz_policy(self, request):
        return request.registry.getUtility(IAuthorizationPolicy)

    def identify(self, request):
        authn = self._get_authn_policy(request)
        return authn.authenticated_userid(request)

    def remember(self, request, userid, **kw):
        authn = self._get_authn_policy(request)
        return authn.remember(request, userid, **kw)

    def forget(self, request):
        authn = self._get_authn_policy(request)
        return authn.forget(request)

    def permits(self, request, context, identity, permission):
        authn = self._get_authn_policy(request)
        authz = self._get_authz_policy(request)
        principals = authn.effective_principals(request)
        return authz.permits(context, principals, permission)


class ACLHelper:
    """ A helper for use with constructing a :term:`security policy` which
    consults an :term:`ACL` object attached to a :term:`context` to determine
    authorization information about a :term:`principal` or multiple principals.
    If the context is part of a :term:`lineage`, the context's parents are
    consulted for ACL information too.

    """

    def permits(self, context, principals, permission):
        """ Return an instance of :class:`pyramid.security.ACLAllowed` if the
        ACL allows access a user with the given principals, return an instance
        of :class:`pyramid.security.ACLDenied` if not.

        When checking if principals are allowed, the security policy consults
        the ``context`` for an ACL first.  If no ACL exists on the context, or
        one does exist but the ACL does not explicitly allow or deny access for
        any of the effective principals, consult the context's parent ACL, and
        so on, until the lineage is exhausted or we determine that the policy
        permits or denies.

        During this processing, if any :data:`pyramid.security.Deny`
        ACE is found matching any principal in ``principals``, stop
        processing by returning an
        :class:`pyramid.security.ACLDenied` instance (equals
        ``False``) immediately.  If any
        :data:`pyramid.security.Allow` ACE is found matching any
        principal, stop processing by returning an
        :class:`pyramid.security.ACLAllowed` instance (equals
        ``True``) immediately.  If we exhaust the context's
        :term:`lineage`, and no ACE has explicitly permitted or denied
        access, return an instance of
        :class:`pyramid.security.ACLDenied` (equals ``False``).

        """
        acl = '<No ACL found on any object in resource lineage>'

        for location in lineage(context):
            try:
                acl = location.__acl__
            except AttributeError:
                continue

            if acl and callable(acl):
                acl = acl()

            for ace in acl:
                ace_action, ace_principal, ace_permissions = ace
                if ace_principal in principals:
                    if not is_nonstr_iter(ace_permissions):
                        ace_permissions = [ace_permissions]
                    if permission in ace_permissions:
                        if ace_action == Allow:
                            return ACLAllowed(
                                ace, acl, permission, principals, location
                            )
                        else:
                            return ACLDenied(
                                ace, acl, permission, principals, location
                            )

        # default deny (if no ACL in lineage at all, or if none of the
        # principals were mentioned in any ACE we found)
        return ACLDenied(
            '<default deny>', acl, permission, principals, context
        )

    def principals_allowed_by_permission(self, context, permission):
        """ Return the set of principals explicitly granted the permission
        named ``permission`` according to the ACL directly attached to the
        ``context`` as well as inherited ACLs based on the :term:`lineage`.

        When computing principals allowed by a permission, we compute the set
        of principals that are explicitly granted the ``permission`` in the
        provided ``context``.  We do this by walking 'up' the object graph
        *from the root* to the context.  During this walking process, if we
        find an explicit :data:`pyramid.security.Allow` ACE for a principal
        that matches the ``permission``, the principal is included in the allow
        list.  However, if later in the walking process that principal is
        mentioned in any :data:`pyramid.security.Deny` ACE for the permission,
        the principal is removed from the allow list.  If a
        :data:`pyramid.security.Deny` to the principal
        :data:`pyramid.security.Everyone` is encountered during the walking
        process that matches the ``permission``, the allow list is cleared for
        all principals encountered in previous ACLs.  The walking process ends
        after we've processed the any ACL directly attached to ``context``; a
        set of principals is returned.

        """
        allowed = set()

        for location in reversed(list(lineage(context))):
            # NB: we're walking *up* the object graph from the root
            try:
                acl = location.__acl__
            except AttributeError:
                continue

            allowed_here = set()
            denied_here = set()

            if acl and callable(acl):
                acl = acl()

            for ace_action, ace_principal, ace_permissions in acl:
                if not is_nonstr_iter(ace_permissions):
                    ace_permissions = [ace_permissions]
                if (ace_action == Allow) and (permission in ace_permissions):
                    if ace_principal not in denied_here:
                        allowed_here.add(ace_principal)
                if (ace_action == Deny) and (permission in ace_permissions):
                    denied_here.add(ace_principal)
                    if ace_principal == Everyone:
                        # clear the entire allowed set, as we've hit a
                        # deny of Everyone ala (Deny, Everyone, ALL)
                        allowed = set()
                        break
                    elif ace_principal in allowed:
                        allowed.remove(ace_principal)

            allowed.update(allowed_here)

        return allowed


class SessionAuthenticationHelper:
    """ A helper for use with a :term:`security policy` which stores user data
    in the configured :term:`session`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    """

    def __init__(self, prefix='auth.'):
        self.userid_key = prefix + 'userid'

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        request.session[self.userid_key] = userid
        return []

    def forget(self, request):
        """ Remove the stored userid from the session."""
        if self.userid_key in request.session:
            del request.session[self.userid_key]
        return []

    def identify(self, request):
        return request.session.get(self.userid_key)


def b64encode(v):
    return base64.b64encode(bytes_(v)).strip().replace(b'\n', b'')


def b64decode(v):
    return base64.b64decode(bytes_(v))


# this class licensed under the MIT license (stolen from Paste)
class AuthTicket(object):
    """
    This class represents an authentication token.  You must pass in
    the shared secret, the userid, and the IP address.  Optionally you
    can include tokens (a list of strings, representing role names),
    'user_data', which is arbitrary data available for your own use in
    later scripts.  Lastly, you can override the cookie name and
    timestamp.

    Once you provide all the arguments, use .cookie_value() to
    generate the appropriate authentication ticket.

    Usage::

        token = AuthTicket('sharedsecret', 'username',
            os.environ['REMOTE_ADDR'], tokens=['admin'])
        val = token.cookie_value()

    """

    def __init__(
        self,
        secret,
        userid,
        ip,
        tokens=(),
        user_data='',
        time=None,
        cookie_name='auth_tkt',
        secure=False,
        hashalg='md5',
    ):
        self.secret = secret
        self.userid = userid
        self.ip = ip
        self.tokens = ','.join(tokens)
        self.user_data = user_data
        if time is None:
            self.time = time_mod.time()
        else:
            self.time = time
        self.cookie_name = cookie_name
        self.secure = secure
        self.hashalg = hashalg

    def digest(self):
        return calculate_digest(
            self.ip,
            self.time,
            self.secret,
            self.userid,
            self.tokens,
            self.user_data,
            self.hashalg,
        )

    def cookie_value(self):
        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))
        if self.tokens:
            v += self.tokens + '!'
        v += self.user_data
        return v


# this class licensed under the MIT license (stolen from Paste)
class BadTicket(Exception):
    """
    Exception raised when a ticket can't be parsed.  If we get far enough to
    determine what the expected digest should have been, expected is set.
    This should not be shown by default, but can be useful for debugging.
    """

    def __init__(self, msg, expected=None):
        self.expected = expected
        Exception.__init__(self, msg)


# this function licensed under the MIT license (stolen from Paste)
def parse_ticket(secret, ticket, ip, hashalg='md5'):
    """
    Parse the ticket, returning (timestamp, userid, tokens, user_data).

    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised
    with an explanation.
    """
    ticket = text_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size : digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8 :].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else:  # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

    expected = calculate_digest(
        ip, timestamp, secret, userid, tokens, user_data, hashalg
    )

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(expected, digest):
        raise BadTicket(
            'Digest signature is not correct', expected=(expected, digest)
        )

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)


# this function licensed under the MIT license (stolen from Paste)
def calculate_digest(
    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'
):
    secret = bytes_(secret, 'utf-8')
    userid = bytes_(userid, 'utf-8')
    tokens = bytes_(tokens, 'utf-8')
    user_data = bytes_(user_data, 'utf-8')
    hash_obj = hashlib.new(hashalg)

    # Check to see if this is an IPv6 address
    if ':' in ip:
        ip_timestamp = ip + str(int(timestamp))
        ip_timestamp = bytes_(ip_timestamp)
    else:
        # encode_ip_timestamp not required, left in for backwards compatibility
        ip_timestamp = encode_ip_timestamp(ip, timestamp)

    hash_obj.update(
        ip_timestamp + secret + userid + b'\0' + tokens + b'\0' + user_data
    )
    digest = hash_obj.hexdigest()
    hash_obj2 = hashlib.new(hashalg)
    hash_obj2.update(bytes_(digest) + secret)
    return hash_obj2.hexdigest()


# this function licensed under the MIT license (stolen from Paste)
def encode_ip_timestamp(ip, timestamp):
    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))
    t = int(timestamp)
    ts = (
        (t & 0xFF000000) >> 24,
        (t & 0xFF0000) >> 16,
        (t & 0xFF00) >> 8,
        t & 0xFF,
    )
    ts_chars = ''.join(map(chr, ts))
    return bytes_(ip_chars + ts_chars)


class AuthTktCookieHelper:
    """
    A helper class used for constructing a :term:`security policy` with stores
    the user identity in a signed cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option.

        This option is available as of :app:`Pyramid` 1.10.
    """

    parse_ticket = staticmethod(parse_ticket)  # for tests
    AuthTicket = AuthTicket  # for tests
    BadTicket = BadTicket  # for tests
    now = None  # for tests

    userid_type_decoders = {
        'int': int,
        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies
        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],
        'b64str': lambda x: b64decode(x),
    }

    userid_type_encoders = {
        int: ('int', str),
        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        bytes: ('b64str', lambda x: b64encode(x)),
    }

    def __init__(
        self,
        secret,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        http_only=False,
        path="/",
        wild_domain=True,
        hashalg='md5',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie_profile = CookieProfile(
            cookie_name=cookie_name,
            secure=secure,
            max_age=max_age,
            httponly=http_only,
            path=path,
            serializer=SimpleSerializer(),
            samesite=samesite,
        )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout if timeout is None else int(timeout)
        self.reissue_time = (
            reissue_time if reissue_time is None else int(reissue_time)
        )
        self.max_age = max_age if max_age is None else int(max_age)
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

    def _get_cookies(self, request, value, max_age=None):
        cur_domain = request.domain

        domains = []
        if self.domain:
            domains.append(self.domain)
        else:
            if self.parent_domain and cur_domain.count('.') > 1:
                domains.append('.' + cur_domain.split('.', 1)[1])
            else:
                domains.append(None)
                domains.append(cur_domain)
                if self.wild_domain:
                    domains.append('.' + cur_domain)

        profile = self.cookie_profile(request)

        kw = {}
        kw['domains'] = domains
        if max_age is not None:
            kw['max_age'] = max_age

        headers = profile.get_headers(value, **kw)
        return headers

    def identify(self, request):
        """ Return a dictionary with authentication information, or ``None``
        if no valid auth_tkt is attached to ``request``"""
        environ = request.environ
        cookie = request.cookies.get(self.cookie_name)

        if cookie is None:
            return None

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        try:
            timestamp, userid, tokens, user_data = self.parse_ticket(
                self.secret, cookie, remote_addr, self.hashalg
            )
        except self.BadTicket:
            return None

        now = self.now  # service tests

        if now is None:
            now = time_mod.time()

        if self.timeout and ((timestamp + self.timeout) < now):
            # the auth_tkt data has expired
            return None

        userid_typename = 'userid_type:'
        user_data_info = user_data.split('|')
        for datum in filter(None, user_data_info):
            if datum.startswith(userid_typename):
                userid_type = datum[len(userid_typename) :]
                decoder = self.userid_type_decoders.get(userid_type)
                if decoder:
                    userid = decoder(userid)

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if (now - timestamp) > self.reissue_time:
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(
                    request, userid, max_age=self.max_age, tokens=tokens
                )

                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))

                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

        environ['REMOTE_USER_TOKENS'] = tokens
        environ['REMOTE_USER_DATA'] = user_data
        environ['AUTH_TYPE'] = 'cookie'

        identity = {}
        identity['timestamp'] = timestamp
        identity['userid'] = userid
        identity['tokens'] = tokens
        identity['userdata'] = user_data
        return identity

    def forget(self, request):
        """ Return a set of expires Set-Cookie headers, which will destroy
        any existing auth_tkt cookie when attached to a response"""
        request._authtkt_reissue_revoked = True
        return self._get_cookies(request, None)

    def remember(self, request, userid, max_age=None, tokens=()):
        """ Return a set of Set-Cookie headers; when set into a response,
        these headers will represent a valid authentication ticket.

        ``max_age``
          The max age of the auth_tkt cookie, in seconds.  When this value is
          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,
          allowing the auth_tkt cookie to last between browser sessions.  If
          this value is ``None``, the ``max_age`` value provided to the
          helper itself will be used as the ``max_age`` value.  Default:
          ``None``.

        ``tokens``
          A sequence of strings that will be placed into the auth_tkt tokens
          field.  Each string in the sequence must be of the Python ``str``
          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.
          Tokens are available in the returned identity when an auth_tkt is
          found in the request and unpacked.  Default: ``()``.
        """
        max_age = self.max_age if max_age is None else int(max_age)

        environ = request.environ

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        user_data = ''

        encoding_data = self.userid_type_encoders.get(type(userid))

        if encoding_data:
            encoding, encoder = encoding_data
        else:
            warnings.warn(
                "userid is of type {}, and is not supported by the "
                "AuthTktAuthenticationPolicy. Explicitly converting to string "
                "and storing as base64. Subsequent requests will receive a "
                "string as the userid, it will not be decoded back to the "
                "type provided.".format(type(userid)),
                RuntimeWarning,
            )
            encoding, encoder = self.userid_type_encoders.get(str)
            userid = str(userid)

        userid = encoder(userid)
        user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, str):
                try:
                    token = ascii_(token)
                except UnicodeEncodeError:
                    raise ValueError("Invalid token %r" % (token,))
            if not (isinstance(token, str) and VALID_TOKEN.match(token)):
                raise ValueError("Invalid token %r" % (token,))
            new_tokens.append(token)
        tokens = tuple(new_tokens)

        if hasattr(request, '_authtkt_reissued'):
            request._authtkt_reissue_revoked = True

        ticket = self.AuthTicket(
            self.secret,
            userid,
            remote_addr,
            tokens=tokens,
            user_data=user_data,
            cookie_name=self.cookie_name,
            secure=self.secure,
            hashalg=self.hashalg,
        )

        cookie_value = ticket.cookie_value()
        return self._get_cookies(request, cookie_value, max_age)

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