{
    "file_diffs": [
        {
            "old_file_content": "unreleased\n==========\n\nBackward Incompatibilities\n--------------------------\n\n - Following the Pyramid deprecation period (1.6 -> 1.8),\n   daemon support for pserve has been removed. This includes removing the\n   daemon commands (start, stop, restart, status) as well as the following\n   arguments:\n   --daemon --pid-file --log-file --monitor-restart --status --user --group\n   --stop-daemon\n\n   To run your server as a daemon you should use a process manager instead of\n   pserve.\n\n   See https://github.com/Pylons/pyramid/pull/2615\n\n- ``pcreate`` is now interactive by default. You will be prompted if\n  a file already exists with different content. Previously if there were\n  similar files it would silently skip them unless you specified\n  ``--interactive`` or ``--overwrite``.\n  See https://github.com/Pylons/pyramid/pull/2775\n\n- Removed undocumented argument ``cachebust_match`` from\n  ``pyramid.static.static_view``. This argument was shipped accidentally\n  in Pyramid 1.6. See https://github.com/Pylons/pyramid/pull/2681\n\n- Change static view to avoid setting the ``Content-Encoding`` response header\n  to an encoding guessed using Python's ``mimetypes`` module. This was causing\n  clients to decode the content of gzipped files when downloading them. The\n  client would end up with a ``foo.txt.gz`` file on disk that was already\n  decoded, thus should really be ``foo.txt``. Also, the ``Content-Encoding``\n  should only have been used if the client itself broadcast support for the\n  encoding via ``Accept-Encoding`` request headers.\n  See https://github.com/Pylons/pyramid/pull/2810\n\n- Settings are no longer accessible as attributes on the settings object\n  (e.g. ``request.registry.settings.foo``). This was deprecated in Pyramid 1.2.\n  See https://github.com/Pylons/pyramid/pull/2823\n\nFeatures\n--------\n\n- Python 3.6 compatibility.\n  https://github.com/Pylons/pyramid/issues/2835\n\n- pcreate learned about --package-name to allow you to create a new project in\n  an existing folder with a different package name than the project name. See\n  https://github.com/Pylons/pyramid/pull/2783\n\n- The `_get_credentials` private method of `BasicAuthAuthenticationPolicy`\n  has been extracted into standalone function ``extract_http_basic_credentials`\n  in `pyramid.authentication` module, this function extracts HTTP Basic\n  credentials from a ``request`` object, and returns them as a named tuple.\n  See https://github.com/Pylons/pyramid/pull/2662\n\n- Pyramid 1.4 silently dropped a feature of the configurator that has been\n  restored. It's again possible for action discriminators to conflict across\n  different action orders.\n  See https://github.com/Pylons/pyramid/pull/2757\n\n- ``pyramid.paster.bootstrap`` and its sibling ``pyramid.scripting.prepare``\n  can now be used as context managers to automatically invoke the ``closer``\n  and pop threadlocals off of the stack to prevent memory leaks.\n  See https://github.com/Pylons/pyramid/pull/2760\n\n- Added ``pyramid.config.Configurator.add_exception_view`` and the\n  ``pyramid.view.exception_view_config`` decorator. It is now possible using\n  these methods or via the new ``exception_only=True`` option to ``add_view``\n  to add a view which will only be matched when handling an exception.\n  Previously any exception views were also registered for a traversal\n  context that inherited from the exception class which prevented any\n  exception-only optimizations.\n  See https://github.com/Pylons/pyramid/pull/2660\n\n- Added the ``exception_only`` boolean to\n  ``pyramid.interfaces.IViewDeriverInfo`` which can be used by view derivers\n  to determine if they are wrapping a view which only handles exceptions.\n  This means that it is no longer necessary to perform request-time checks\n  for ``request.exception`` to determine if the view is handling an exception\n  - the pipeline can be optimized at config-time.\n  See https://github.com/Pylons/pyramid/pull/2660\n\n- ``pserve`` should now work with ``gevent`` and other workers that need\n  to monkeypatch the process, assuming the server and / or the app do so\n  as soon as possible before importing the rest of pyramid.\n  See https://github.com/Pylons/pyramid/pull/2797\n\n- Pyramid no longer copies the settings object passed to the\n  ``pyramid.config.Configurator(settings=)``. The original ``dict`` is kept.\n  See https://github.com/Pylons/pyramid/pull/2823\n\n- The csrf trusted origins setting may now be a whitespace-separated list of\n  domains. Previously only a python list was allowed. Also, it can now be set\n  using the ``PYRAMID_CSRF_TRUSTED_ORIGINS`` environment variable similar to\n  other settings. See https://github.com/Pylons/pyramid/pull/2823\n\n- ``pserve --reload`` now uses the\n  `hupper <http://docs.pylonsproject.org/projects/hupper/en/latest/>`\n  library to monitor file changes. This comes with many improvements:\n\n  - If the `watchdog <http://pythonhosted.org/watchdog/>`_ package is\n    installed then monitoring will be done using inotify instead of\n    cpu and disk-intensive polling.\n\n  - The monitor is now a separate process that will not crash and starts up\n    before any of your code.\n\n  - The monitor will not restart the process after a crash until a file is\n    saved.\n\n  - The monitor works on windows.\n\n  - You can now trigger a reload manually from a pyramid view or any other\n    code via ``hupper.get_reloader().trigger_reload()``. Kind of neat.\n\n  - You can trigger a reload by issuing a ``SIGHUP`` to the monitor process.\n\n  See https://github.com/Pylons/pyramid/pull/2805\n\n- A new ``[pserve]`` section is supported in your config files with a\n  ``watch_files`` key that can configure ``pserve --reload`` to monitor custom\n  file paths. See https://github.com/Pylons/pyramid/pull/2827\n\n- Allow streaming responses to be made from subclasses of\n  ``pyramid.httpexceptions.HTTPException``. Previously the response would\n  be unrolled while testing for a body, making it impossible to stream\n  a response.\n  See https://github.com/Pylons/pyramid/pull/2863\n\nBug Fixes\n---------\n\n- Fixed bug in `proutes` such that it now shows the correct view when a class\n  and `attr` is involved.\n  See: https://github.com/Pylons/pyramid/pull/2687\n\n- Fix a ``FutureWarning`` in Python 3.5 when using ``re.split`` on the\n  ``format`` setting to the ``proutes`` script.\n  See https://github.com/Pylons/pyramid/pull/2714\n\n- Fix a ``RuntimeWarning`` emitted by WebOb when using arbitrary objects\n  as the ``userid`` in the ``AuthTktAuthenticationPolicy``. This is now caught\n  by the policy and the object is serialized as a base64 string to avoid\n  the cryptic warning. Since the userid will be read back as a string on\n  subsequent requests a more useful warning is emitted encouraging you to\n  use a primitive type instead.\n  See https://github.com/Pylons/pyramid/pull/2715\n\n- Pyramid 1.6 introduced the ability for an action to invoke another action.\n  There was a bug in the way that ``config.add_view`` would interact with\n  custom view derivers introduced in Pyramid 1.7 because the view's\n  discriminator cannot be computed until view derivers and view predicates\n  have been created in earlier orders. Invoking an action from another action\n  would trigger an unrolling of the pipeline and would compute discriminators\n  before they were ready. The new behavior respects the ``order`` of the action\n  and ensures the discriminators are not computed until dependent actions\n  from previous orders have executed.\n  See https://github.com/Pylons/pyramid/pull/2757\n\nDeprecations\n------------\n\nDocumentation Changes\n---------------------\n- Replace Typographical Conventions with an enhanced Style Guide.\n  https://github.com/Pylons/pyramid/pull/2838\n\n- Add pyramid_nacl_session to session factories.\n  See https://github.com/Pylons/pyramid/issues/2791\n\n- Update HACKING.txt from stale branch that was never merged to master.\n  See https://github.com/Pylons/pyramid/pull/2782\n\n- Updated Windows installation instructions and related bits.\n  See https://github.com/Pylons/pyramid/issues/2661\n\n- Fix an inconsistency in the documentation between view predicates and\n  route predicates and highlight the differences in their APIs.\n  See https://github.com/Pylons/pyramid/pull/2764\n\n- Clarify a possible misuse of the ``headers`` kwarg to subclasses of\n  :class:`pyramid.httpexceptions.HTTPException` in which more appropriate\n  kwargs from the parent class :class:`pyramid.response.Response` should be\n  used instead. See https://github.com/Pylons/pyramid/pull/2750\n",
            "new_file_content": "unreleased\n==========\n\nBackward Incompatibilities\n--------------------------\n\n - Following the Pyramid deprecation period (1.6 -> 1.8),\n   daemon support for pserve has been removed. This includes removing the\n   daemon commands (start, stop, restart, status) as well as the following\n   arguments:\n   --daemon --pid-file --log-file --monitor-restart --status --user --group\n   --stop-daemon\n\n   To run your server as a daemon you should use a process manager instead of\n   pserve.\n\n   See https://github.com/Pylons/pyramid/pull/2615\n\n- ``pcreate`` is now interactive by default. You will be prompted if\n  a file already exists with different content. Previously if there were\n  similar files it would silently skip them unless you specified\n  ``--interactive`` or ``--overwrite``.\n  See https://github.com/Pylons/pyramid/pull/2775\n\n- Removed undocumented argument ``cachebust_match`` from\n  ``pyramid.static.static_view``. This argument was shipped accidentally\n  in Pyramid 1.6. See https://github.com/Pylons/pyramid/pull/2681\n\n- Change static view to avoid setting the ``Content-Encoding`` response header\n  to an encoding guessed using Python's ``mimetypes`` module. This was causing\n  clients to decode the content of gzipped files when downloading them. The\n  client would end up with a ``foo.txt.gz`` file on disk that was already\n  decoded, thus should really be ``foo.txt``. Also, the ``Content-Encoding``\n  should only have been used if the client itself broadcast support for the\n  encoding via ``Accept-Encoding`` request headers.\n  See https://github.com/Pylons/pyramid/pull/2810\n\n- Settings are no longer accessible as attributes on the settings object\n  (e.g. ``request.registry.settings.foo``). This was deprecated in Pyramid 1.2.\n  See https://github.com/Pylons/pyramid/pull/2823\n\nFeatures\n--------\n\n- Python 3.6 compatibility.\n  https://github.com/Pylons/pyramid/issues/2835\n\n- pcreate learned about --package-name to allow you to create a new project in\n  an existing folder with a different package name than the project name. See\n  https://github.com/Pylons/pyramid/pull/2783\n\n- The `_get_credentials` private method of `BasicAuthAuthenticationPolicy`\n  has been extracted into standalone function ``extract_http_basic_credentials`\n  in `pyramid.authentication` module, this function extracts HTTP Basic\n  credentials from a ``request`` object, and returns them as a named tuple.\n  See https://github.com/Pylons/pyramid/pull/2662\n\n- Pyramid 1.4 silently dropped a feature of the configurator that has been\n  restored. It's again possible for action discriminators to conflict across\n  different action orders.\n  See https://github.com/Pylons/pyramid/pull/2757\n\n- ``pyramid.paster.bootstrap`` and its sibling ``pyramid.scripting.prepare``\n  can now be used as context managers to automatically invoke the ``closer``\n  and pop threadlocals off of the stack to prevent memory leaks.\n  See https://github.com/Pylons/pyramid/pull/2760\n\n- Added ``pyramid.config.Configurator.add_exception_view`` and the\n  ``pyramid.view.exception_view_config`` decorator. It is now possible using\n  these methods or via the new ``exception_only=True`` option to ``add_view``\n  to add a view which will only be matched when handling an exception.\n  Previously any exception views were also registered for a traversal\n  context that inherited from the exception class which prevented any\n  exception-only optimizations.\n  See https://github.com/Pylons/pyramid/pull/2660\n\n- Added the ``exception_only`` boolean to\n  ``pyramid.interfaces.IViewDeriverInfo`` which can be used by view derivers\n  to determine if they are wrapping a view which only handles exceptions.\n  This means that it is no longer necessary to perform request-time checks\n  for ``request.exception`` to determine if the view is handling an exception\n  - the pipeline can be optimized at config-time.\n  See https://github.com/Pylons/pyramid/pull/2660\n\n- ``pserve`` should now work with ``gevent`` and other workers that need\n  to monkeypatch the process, assuming the server and / or the app do so\n  as soon as possible before importing the rest of pyramid.\n  See https://github.com/Pylons/pyramid/pull/2797\n\n- Pyramid no longer copies the settings object passed to the\n  ``pyramid.config.Configurator(settings=)``. The original ``dict`` is kept.\n  See https://github.com/Pylons/pyramid/pull/2823\n\n- The csrf trusted origins setting may now be a whitespace-separated list of\n  domains. Previously only a python list was allowed. Also, it can now be set\n  using the ``PYRAMID_CSRF_TRUSTED_ORIGINS`` environment variable similar to\n  other settings. See https://github.com/Pylons/pyramid/pull/2823\n\n- ``pserve --reload`` now uses the\n  `hupper <http://docs.pylonsproject.org/projects/hupper/en/latest/>`\n  library to monitor file changes. This comes with many improvements:\n\n  - If the `watchdog <http://pythonhosted.org/watchdog/>`_ package is\n    installed then monitoring will be done using inotify instead of\n    cpu and disk-intensive polling.\n\n  - The monitor is now a separate process that will not crash and starts up\n    before any of your code.\n\n  - The monitor will not restart the process after a crash until a file is\n    saved.\n\n  - The monitor works on windows.\n\n  - You can now trigger a reload manually from a pyramid view or any other\n    code via ``hupper.get_reloader().trigger_reload()``. Kind of neat.\n\n  - You can trigger a reload by issuing a ``SIGHUP`` to the monitor process.\n\n  See https://github.com/Pylons/pyramid/pull/2805\n\n- A new ``[pserve]`` section is supported in your config files with a\n  ``watch_files`` key that can configure ``pserve --reload`` to monitor custom\n  file paths. See https://github.com/Pylons/pyramid/pull/2827\n\n- Allow streaming responses to be made from subclasses of\n  ``pyramid.httpexceptions.HTTPException``. Previously the response would\n  be unrolled while testing for a body, making it impossible to stream\n  a response.\n  See https://github.com/Pylons/pyramid/pull/2863\n\nBug Fixes\n---------\n\n- Fixed bug in `proutes` such that it now shows the correct view when a class\n  and `attr` is involved.\n  See: https://github.com/Pylons/pyramid/pull/2687\n\n- Fix a ``FutureWarning`` in Python 3.5 when using ``re.split`` on the\n  ``format`` setting to the ``proutes`` script.\n  See https://github.com/Pylons/pyramid/pull/2714\n\n- Fix a ``RuntimeWarning`` emitted by WebOb when using arbitrary objects\n  as the ``userid`` in the ``AuthTktAuthenticationPolicy``. This is now caught\n  by the policy and the object is serialized as a base64 string to avoid\n  the cryptic warning. Since the userid will be read back as a string on\n  subsequent requests a more useful warning is emitted encouraging you to\n  use a primitive type instead.\n  See https://github.com/Pylons/pyramid/pull/2715\n\n- Pyramid 1.6 introduced the ability for an action to invoke another action.\n  There was a bug in the way that ``config.add_view`` would interact with\n  custom view derivers introduced in Pyramid 1.7 because the view's\n  discriminator cannot be computed until view derivers and view predicates\n  have been created in earlier orders. Invoking an action from another action\n  would trigger an unrolling of the pipeline and would compute discriminators\n  before they were ready. The new behavior respects the ``order`` of the action\n  and ensures the discriminators are not computed until dependent actions\n  from previous orders have executed.\n  See https://github.com/Pylons/pyramid/pull/2757\n\n- Fix bug in i18n where the default domain would always use the Germanic plural\n  style, even if a different plural function is defined in the relevant messages\n  file.\n  See https://github.com/Pylons/pyramid/pull/2102\n\nDeprecations\n------------\n\nDocumentation Changes\n---------------------\n- Replace Typographical Conventions with an enhanced Style Guide.\n  https://github.com/Pylons/pyramid/pull/2838\n\n- Add pyramid_nacl_session to session factories.\n  See https://github.com/Pylons/pyramid/issues/2791\n\n- Update HACKING.txt from stale branch that was never merged to master.\n  See https://github.com/Pylons/pyramid/pull/2782\n\n- Updated Windows installation instructions and related bits.\n  See https://github.com/Pylons/pyramid/issues/2661\n\n- Fix an inconsistency in the documentation between view predicates and\n  route predicates and highlight the differences in their APIs.\n  See https://github.com/Pylons/pyramid/pull/2764\n\n- Clarify a possible misuse of the ``headers`` kwarg to subclasses of\n  :class:`pyramid.httpexceptions.HTTPException` in which more appropriate\n  kwargs from the parent class :class:`pyramid.response.Response` should be\n  used instead. See https://github.com/Pylons/pyramid/pull/2750\n",
            "header": {
                "file": {
                    "path": "CHANGES.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "11eab9f26",
                "new_commit_hash": "0a810a0d6",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/CHANGES.txt"
            },
            "plus_file": {
                "path": "b/CHANGES.txt"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 159,
                            "length": 6
                        },
                        "new_range": {
                            "start": 159,
                            "length": 11
                        },
                        "section": "Bug Fixes"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "  from previous orders have executed.",
                                "type": "context"
                            },
                            {
                                "content": "  See https://github.com/Pylons/pyramid/pull/2757",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- Fix bug in i18n where the default domain would always use the Germanic plural",
                                "type": "added"
                            },
                            {
                                "content": "  style, even if a different plural function is defined in the relevant messages",
                                "type": "added"
                            },
                            {
                                "content": "  file.",
                                "type": "added"
                            },
                            {
                                "content": "  See https://github.com/Pylons/pyramid/pull/2102",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "Deprecations",
                                "type": "context"
                            },
                            {
                                "content": "------------",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import gettext\nimport os\n\nfrom translationstring import (\n    Translator,\n    Pluralizer,\n    TranslationString, # API\n    TranslationStringFactory, # API\n    )\n\nfrom pyramid.compat import PY2\nfrom pyramid.decorator import reify\n\nfrom pyramid.interfaces import (\n    ILocalizer,\n    ITranslationDirectories,\n    ILocaleNegotiator,\n    )\n\nfrom pyramid.threadlocal import get_current_registry\n\nTranslationString = TranslationString  # PyFlakes\nTranslationStringFactory = TranslationStringFactory  # PyFlakes\n\n\nclass Localizer(object):\n    \"\"\"\n    An object providing translation and pluralizations related to\n    the current request's locale name.  A\n    :class:`pyramid.i18n.Localizer` object is created using the\n    :func:`pyramid.i18n.get_localizer` function.\n    \"\"\"\n    def __init__(self, locale_name, translations):\n        self.locale_name = locale_name\n        self.translations = translations\n        self.pluralizer = None\n        self.translator = None\n\n    def translate(self, tstring, domain=None, mapping=None):\n        \"\"\"\n        Translate a :term:`translation string` to the current language\n        and interpolate any *replacement markers* in the result.  The\n        ``translate`` method accepts three arguments: ``tstring``\n        (required), ``domain`` (optional) and ``mapping`` (optional).\n        When called, it will translate the ``tstring`` translation\n        string to a ``unicode`` object using the current locale.  If\n        the current locale could not be determined, the result of\n        interpolation of the default value is returned.  The optional\n        ``domain`` argument can be used to specify or override the\n        domain of the ``tstring`` (useful when ``tstring`` is a normal\n        string rather than a translation string).  The optional\n        ``mapping`` argument can specify or override the ``tstring``\n        interpolation mapping, useful when the ``tstring`` argument is\n        a simple string instead of a translation string.\n\n        Example::\n\n           from pyramid.18n import TranslationString\n           ts = TranslationString('Add ${item}', domain='mypackage',\n                                  mapping={'item':'Item'})\n           translated = localizer.translate(ts)\n\n        Example::\n\n           translated = localizer.translate('Add ${item}', domain='mypackage',\n                                            mapping={'item':'Item'})\n\n        \"\"\"\n        if self.translator is None:\n            self.translator = Translator(self.translations)\n        return self.translator(tstring, domain=domain, mapping=mapping)\n\n    def pluralize(self, singular, plural, n, domain=None, mapping=None):\n        \"\"\"\n        Return a Unicode string translation by using two\n        :term:`message identifier` objects as a singular/plural pair\n        and an ``n`` value representing the number that appears in the\n        message using gettext plural forms support.  The ``singular``\n        and ``plural`` objects should be unicode strings. There is no\n        reason to use translation string objects as arguments as all\n        metadata is ignored.\n        \n        ``n`` represents the number of elements. ``domain`` is the\n        translation domain to use to do the pluralization, and ``mapping``\n        is the interpolation mapping that should be used on the result. If\n        the ``domain`` is not supplied, a default domain is used (usually\n        ``messages``).\n        \n        Example::\n\n           num = 1\n           translated = localizer.pluralize('Add ${num} item',\n                                            'Add ${num} items',\n                                            num,\n                                            mapping={'num':num})\n\n        If using the gettext plural support, which is required for\n        languages that have pluralisation rules other than n != 1, the\n        ``singular`` argument must be the message_id defined in the\n        translation file. The plural argument is not used in this case.\n\n        Example::\n\n           num = 1\n           translated = localizer.pluralize('item_plural',\n                                            '',\n                                            num,\n                                            mapping={'num':num})\n\n        \n        \"\"\"\n        if self.pluralizer is None:\n            self.pluralizer = Pluralizer(self.translations)\n        return self.pluralizer(singular, plural, n, domain=domain,\n                               mapping=mapping)\n\n\ndef default_locale_negotiator(request):\n    \"\"\" The default :term:`locale negotiator`.  Returns a locale name\n    or ``None``.\n\n    - First, the negotiator looks for the ``_LOCALE_`` attribute of\n      the request object (possibly set by a view or a listener for an\n      :term:`event`). If the attribute exists and it is not ``None``,\n      its value will be used.\n  \n    - Then it looks for the ``request.params['_LOCALE_']`` value.\n\n    - Then it looks for the ``request.cookies['_LOCALE_']`` value.\n\n    - Finally, the negotiator returns ``None`` if the locale could not\n      be determined via any of the previous checks (when a locale\n      negotiator returns ``None``, it signifies that the\n      :term:`default locale name` should be used.)\n    \"\"\"\n    name = '_LOCALE_'\n    locale_name = getattr(request, name, None)\n    if locale_name is None:\n        locale_name = request.params.get(name)\n        if locale_name is None:\n            locale_name = request.cookies.get(name)\n    return locale_name\n\ndef negotiate_locale_name(request):\n    \"\"\" Negotiate and return the :term:`locale name` associated with\n    the current request.\"\"\"\n    try:\n        registry = request.registry\n    except AttributeError:\n        registry = get_current_registry()\n    negotiator = registry.queryUtility(ILocaleNegotiator,\n                                       default=default_locale_negotiator)\n    locale_name = negotiator(request)\n\n    if locale_name is None:\n        settings = registry.settings or {}\n        locale_name = settings.get('default_locale_name', 'en')\n\n    return locale_name\n\ndef get_locale_name(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :attr:`pyramid.request.Request.locale_name` directly instead.\n        Return the :term:`locale name` associated with the current request.\n    \"\"\"\n    return request.locale_name\n\ndef make_localizer(current_locale_name, translation_directories):\n    \"\"\" Create a :class:`pyramid.i18n.Localizer` object\n    corresponding to the provided locale name from the \n    translations found in the list of translation directories.\"\"\"\n    translations = Translations()\n    translations._catalog = {}\n\n    locales_to_try = []\n    if '_' in current_locale_name:\n        locales_to_try = [current_locale_name.split('_')[0]]\n    locales_to_try.append(current_locale_name)\n\n    # intent: order locales left to right in least specific to most specific,\n    # e.g. ['de', 'de_DE'].  This services the intent of creating a\n    # translations object that returns a \"more specific\" translation for a\n    # region, but will fall back to a \"less specific\" translation for the\n    # locale if necessary.  Ordering from least specific to most specific\n    # allows us to call translations.add in the below loop to get this\n    # behavior.\n\n    for tdir in translation_directories:\n        locale_dirs = []\n        for lname in locales_to_try:\n            ldir = os.path.realpath(os.path.join(tdir, lname))\n            if os.path.isdir(ldir):\n                locale_dirs.append(ldir)\n\n        for locale_dir in locale_dirs:\n            messages_dir = os.path.join(locale_dir, 'LC_MESSAGES')\n            if not os.path.isdir(os.path.realpath(messages_dir)):\n                continue\n            for mofile in os.listdir(messages_dir):\n                mopath = os.path.realpath(os.path.join(messages_dir,\n                                                       mofile))\n                if mofile.endswith('.mo') and os.path.isfile(mopath):\n                    with open(mopath, 'rb') as mofp:\n                        domain = mofile[:-3]\n                        dtrans = Translations(mofp, domain)\n                        translations.add(dtrans)\n\n    return Localizer(locale_name=current_locale_name,\n                          translations=translations)\n\ndef get_localizer(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use the :attr:`pyramid.request.Request.localizer` attribute directly\n        instead.  Retrieve a :class:`pyramid.i18n.Localizer` object\n        corresponding to the current request's locale name.\n    \"\"\"\n    return request.localizer\n\nclass Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        self.plural = lambda n: int(n != 1) \n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)\n\nclass LocalizerRequestMixin(object):\n    @reify\n    def localizer(self):\n        \"\"\" Convenience property to return a localizer \"\"\"\n        registry = self.registry\n\n        current_locale_name = self.locale_name\n        localizer = registry.queryUtility(ILocalizer, name=current_locale_name)\n\n        if localizer is None:\n            # no localizer utility registered yet\n            tdirs = registry.queryUtility(ITranslationDirectories, default=[])\n            localizer = make_localizer(current_locale_name, tdirs)\n\n            registry.registerUtility(localizer, ILocalizer,\n                                     name=current_locale_name)\n\n        return localizer\n\n    @reify\n    def locale_name(self):\n        locale_name = negotiate_locale_name(self)\n        return locale_name\n        \n    \n",
            "new_file_content": "import gettext\nimport os\n\nfrom translationstring import (\n    Translator,\n    Pluralizer,\n    TranslationString, # API\n    TranslationStringFactory, # API\n    )\n\nfrom pyramid.compat import PY2\nfrom pyramid.decorator import reify\n\nfrom pyramid.interfaces import (\n    ILocalizer,\n    ITranslationDirectories,\n    ILocaleNegotiator,\n    )\n\nfrom pyramid.threadlocal import get_current_registry\n\nTranslationString = TranslationString  # PyFlakes\nTranslationStringFactory = TranslationStringFactory  # PyFlakes\n\nDEFAULT_PLURAL = lambda n: int(n != 1)\n\nclass Localizer(object):\n    \"\"\"\n    An object providing translation and pluralizations related to\n    the current request's locale name.  A\n    :class:`pyramid.i18n.Localizer` object is created using the\n    :func:`pyramid.i18n.get_localizer` function.\n    \"\"\"\n    def __init__(self, locale_name, translations):\n        self.locale_name = locale_name\n        self.translations = translations\n        self.pluralizer = None\n        self.translator = None\n\n    def translate(self, tstring, domain=None, mapping=None):\n        \"\"\"\n        Translate a :term:`translation string` to the current language\n        and interpolate any *replacement markers* in the result.  The\n        ``translate`` method accepts three arguments: ``tstring``\n        (required), ``domain`` (optional) and ``mapping`` (optional).\n        When called, it will translate the ``tstring`` translation\n        string to a ``unicode`` object using the current locale.  If\n        the current locale could not be determined, the result of\n        interpolation of the default value is returned.  The optional\n        ``domain`` argument can be used to specify or override the\n        domain of the ``tstring`` (useful when ``tstring`` is a normal\n        string rather than a translation string).  The optional\n        ``mapping`` argument can specify or override the ``tstring``\n        interpolation mapping, useful when the ``tstring`` argument is\n        a simple string instead of a translation string.\n\n        Example::\n\n           from pyramid.18n import TranslationString\n           ts = TranslationString('Add ${item}', domain='mypackage',\n                                  mapping={'item':'Item'})\n           translated = localizer.translate(ts)\n\n        Example::\n\n           translated = localizer.translate('Add ${item}', domain='mypackage',\n                                            mapping={'item':'Item'})\n\n        \"\"\"\n        if self.translator is None:\n            self.translator = Translator(self.translations)\n        return self.translator(tstring, domain=domain, mapping=mapping)\n\n    def pluralize(self, singular, plural, n, domain=None, mapping=None):\n        \"\"\"\n        Return a Unicode string translation by using two\n        :term:`message identifier` objects as a singular/plural pair\n        and an ``n`` value representing the number that appears in the\n        message using gettext plural forms support.  The ``singular``\n        and ``plural`` objects should be unicode strings. There is no\n        reason to use translation string objects as arguments as all\n        metadata is ignored.\n        \n        ``n`` represents the number of elements. ``domain`` is the\n        translation domain to use to do the pluralization, and ``mapping``\n        is the interpolation mapping that should be used on the result. If\n        the ``domain`` is not supplied, a default domain is used (usually\n        ``messages``).\n        \n        Example::\n\n           num = 1\n           translated = localizer.pluralize('Add ${num} item',\n                                            'Add ${num} items',\n                                            num,\n                                            mapping={'num':num})\n\n        If using the gettext plural support, which is required for\n        languages that have pluralisation rules other than n != 1, the\n        ``singular`` argument must be the message_id defined in the\n        translation file. The plural argument is not used in this case.\n\n        Example::\n\n           num = 1\n           translated = localizer.pluralize('item_plural',\n                                            '',\n                                            num,\n                                            mapping={'num':num})\n\n        \n        \"\"\"\n        if self.pluralizer is None:\n            self.pluralizer = Pluralizer(self.translations)\n        return self.pluralizer(singular, plural, n, domain=domain,\n                               mapping=mapping)\n\n\ndef default_locale_negotiator(request):\n    \"\"\" The default :term:`locale negotiator`.  Returns a locale name\n    or ``None``.\n\n    - First, the negotiator looks for the ``_LOCALE_`` attribute of\n      the request object (possibly set by a view or a listener for an\n      :term:`event`). If the attribute exists and it is not ``None``,\n      its value will be used.\n  \n    - Then it looks for the ``request.params['_LOCALE_']`` value.\n\n    - Then it looks for the ``request.cookies['_LOCALE_']`` value.\n\n    - Finally, the negotiator returns ``None`` if the locale could not\n      be determined via any of the previous checks (when a locale\n      negotiator returns ``None``, it signifies that the\n      :term:`default locale name` should be used.)\n    \"\"\"\n    name = '_LOCALE_'\n    locale_name = getattr(request, name, None)\n    if locale_name is None:\n        locale_name = request.params.get(name)\n        if locale_name is None:\n            locale_name = request.cookies.get(name)\n    return locale_name\n\ndef negotiate_locale_name(request):\n    \"\"\" Negotiate and return the :term:`locale name` associated with\n    the current request.\"\"\"\n    try:\n        registry = request.registry\n    except AttributeError:\n        registry = get_current_registry()\n    negotiator = registry.queryUtility(ILocaleNegotiator,\n                                       default=default_locale_negotiator)\n    locale_name = negotiator(request)\n\n    if locale_name is None:\n        settings = registry.settings or {}\n        locale_name = settings.get('default_locale_name', 'en')\n\n    return locale_name\n\ndef get_locale_name(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :attr:`pyramid.request.Request.locale_name` directly instead.\n        Return the :term:`locale name` associated with the current request.\n    \"\"\"\n    return request.locale_name\n\ndef make_localizer(current_locale_name, translation_directories):\n    \"\"\" Create a :class:`pyramid.i18n.Localizer` object\n    corresponding to the provided locale name from the \n    translations found in the list of translation directories.\"\"\"\n    translations = Translations()\n    translations._catalog = {}\n\n    locales_to_try = []\n    if '_' in current_locale_name:\n        locales_to_try = [current_locale_name.split('_')[0]]\n    locales_to_try.append(current_locale_name)\n\n    # intent: order locales left to right in least specific to most specific,\n    # e.g. ['de', 'de_DE'].  This services the intent of creating a\n    # translations object that returns a \"more specific\" translation for a\n    # region, but will fall back to a \"less specific\" translation for the\n    # locale if necessary.  Ordering from least specific to most specific\n    # allows us to call translations.add in the below loop to get this\n    # behavior.\n\n    for tdir in translation_directories:\n        locale_dirs = []\n        for lname in locales_to_try:\n            ldir = os.path.realpath(os.path.join(tdir, lname))\n            if os.path.isdir(ldir):\n                locale_dirs.append(ldir)\n\n        for locale_dir in locale_dirs:\n            messages_dir = os.path.join(locale_dir, 'LC_MESSAGES')\n            if not os.path.isdir(os.path.realpath(messages_dir)):\n                continue\n            for mofile in os.listdir(messages_dir):\n                mopath = os.path.realpath(os.path.join(messages_dir,\n                                                       mofile))\n                if mofile.endswith('.mo') and os.path.isfile(mopath):\n                    with open(mopath, 'rb') as mofp:\n                        domain = mofile[:-3]\n                        dtrans = Translations(mofp, domain)\n                        translations.add(dtrans)\n\n    return Localizer(locale_name=current_locale_name,\n                          translations=translations)\n\ndef get_localizer(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use the :attr:`pyramid.request.Request.localizer` attribute directly\n        instead.  Retrieve a :class:`pyramid.i18n.Localizer` object\n        corresponding to the current request's locale name.\n    \"\"\"\n    return request.localizer\n\nclass Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        # It is only overridden the first time a new message file is found\n        # for a given domain, so all message files must have matching plural\n        # rules if they are in the same domain. We keep track of if we have\n        # overridden so we can special case the default domain, which is always\n        # instantiated before a message file is read.\n        # See also https://github.com/Pylons/pyramid/pull/2102\n        self.plural = DEFAULT_PLURAL\n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:\n            self.plural = translations.plural\n\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)\n\nclass LocalizerRequestMixin(object):\n    @reify\n    def localizer(self):\n        \"\"\" Convenience property to return a localizer \"\"\"\n        registry = self.registry\n\n        current_locale_name = self.locale_name\n        localizer = registry.queryUtility(ILocalizer, name=current_locale_name)\n\n        if localizer is None:\n            # no localizer utility registered yet\n            tdirs = registry.queryUtility(ITranslationDirectories, default=[])\n            localizer = make_localizer(current_locale_name, tdirs)\n\n            registry.registerUtility(localizer, ILocalizer,\n                                     name=current_locale_name)\n\n        return localizer\n\n    @reify\n    def locale_name(self):\n        locale_name = negotiate_locale_name(self)\n        return locale_name\n        \n    \n",
            "header": {
                "file": {
                    "path": "pyramid/i18n.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "79209d342",
                "new_commit_hash": "1d11adfe3",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/i18n.py"
            },
            "plus_file": {
                "path": "b/pyramid/i18n.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 22,
                            "length": 6
                        },
                        "new_range": {
                            "start": 22,
                            "length": 7
                        },
                        "section": "from pyramid.threadlocal import get_current_registry"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "TranslationString = TranslationString  # PyFlakes",
                                "type": "context"
                            },
                            {
                                "content": "TranslationStringFactory = TranslationStringFactory  # PyFlakes",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "DEFAULT_PLURAL = lambda n: int(n != 1)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "class Localizer(object):",
                                "type": "context"
                            },
                            {
                                "content": "    \"\"\"",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "pyramid/i18n.py",
                            "type": "statement",
                            "name": "",
                            "content": "DEFAULT_PLURAL = lambda n: int(n != 1)",
                            "ast_type_str": "Assign",
                            "start_lineno": 25,
                            "end_lineno": 25,
                            "parent": null
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 233,
                            "length": 7
                        },
                        "new_range": {
                            "start": 234,
                            "length": 13
                        },
                        "section": "class Translations(gettext.GNUTranslations, object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        # GNUTranslations._parse (called as a side effect if fileobj is",
                                "type": "context"
                            },
                            {
                                "content": "        # passed to GNUTranslations.__init__) with a \"real\" self.plural for",
                                "type": "context"
                            },
                            {
                                "content": "        # this domain; see https://github.com/Pylons/pyramid/issues/235",
                                "type": "context"
                            },
                            {
                                "content": "        self.plural = lambda n: int(n != 1) ",
                                "type": "deleted"
                            },
                            {
                                "content": "        # It is only overridden the first time a new message file is found",
                                "type": "added"
                            },
                            {
                                "content": "        # for a given domain, so all message files must have matching plural",
                                "type": "added"
                            },
                            {
                                "content": "        # rules if they are in the same domain. We keep track of if we have",
                                "type": "added"
                            },
                            {
                                "content": "        # overridden so we can special case the default domain, which is always",
                                "type": "added"
                            },
                            {
                                "content": "        # instantiated before a message file is read.",
                                "type": "added"
                            },
                            {
                                "content": "        # See also https://github.com/Pylons/pyramid/pull/2102",
                                "type": "added"
                            },
                            {
                                "content": "        self.plural = DEFAULT_PLURAL",
                                "type": "added"
                            },
                            {
                                "content": "        gettext.GNUTranslations.__init__(self, fp=fileobj)",
                                "type": "context"
                            },
                            {
                                "content": "        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))",
                                "type": "context"
                            },
                            {
                                "content": "        self.domain = domain",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/i18n.py",
                            "type": "class",
                            "name": "Translations",
                            "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        self.plural = lambda n: int(n != 1) \n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 221,
                            "end_lineno": 361,
                            "parent": null
                        },
                        {
                            "file_name": "pyramid/i18n.py",
                            "type": "method",
                            "name": "Translations.__init__",
                            "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        self.plural = lambda n: int(n != 1) \n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 226,
                            "end_lineno": 240,
                            "parent": {
                                "file_name": "pyramid/i18n.py",
                                "type": "class",
                                "name": "Translations",
                                "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        self.plural = lambda n: int(n != 1) \n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 221,
                                "end_lineno": 361,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 285,
                            "length": 6
                        },
                        "new_range": {
                            "start": 292,
                            "length": 9
                        },
                        "section": "class Translations(gettext.GNUTranslations, object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        :rtype: `Translations`",
                                "type": "context"
                            },
                            {
                                "content": "        \"\"\"",
                                "type": "context"
                            },
                            {
                                "content": "        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)",
                                "type": "context"
                            },
                            {
                                "content": "        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:",
                                "type": "added"
                            },
                            {
                                "content": "            self.plural = translations.plural",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        if merge and domain == self.domain:",
                                "type": "context"
                            },
                            {
                                "content": "            return self.merge(translations)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/i18n.py",
                            "type": "class",
                            "name": "Translations",
                            "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        # It is only overridden the first time a new message file is found\n        # for a given domain, so all message files must have matching plural\n        # rules if they are in the same domain. We keep track of if we have\n        # overridden so we can special case the default domain, which is always\n        # instantiated before a message file is read.\n        # See also https://github.com/Pylons/pyramid/pull/2102\n        self.plural = DEFAULT_PLURAL\n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:\n            self.plural = translations.plural\n\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 222,
                            "end_lineno": 371,
                            "parent": null
                        },
                        {
                            "file_name": "pyramid/i18n.py",
                            "type": "method",
                            "name": "Translations.add",
                            "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        # It is only overridden the first time a new message file is found\n        # for a given domain, so all message files must have matching plural\n        # rules if they are in the same domain. We keep track of if we have\n        # overridden so we can special case the default domain, which is always\n        # instantiated before a message file is read.\n        # See also https://github.com/Pylons/pyramid/pull/2102\n        self.plural = DEFAULT_PLURAL\n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:\n            self.plural = translations.plural\n\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 278,
                            "end_lineno": 308,
                            "parent": {
                                "file_name": "pyramid/i18n.py",
                                "type": "class",
                                "name": "Translations",
                                "content": "class Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        # It is only overridden the first time a new message file is found\n        # for a given domain, so all message files must have matching plural\n        # rules if they are in the same domain. We keep track of if we have\n        # overridden so we can special case the default domain, which is always\n        # instantiated before a message file is read.\n        # See also https://github.com/Pylons/pyramid/pull/2102\n        self.plural = DEFAULT_PLURAL\n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:\n            self.plural = translations.plural\n\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 222,
                                "end_lineno": 371,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "# -*- coding: utf-8 -*-\n#\nimport os\n\nhere = os.path.dirname(__file__)\nlocaledir = os.path.join(here, 'pkgs', 'localeapp', 'locale')\n\nimport unittest\nfrom pyramid import testing\n\nclass TestTranslationString(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationString\n        return TranslationString(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        ts = self._makeOne('a')\n        self.assertEqual(ts, 'a')\n\nclass TestTranslationStringFactory(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationStringFactory\n        return TranslationStringFactory(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        factory = self._makeOne('a')\n        self.assertEqual(factory('').domain, 'a')\n\nclass TestLocalizer(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import Localizer\n        return Localizer(*arg, **kw)\n\n    def test_ctor(self):\n        localizer = self._makeOne('en_US', None)\n        self.assertEqual(localizer.locale_name, 'en_US')\n        self.assertEqual(localizer.translations, None)\n\n    def test_translate(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        self.assertEqual(localizer.translate('123', domain='1',\n                                             mapping={}), '123')\n        self.assertTrue(localizer.translator)\n\n    def test_pluralize(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 1,\n                                     domain='1', mapping={})\n        self.assertEqual(result, 'singular')\n        self.assertTrue(localizer.pluralizer)\n\n    def test_pluralize_pluralizer_already_added(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        def pluralizer(*arg, **kw):\n            return arg, kw\n        localizer.pluralizer = pluralizer\n        result = localizer.pluralize('singular', 'plural', 1, domain='1',\n                                     mapping={})\n        self.assertEqual(\n            result,\n            (('singular', 'plural', 1), {'domain': '1', 'mapping': {}})\n            )\n        self.assertTrue(localizer.pluralizer is pluralizer)\n\n    def test_pluralize_default_translations(self):\n        # test that even without message ids loaded that\n        # \"localizer.pluralize\" \"works\" instead of raising an inscrutable\n        # \"translations object has no attr 'plural' error; see\n        # see https://github.com/Pylons/pyramid/issues/235\n        from pyramid.i18n import Translations\n        translations = Translations()\n        translations._catalog = {}\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 2, domain='1',\n                                     mapping={})\n        self.assertEqual(result, 'plural')\n\nclass Test_negotiate_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import negotiate_locale_name\n        return negotiate_locale_name(request)\n\n    def _registerImpl(self, impl):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        from pyramid.interfaces import ILocaleNegotiator\n        registry.registerUtility(impl, ILocaleNegotiator)\n\n    def test_no_registry_on_request(self):\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_with_registry_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_default_from_settings(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        settings = {'default_locale_name':'settings'}\n        registry.settings = settings\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'settings')\n\n    def test_use_default_locale_negotiator(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        request = DummyRequest()\n        request.registry = registry\n        request._LOCALE_ = 'locale'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'locale')\n\n    def test_default_default(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'en')\n\nclass Test_get_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_locale_name\n        return get_locale_name(request)\n\n    def test_name_on_request(self):\n        request = DummyRequest()\n        request.locale_name = 'ie'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'ie')\n\nclass Test_make_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, locale, tdirs):\n        from pyramid.i18n import make_localizer\n        return make_localizer(locale, tdirs)\n\n    def test_locale_from_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_locale_from_mo_bad_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'be'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_locale_from_mo_mo_isdir(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'gb'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_territory_fallback(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de_DE'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Submit', 'deformsite'),\n                         'different') # prefer translations from de_DE locale\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen') # missing from de_DE locale, but in de\n\nclass Test_get_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_localizer\n        return get_localizer(request)\n\n    def test_it(self):\n        request = DummyRequest()\n        request.localizer = 'localizer'\n        self.assertEqual(self._callFUT(request), 'localizer')\n\nclass Test_default_locale_negotiator(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import default_locale_negotiator\n        return default_locale_negotiator(request)\n\n    def test_from_none(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, None)\n\n    def test_from_request_attr(self):\n        request = DummyRequest()\n        request._LOCALE_ = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_params(self):\n        request = DummyRequest()\n        request.params['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_cookies(self):\n        request = DummyRequest()\n        request.cookies['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\nclass TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')\n\nclass TestLocalizerRequestMixin(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.i18n import LocalizerRequestMixin\n        request = LocalizerRequestMixin()\n        request.registry = self.config.registry\n        request.cookies = {}\n        request.params = {}\n        return request\n\n    def test_default_localizer(self):\n        # `localizer` returns a default localizer for `en`\n        from pyramid.i18n import Localizer\n        request = self._makeOne()\n        self.assertEqual(request.localizer.__class__, Localizer)\n        self.assertEqual(request.locale_name, 'en')\n\n    def test_custom_localizer_for_default_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='en')\n        request = self._makeOne()\n        self.assertEqual(request.localizer, dummy)\n\n    def test_custom_localizer_for_custom_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='ie')\n        request = self._makeOne()\n        request._LOCALE_ = 'ie'\n        self.assertEqual(request.localizer, dummy)\n\n    def test_localizer_from_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'de'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_localizer_from_mo_bad_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'be'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\nclass DummyRequest(object):\n    def __init__(self):\n        self.params = {}\n        self.cookies = {}\n\ndef dummy_negotiator(request):\n    return 'bogus'\n\nclass DummyTranslations(object):\n    def ugettext(self, text):\n        return text\n\n    gettext = ugettext\n\n    def ungettext(self, singular, plural, n):\n        return singular\n\n    ngettext = ungettext\n",
            "new_file_content": "# -*- coding: utf-8 -*-\n#\nimport os\n\nhere = os.path.dirname(__file__)\nlocaledir = os.path.join(here, 'pkgs', 'localeapp', 'locale')\n\nimport unittest\nfrom pyramid import testing\n\nclass TestTranslationString(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationString\n        return TranslationString(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        ts = self._makeOne('a')\n        self.assertEqual(ts, 'a')\n\nclass TestTranslationStringFactory(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationStringFactory\n        return TranslationStringFactory(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        factory = self._makeOne('a')\n        self.assertEqual(factory('').domain, 'a')\n\nclass TestLocalizer(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import Localizer\n        return Localizer(*arg, **kw)\n\n    def test_ctor(self):\n        localizer = self._makeOne('en_US', None)\n        self.assertEqual(localizer.locale_name, 'en_US')\n        self.assertEqual(localizer.translations, None)\n\n    def test_translate(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        self.assertEqual(localizer.translate('123', domain='1',\n                                             mapping={}), '123')\n        self.assertTrue(localizer.translator)\n\n    def test_pluralize(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 1,\n                                     domain='1', mapping={})\n        self.assertEqual(result, 'singular')\n        self.assertTrue(localizer.pluralizer)\n\n    def test_pluralize_pluralizer_already_added(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        def pluralizer(*arg, **kw):\n            return arg, kw\n        localizer.pluralizer = pluralizer\n        result = localizer.pluralize('singular', 'plural', 1, domain='1',\n                                     mapping={})\n        self.assertEqual(\n            result,\n            (('singular', 'plural', 1), {'domain': '1', 'mapping': {}})\n            )\n        self.assertTrue(localizer.pluralizer is pluralizer)\n\n    def test_pluralize_default_translations(self):\n        # test that even without message ids loaded that\n        # \"localizer.pluralize\" \"works\" instead of raising an inscrutable\n        # \"translations object has no attr 'plural' error; see\n        # see https://github.com/Pylons/pyramid/issues/235\n        from pyramid.i18n import Translations\n        translations = Translations()\n        translations._catalog = {}\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 2, domain='1',\n                                     mapping={})\n        self.assertEqual(result, 'plural')\n\nclass Test_negotiate_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import negotiate_locale_name\n        return negotiate_locale_name(request)\n\n    def _registerImpl(self, impl):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        from pyramid.interfaces import ILocaleNegotiator\n        registry.registerUtility(impl, ILocaleNegotiator)\n\n    def test_no_registry_on_request(self):\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_with_registry_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_default_from_settings(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        settings = {'default_locale_name':'settings'}\n        registry.settings = settings\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'settings')\n\n    def test_use_default_locale_negotiator(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        request = DummyRequest()\n        request.registry = registry\n        request._LOCALE_ = 'locale'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'locale')\n\n    def test_default_default(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'en')\n\nclass Test_get_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_locale_name\n        return get_locale_name(request)\n\n    def test_name_on_request(self):\n        request = DummyRequest()\n        request.locale_name = 'ie'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'ie')\n\nclass Test_make_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, locale, tdirs):\n        from pyramid.i18n import make_localizer\n        return make_localizer(locale, tdirs)\n\n    def test_locale_from_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_locale_from_mo_bad_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'be'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_locale_from_mo_mo_isdir(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'gb'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_territory_fallback(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de_DE'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Submit', 'deformsite'),\n                         'different') # prefer translations from de_DE locale\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen') # missing from de_DE locale, but in de\n\nclass Test_get_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_localizer\n        return get_localizer(request)\n\n    def test_it(self):\n        request = DummyRequest()\n        request.localizer = 'localizer'\n        self.assertEqual(self._callFUT(request), 'localizer')\n\nclass Test_default_locale_negotiator(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import default_locale_negotiator\n        return default_locale_negotiator(request)\n\n    def test_from_none(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, None)\n\n    def test_from_request_attr(self):\n        request = DummyRequest()\n        request._LOCALE_ = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_params(self):\n        request = DummyRequest()\n        request.params['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_cookies(self):\n        request = DummyRequest()\n        request.cookies['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\nclass TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n\n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # We load a second message file with different plural rules\n        inst3.plural = lambda n: n > 0\n        inst.add(inst3)\n        # It doesn't override the previously loaded rule\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')\n\nclass TestLocalizerRequestMixin(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.i18n import LocalizerRequestMixin\n        request = LocalizerRequestMixin()\n        request.registry = self.config.registry\n        request.cookies = {}\n        request.params = {}\n        return request\n\n    def test_default_localizer(self):\n        # `localizer` returns a default localizer for `en`\n        from pyramid.i18n import Localizer\n        request = self._makeOne()\n        self.assertEqual(request.localizer.__class__, Localizer)\n        self.assertEqual(request.locale_name, 'en')\n\n    def test_custom_localizer_for_default_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='en')\n        request = self._makeOne()\n        self.assertEqual(request.localizer, dummy)\n\n    def test_custom_localizer_for_custom_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='ie')\n        request = self._makeOne()\n        request._LOCALE_ = 'ie'\n        self.assertEqual(request.localizer, dummy)\n\n    def test_localizer_from_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'de'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_localizer_from_mo_bad_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'be'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\nclass DummyRequest(object):\n    def __init__(self):\n        self.params = {}\n        self.cookies = {}\n\ndef dummy_negotiator(request):\n    return 'bogus'\n\nclass DummyTranslations(object):\n    def ugettext(self, text):\n        return text\n\n    gettext = ugettext\n\n    def ungettext(self, singular, plural, n):\n        return singular\n\n    ngettext = ungettext\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_i18n.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "67b2ac356",
                "new_commit_hash": "d72d0d480",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/tests/test_i18n.py"
            },
            "plus_file": {
                "path": "b/pyramid/tests/test_i18n.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 357,
                            "length": 6
                        },
                        "new_range": {
                            "start": 357,
                            "length": 36
                        },
                        "section": "class TestTranslations(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        inst.add(inst2)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(inst._catalog['a'], 'b')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_add_default_domain_replaces_plural_first_time(self):",
                                "type": "added"
                            },
                            {
                                "content": "        # Create three empty message catalogs in the default domain",
                                "type": "added"
                            },
                            {
                                "content": "        inst = self._getTargetClass()(None, domain='messages')",
                                "type": "added"
                            },
                            {
                                "content": "        inst2 = self._getTargetClass()(None, domain='messages')",
                                "type": "added"
                            },
                            {
                                "content": "        inst3 = self._getTargetClass()(None, domain='messages')",
                                "type": "added"
                            },
                            {
                                "content": "        inst._catalog = {}",
                                "type": "added"
                            },
                            {
                                "content": "        inst2._catalog = {}",
                                "type": "added"
                            },
                            {
                                "content": "        inst3._catalog = {}",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        # The default plural scheme is the germanic one",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(0), 1)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(1), 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(2), 1)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        # inst2 represents a message file that declares french plurals",
                                "type": "added"
                            },
                            {
                                "content": "        inst2.plural = lambda n: n > 1",
                                "type": "added"
                            },
                            {
                                "content": "        inst.add(inst2)",
                                "type": "added"
                            },
                            {
                                "content": "        # that plural rule should now apply to inst",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(0), 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(1), 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(2), 1)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        # We load a second message file with different plural rules",
                                "type": "added"
                            },
                            {
                                "content": "        inst3.plural = lambda n: n > 0",
                                "type": "added"
                            },
                            {
                                "content": "        inst.add(inst3)",
                                "type": "added"
                            },
                            {
                                "content": "        # It doesn't override the previously loaded rule",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(0), 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(1), 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(inst.plural(2), 1)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_dgettext(self):",
                                "type": "context"
                            },
                            {
                                "content": "        t = self._makeOne()",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_i18n.py",
                            "type": "class",
                            "name": "TestTranslations",
                            "content": "class TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n\n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # We load a second message file with different plural rules\n        inst3.plural = lambda n: n > 0\n        inst.add(inst3)\n        # It doesn't override the previously loaded rule\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 259,
                            "end_lineno": 424,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_i18n.py",
                            "type": "method",
                            "name": "TestTranslations.test_add_default_domain_replaces_plural_first_time",
                            "content": "class TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n\n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # We load a second message file with different plural rules\n        inst3.plural = lambda n: n > 0\n        inst.add(inst3)\n        # It doesn't override the previously loaded rule\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 360,
                            "end_lineno": 388,
                            "parent": {
                                "file_name": "pyramid/tests/test_i18n.py",
                                "type": "class",
                                "name": "TestTranslations",
                                "content": "class TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n\n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # We load a second message file with different plural rules\n        inst3.plural = lambda n: n > 0\n        inst.add(inst3)\n        # It doesn't override the previously loaded rule\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 259,
                                "end_lineno": 424,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "58fd29d1922fd6420d696a7458a12b24d52edffc^",
    "new_commit_hash": "58fd29d1922fd6420d696a7458a12b24d52edffc",
    "commit_message": "Merge pull request #2859 from MatthewWilkes/i18n_plurals_in_default_domain\n\nFix pluralization in default domain for non-germanic languages",
    "commit_date": "2016-12-12T11:07:33-06:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "58fd29d1922fd6420d696a7458a12b24d52edffc",
    "test_file_codes": [
        "# -*- coding: utf-8 -*-\n#\nimport os\n\nhere = os.path.dirname(__file__)\nlocaledir = os.path.join(here, 'pkgs', 'localeapp', 'locale')\n\nimport unittest\nfrom pyramid import testing\n\nclass TestTranslationString(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationString\n        return TranslationString(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        ts = self._makeOne('a')\n        self.assertEqual(ts, 'a')\n\nclass TestTranslationStringFactory(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import TranslationStringFactory\n        return TranslationStringFactory(*arg, **kw)\n\n    def test_it(self):\n        # this is part of the API, we don't actually need to test much more\n        # than that it's importable\n        factory = self._makeOne('a')\n        self.assertEqual(factory('').domain, 'a')\n\nclass TestLocalizer(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.i18n import Localizer\n        return Localizer(*arg, **kw)\n\n    def test_ctor(self):\n        localizer = self._makeOne('en_US', None)\n        self.assertEqual(localizer.locale_name, 'en_US')\n        self.assertEqual(localizer.translations, None)\n\n    def test_translate(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        self.assertEqual(localizer.translate('123', domain='1',\n                                             mapping={}), '123')\n        self.assertTrue(localizer.translator)\n\n    def test_pluralize(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 1,\n                                     domain='1', mapping={})\n        self.assertEqual(result, 'singular')\n        self.assertTrue(localizer.pluralizer)\n\n    def test_pluralize_pluralizer_already_added(self):\n        translations = DummyTranslations()\n        localizer = self._makeOne(None, translations)\n        def pluralizer(*arg, **kw):\n            return arg, kw\n        localizer.pluralizer = pluralizer\n        result = localizer.pluralize('singular', 'plural', 1, domain='1',\n                                     mapping={})\n        self.assertEqual(\n            result,\n            (('singular', 'plural', 1), {'domain': '1', 'mapping': {}})\n            )\n        self.assertTrue(localizer.pluralizer is pluralizer)\n\n    def test_pluralize_default_translations(self):\n        # test that even without message ids loaded that\n        # \"localizer.pluralize\" \"works\" instead of raising an inscrutable\n        # \"translations object has no attr 'plural' error; see\n        # see https://github.com/Pylons/pyramid/issues/235\n        from pyramid.i18n import Translations\n        translations = Translations()\n        translations._catalog = {}\n        localizer = self._makeOne(None, translations)\n        result = localizer.pluralize('singular', 'plural', 2, domain='1',\n                                     mapping={})\n        self.assertEqual(result, 'plural')\n\nclass Test_negotiate_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import negotiate_locale_name\n        return negotiate_locale_name(request)\n\n    def _registerImpl(self, impl):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        from pyramid.interfaces import ILocaleNegotiator\n        registry.registerUtility(impl, ILocaleNegotiator)\n\n    def test_no_registry_on_request(self):\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_with_registry_on_request(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        self._registerImpl(dummy_negotiator)\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'bogus')\n\n    def test_default_from_settings(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        settings = {'default_locale_name':'settings'}\n        registry.settings = settings\n        request = DummyRequest()\n        request.registry = registry\n        result = self._callFUT(request)\n        self.assertEqual(result, 'settings')\n\n    def test_use_default_locale_negotiator(self):\n        from pyramid.threadlocal import get_current_registry\n        registry = get_current_registry()\n        request = DummyRequest()\n        request.registry = registry\n        request._LOCALE_ = 'locale'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'locale')\n\n    def test_default_default(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, 'en')\n\nclass Test_get_locale_name(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_locale_name\n        return get_locale_name(request)\n\n    def test_name_on_request(self):\n        request = DummyRequest()\n        request.locale_name = 'ie'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'ie')\n\nclass Test_make_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, locale, tdirs):\n        from pyramid.i18n import make_localizer\n        return make_localizer(locale, tdirs)\n\n    def test_locale_from_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_locale_from_mo_bad_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'be'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_locale_from_mo_mo_isdir(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'gb'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\n    def test_territory_fallback(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de_DE'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Submit', 'deformsite'),\n                         'different') # prefer translations from de_DE locale\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen') # missing from de_DE locale, but in de\n\nclass Test_get_localizer(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import get_localizer\n        return get_localizer(request)\n\n    def test_it(self):\n        request = DummyRequest()\n        request.localizer = 'localizer'\n        self.assertEqual(self._callFUT(request), 'localizer')\n\nclass Test_default_locale_negotiator(unittest.TestCase):\n    def setUp(self):\n        testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _callFUT(self, request):\n        from pyramid.i18n import default_locale_negotiator\n        return default_locale_negotiator(request)\n\n    def test_from_none(self):\n        request = DummyRequest()\n        result = self._callFUT(request)\n        self.assertEqual(result, None)\n\n    def test_from_request_attr(self):\n        request = DummyRequest()\n        request._LOCALE_ = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_params(self):\n        request = DummyRequest()\n        request.params['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\n    def test_from_cookies(self):\n        request = DummyRequest()\n        request.cookies['_LOCALE_'] = 'foo'\n        result = self._callFUT(request)\n        self.assertEqual(result, 'foo')\n\nclass TestTranslations(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.i18n import Translations\n        return Translations\n        \n    def _makeOne(self):\n        messages1 = [\n            ('foo', 'Voh'),\n            (('foo1', 1), 'Voh1'),\n        ]\n        messages2 = [\n            ('foo', 'VohD'),\n            (('foo1', 1), 'VohD1'),\n        ]\n\n        klass = self._getTargetClass()\n        \n        translations1 = klass(None, domain='messages')\n        translations1._catalog = dict(messages1)\n        translations1.plural = lambda *arg: 1\n        translations2 = klass(None, domain='messages1')\n        translations2._catalog = dict(messages2)\n        translations2.plural = lambda *arg: 1\n        translations = translations1.add(translations2, merge=False)\n        return translations\n\n    def test_load_locales_None(self):\n        import gettext\n        klass = self._getTargetClass()\n        result = klass.load(localedir, None, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_domain_None(self):\n        import gettext\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain=None)\n        self.assertEqual(result.__class__, gettext.NullTranslations)\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n        self.assertEqual(result.__class__, klass)\n\n    def test___repr__(self):\n        inst = self._makeOne()\n        result = repr(inst)\n        self.assertEqual(result, '<Translations: \"None\">')\n\n    def test_merge_not_gnutranslations(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.merge(None), inst)\n\n    def test_merge_gnutranslations(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.merge(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_merge_gnutranslations_not_translations(self):\n        import gettext\n        t = gettext.GNUTranslations()\n        t._catalog = {'a':'b'}\n        inst = self._makeOne()\n        inst.merge(t)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_different_domain_merge_true_notexisting(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst2)\n\n    def test_add_different_domain_merge_true_existing(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst3 = self._makeOne()\n        inst2.domain = 'domain2'\n        inst2._catalog['a'] = 'b'\n        inst3.domain = 'domain2'\n        inst._domains['domain2'] = inst3\n        inst.add(inst2)\n        self.assertEqual(inst._domains['domain2'], inst3)\n        self.assertEqual(inst3._catalog['a'], 'b')\n\n    def test_add_same_domain_merge_true(self):\n        inst = self._makeOne()\n        inst2 = self._makeOne()\n        inst2._catalog['a'] = 'b'\n        inst.add(inst2)\n        self.assertEqual(inst._catalog['a'], 'b')\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n\n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n        # We load a second message file with different plural rules\n        inst3.plural = lambda n: n > 0\n        inst.add(inst3)\n        # It doesn't override the previously loaded rule\n        self.assertEqual(inst.plural(0), 0)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n\n    def test_dgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dgettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD')\n\n    def test_ldgettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldgettext('messages', 'foo'), b'Voh')\n        self.assertEqual(t.ldgettext('messages1', 'foo'), b'VohD')\n\n    def test_dugettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dugettext('messages', 'foo'), 'Voh')\n        self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD')\n\n    def test_dngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n        \n    def test_ldngettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), b'Voh1')\n        self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1),b'VohD1')\n\n    def test_dungettext(self):\n        t = self._makeOne()\n        self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1')\n        self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1')\n\n    def test_default_germanic_pluralization(self):\n        t = self._getTargetClass()()\n        t._catalog = {}\n        result = t.dungettext('messages', 'foo1', 'foos1', 2)\n        self.assertEqual(result, 'foos1')\n\nclass TestLocalizerRequestMixin(unittest.TestCase):\n    def setUp(self):\n        self.config = testing.setUp()\n\n    def tearDown(self):\n        testing.tearDown()\n\n    def _makeOne(self):\n        from pyramid.i18n import LocalizerRequestMixin\n        request = LocalizerRequestMixin()\n        request.registry = self.config.registry\n        request.cookies = {}\n        request.params = {}\n        return request\n\n    def test_default_localizer(self):\n        # `localizer` returns a default localizer for `en`\n        from pyramid.i18n import Localizer\n        request = self._makeOne()\n        self.assertEqual(request.localizer.__class__, Localizer)\n        self.assertEqual(request.locale_name, 'en')\n\n    def test_custom_localizer_for_default_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='en')\n        request = self._makeOne()\n        self.assertEqual(request.localizer, dummy)\n\n    def test_custom_localizer_for_custom_locale(self):\n        from pyramid.interfaces import ILocalizer\n        dummy = object()\n        self.config.registry.registerUtility(dummy, ILocalizer, name='ie')\n        request = self._makeOne()\n        request._LOCALE_ = 'ie'\n        self.assertEqual(request.localizer, dummy)\n\n    def test_localizer_from_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'de'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\n        self.assertEqual(result.translate('Approve'), 'Approve')\n        self.assertTrue(hasattr(result, 'pluralize'))\n\n    def test_localizer_from_mo_bad_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'be'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n        self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Approve')\n\nclass DummyRequest(object):\n    def __init__(self):\n        self.params = {}\n        self.cookies = {}\n\ndef dummy_negotiator(request):\n    return 'bogus'\n\nclass DummyTranslations(object):\n    def ugettext(self, text):\n        return text\n\n    gettext = ugettext\n\n    def ungettext(self, singular, plural, n):\n        return singular\n\n    ngettext = ungettext\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "",
    "setup_res_stderr": "Using CPython 3.8.20\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 10 packages in 710ms\nPrepared 1 package in 835ms\nInstalled 10 packages in 17ms\n + hupper==1.12.1\n + pastedeploy==3.1.0\n + pyramid==1.8.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc)\n + repoze-lru==0.7\n + setuptools==75.3.0\n + translationstring==1.4\n + venusian==3.1.1\n + webob==1.8.9\n + zope-deprecation==5.0\n + zope-interface==7.2\nResolved 20 packages in 25ms\nInstalled 10 packages in 12ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + distlib==0.3.9\n + filelock==3.16.1\n + nose==1.3.7\n + platformdirs==4.3.6\n + soupsieve==2.6\n + virtualenv==20.29.0\n + waitress==3.0.0\n + webtest==3.0.1\nResolved 16 packages in 7ms\nInstalled 12 packages in 10ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + exceptiongroup==1.2.2\n + iniconfig==2.0.0\n + packaging==24.2\n + pluggy==1.5.0\n + pyproject-api==1.8.0\n + pytest==8.3.4\n + tomli==2.2.1\n + tox==4.23.2\n + typing-extensions==4.12.2\n",
    "new_commit_res_code": 1,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc\ncollected 868 items\n\nr2e_tests/test_1.py .............F..F..................FF.......F.       [  5%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [  7%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 11%]\n.....................................F.F................................ [ 20%]\n                                                                         [ 20%]\nr2e_tests/test_config/test_factories.py .....................            [ 22%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 23%]\nr2e_tests/test_config/test_init.py ..................................... [ 27%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 36%]\n............................                                             [ 39%]\nr2e_tests/test_config/test_rendering.py ...                              [ 39%]\nr2e_tests/test_config/test_routes.py ........................            [ 42%]\nr2e_tests/test_config/test_security.py ............                      [ 43%]\nr2e_tests/test_config/test_settings.py .......................           [ 46%]\nr2e_tests/test_config/test_testing.py ............                       [ 47%]\nr2e_tests/test_config/test_tweens.py .................................   [ 51%]\nr2e_tests/test_config/test_util.py ..................................... [ 55%]\n...............                                                          [ 57%]\nr2e_tests/test_config/test_views.py .................................F.. [ 61%]\n........................................................................ [ 70%]\n.......................FF............................................... [ 78%]\n.......................................................F.......F         [ 85%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 85%]\nr2e_tests/test_scripts/test_pcreate.py .....................             [ 88%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 88%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 90%]\nr2e_tests/test_scripts/test_proutes.py ...........FFFF.F.FF....F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py F.....                             [ 94%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 96%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n___________________ Test_make_localizer.test_locale_from_mo ____________________\n\nself = <r2e_tests.test_1.Test_make_localizer testMethod=test_locale_from_mo>\n\n    def test_locale_from_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\nE       AssertionError: 'Approve' != 'Genehmigen'\nE       - Approve\nE       + Genehmigen\n\nr2e_tests/test_1.py:175: AssertionError\n_________________ Test_make_localizer.test_territory_fallback __________________\n\nself = <r2e_tests.test_1.Test_make_localizer testMethod=test_territory_fallback>\n\n    def test_territory_fallback(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de_DE'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Submit', 'deformsite'),\n                         'different') # prefer translations from de_DE locale\nE       AssertionError: 'Submit' != 'different'\nE       - Submit\nE       + different\n\nr2e_tests/test_1.py:204: AssertionError\n______________ TestTranslations.test_load_found_locale_and_domain ______________\n\nself = <r2e_tests.test_1.TestTranslations testMethod=test_load_found_locale_and_domain>\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n>       self.assertEqual(result.__class__, klass)\nE       AssertionError: <class 'gettext.NullTranslations'> != <class 'pyramid.i18n.Translations'>\n\nr2e_tests/test_1.py:302: AssertionError\n_____ TestTranslations.test_load_found_locale_and_domain_locale_is_string ______\n\nself = <r2e_tests.test_1.TestTranslations testMethod=test_load_found_locale_and_domain_locale_is_string>\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n>       self.assertEqual(result.__class__, klass)\nE       AssertionError: <class 'gettext.NullTranslations'> != <class 'pyramid.i18n.Translations'>\n\nr2e_tests/test_1.py:308: AssertionError\n_______________ TestLocalizerRequestMixin.test_localizer_from_mo _______________\n\nself = <r2e_tests.test_1.TestLocalizerRequestMixin testMethod=test_localizer_from_mo>\n\n    def test_localizer_from_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'de'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\nE       AssertionError: 'Approve' != 'Genehmigen'\nE       - Approve\nE       + Genehmigen\n\nr2e_tests/test_1.py:473: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x703be7394cd0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x703be7394cd0>)\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 0x703be7394cd0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x703be7394cd0>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs  = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                  ^^^\nE       + resource url adapter for resource iface <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x703be72d6850>\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 0x703be72d6850>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:585: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x703be838bcd0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]20d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]20d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]dffc/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]dffc/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]dffc/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]dffc/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]20d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]20d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:68: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:654: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1130: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x703be6ff4310>, 'discriminat...3be6ff4b80>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.ConflictResolverState object at 0x703be7330940>\n\n    def resolveConflicts(actions, state=None):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n    \n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n    \n        Actions are resolved on a per-order basis because some discriminators\n        cannot be computed until earlier actions have executed. An action in an\n        earlier order may execute successfully only to find out later that it was\n        overridden by another action with a smaller include path. This will result\n        in a conflict as there is no way to revert the original action.\n    \n        ``state`` may be an instance of ``ConflictResolverState`` that\n        can be used to resume execution and resolve the new actions against the\n        list of executed actions from a previous call.\n    \n        \"\"\"\n        if state is None:\n            state = ConflictResolverState()\n    \n        # pick up where we left off last time, but track the new actions as well\n        state.remaining_actions.extend(normalize_actions(actions))\n        actions = state.remaining_actions\n    \n        def orderandpos(v):\n            n, v = v\n            return (v['order'] or 0, n)\n    \n        def orderonly(v):\n            n, v = v\n            return v['order'] or 0\n    \n        sactions = sorted(enumerate(actions, start=state.start), key=orderandpos)\n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n            output = []\n            unique = {}\n    \n            # error out if we went backward in order\n            if state.min_order is not None and order < state.min_order:\n                r = ['Actions were added to order={0} after execution had moved '\n                     'on to order={1}. Conflicting actions: '\n                     .format(order, state.min_order)]\n                for i, action in actiongroup:\n                    for line in str(action['info']).rstrip().split('\\n'):\n                        r.append(\"  \" + line)\n                raise ConfigurationError('\\n'.join(r))\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                # \"ainfo\" is a tuple of (i, action) where \"i\" is an integer\n                # expressing the relative position of this action in the action\n                # list being resolved, and \"action\" is an action dictionary.  The\n                # purpose of an ainfo is to associate an \"i\" with a particular\n                # action; \"i\" exists for sorting after conflict resolution.\n                ainfo = (i, action)\n    \n                # wait to defer discriminators until we are on their order because\n                # the discriminator may depend on state from a previous order\n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n            for discriminator, ainfos in unique.items():\n                # We use (includepath, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"i\".\n                def bypath(ainfo):\n                    path, i = ainfo[1]['includepath'], ainfo[0]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                _, action = ainfo\n    \n                # ensure this new action does not conflict with a previously\n                # resolved action from an earlier order / invocation\n                prev_ainfo = state.resolved_ainfos.get(discriminator)\n                if prev_ainfo is not None:\n                    _, paction = prev_ainfo\n                    basepath, baseinfo = paction['includepath'], paction['info']\n                    includepath = action['includepath']\n                    # if the new action conflicts with the resolved action then\n                    # note the conflict, otherwise drop the action as it's\n                    # effectively overriden by the previous action\n                    if (includepath[:len(basepath)] != basepath or\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n                else:\n                    output.append(ainfo)\n    \n                basepath, baseinfo = action['includepath'], action['info']\n                for _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath or  # not a prefix\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1312: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1048: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:444: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1247: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1234: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1221: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:543: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]03be7361040>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]03be7361040>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]703be7361040>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]703be7361040>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x703be7361040>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:2065: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1186: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1227: AssertionError\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'pyramid.tests.test_config:path/',\n                'pyramid.tests.test_config:other_path/')\n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n                return cb_\n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:3213: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3384: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:337: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:392: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:196: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:532: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:421: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:452: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:156: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:603: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:562: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        self.config_factory.items = [(\n            'watch_files',\n            'foo\\n/baz\\npyramid.tests.test_scripts:*.py',\n        )]\n        inst.pserve_file_config('/base/path.ini', global_conf={'a': '1'})\n        self.assertEqual(self.config_factory.defaults, {\n            'a': '1',\n            'here': os.path.abspath('/base'),\n        })\n>       self.assertEqual(inst.watch_files, [\n            os.path.abspath('/base/foo'),\n            os.path.abspath('/baz'),\n            os.path.abspath(os.path.join(here, '*.py')),\n        ])\nE       AssertionError: Lists differ: ['/ba[87 chars]fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py'] != ['/ba[87 chars]fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py']\nE       \nE       First differing element 2:\nE       '/hom[64 chars]2fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py'\nE       '/hom[64 chars]2fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py'\nE       \nE         ['/base/foo',\nE          '/baz',\nE       -  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       +  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_scripts/test_pserve.py:73: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestTranslationString::test_it\nPASSED r2e_tests/test_1.py::TestTranslationStringFactory::test_it\nPASSED r2e_tests/test_1.py::TestLocalizer::test_ctor\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize_default_translations\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize_pluralizer_already_added\nPASSED r2e_tests/test_1.py::TestLocalizer::test_translate\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_default_default\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_default_from_settings\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_no_registry_on_request\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_use_default_locale_negotiator\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_with_registry_on_request\nPASSED r2e_tests/test_1.py::Test_get_locale_name::test_name_on_request\nPASSED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo_bad_mo\nPASSED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo_mo_isdir\nPASSED r2e_tests/test_1.py::Test_get_localizer::test_it\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_cookies\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_none\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_params\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_request_attr\nPASSED r2e_tests/test_1.py::TestTranslations::test___repr__\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_default_domain_replaces_plural_first_time\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_different_domain_merge_true_existing\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_different_domain_merge_true_notexisting\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_same_domain_merge_true\nPASSED r2e_tests/test_1.py::TestTranslations::test_default_germanic_pluralization\nPASSED r2e_tests/test_1.py::TestTranslations::test_dgettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dngettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dugettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dungettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_ldgettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_ldngettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_load_domain_None\nPASSED r2e_tests/test_1.py::TestTranslations::test_load_locales_None\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_gnutranslations\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_gnutranslations_not_translations\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_not_gnutranslations\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_custom_localizer_for_custom_locale\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_custom_localizer_for_default_locale\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_default_localizer\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_localizer_from_mo_bad_mo\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_changing_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_uses_original_dict\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_csrf_trusted_origins\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestDeprecatedPredicates::test_it\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_normal_and_exception_view_intr_derived_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_check_csrf_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_package_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_class_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo - Assert...\nFAILED r2e_tests/test_1.py::Test_make_localizer::test_territory_fallback - As...\nFAILED r2e_tests/test_1.py::TestTranslations::test_load_found_locale_and_domain\nFAILED r2e_tests/test_1.py::TestTranslations::test_load_found_locale_and_domain_locale_is_string\nFAILED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_localizer_from_mo\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 49 failed, 819 passed in 5.17s ========================\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_58fd29d1922fd6420d696a7458a12b24d52edffc\ncollected 868 items\n\nr2e_tests/test_1.py .............F..F......F...........FF.......F.       [  5%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [  7%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 11%]\n.....................................F.F................................ [ 20%]\n                                                                         [ 20%]\nr2e_tests/test_config/test_factories.py .....................            [ 22%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 23%]\nr2e_tests/test_config/test_init.py ..................................... [ 27%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 36%]\n............................                                             [ 39%]\nr2e_tests/test_config/test_rendering.py ...                              [ 39%]\nr2e_tests/test_config/test_routes.py ........................            [ 42%]\nr2e_tests/test_config/test_security.py ............                      [ 43%]\nr2e_tests/test_config/test_settings.py .......................           [ 46%]\nr2e_tests/test_config/test_testing.py ............                       [ 47%]\nr2e_tests/test_config/test_tweens.py .................................   [ 51%]\nr2e_tests/test_config/test_util.py ..................................... [ 55%]\n...............                                                          [ 57%]\nr2e_tests/test_config/test_views.py .................................F.. [ 61%]\n........................................................................ [ 70%]\n.......................FF............................................... [ 78%]\n.......................................................F.......F         [ 85%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 85%]\nr2e_tests/test_scripts/test_pcreate.py .....................             [ 88%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 88%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 90%]\nr2e_tests/test_scripts/test_proutes.py ...........FFFF.F.FF....F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py F.....                             [ 94%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 96%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n___________________ Test_make_localizer.test_locale_from_mo ____________________\n\nself = <r2e_tests.test_1.Test_make_localizer testMethod=test_locale_from_mo>\n\n    def test_locale_from_mo(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\nE       AssertionError: 'Approve' != 'Genehmigen'\nE       - Approve\nE       + Genehmigen\n\nr2e_tests/test_1.py:175: AssertionError\n_________________ Test_make_localizer.test_territory_fallback __________________\n\nself = <r2e_tests.test_1.Test_make_localizer testMethod=test_territory_fallback>\n\n    def test_territory_fallback(self):\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        locale_name = 'de_DE'\n        result = self._callFUT(locale_name, localedirs)\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Submit', 'deformsite'),\n                         'different') # prefer translations from de_DE locale\nE       AssertionError: 'Submit' != 'different'\nE       - Submit\nE       + different\n\nr2e_tests/test_1.py:204: AssertionError\n_____ TestTranslations.test_add_default_domain_replaces_plural_first_time ______\n\nself = <r2e_tests.test_1.TestTranslations testMethod=test_add_default_domain_replaces_plural_first_time>\n\n    def test_add_default_domain_replaces_plural_first_time(self):\n        # Create three empty message catalogs in the default domain\n        inst = self._getTargetClass()(None, domain='messages')\n        inst2 = self._getTargetClass()(None, domain='messages')\n        inst3 = self._getTargetClass()(None, domain='messages')\n        inst._catalog = {}\n        inst2._catalog = {}\n        inst3._catalog = {}\n    \n        # The default plural scheme is the germanic one\n        self.assertEqual(inst.plural(0), 1)\n        self.assertEqual(inst.plural(1), 0)\n        self.assertEqual(inst.plural(2), 1)\n    \n        # inst2 represents a message file that declares french plurals\n        inst2.plural = lambda n: n > 1\n        inst.add(inst2)\n        # that plural rule should now apply to inst\n>       self.assertEqual(inst.plural(0), 0)\nE       AssertionError: 1 != 0\n\nr2e_tests/test_1.py:378: AssertionError\n______________ TestTranslations.test_load_found_locale_and_domain ______________\n\nself = <r2e_tests.test_1.TestTranslations testMethod=test_load_found_locale_and_domain>\n\n    def test_load_found_locale_and_domain(self):\n        locales = ['de', 'en']\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n>       self.assertEqual(result.__class__, klass)\nE       AssertionError: <class 'gettext.NullTranslations'> != <class 'pyramid.i18n.Translations'>\n\nr2e_tests/test_1.py:302: AssertionError\n_____ TestTranslations.test_load_found_locale_and_domain_locale_is_string ______\n\nself = <r2e_tests.test_1.TestTranslations testMethod=test_load_found_locale_and_domain_locale_is_string>\n\n    def test_load_found_locale_and_domain_locale_is_string(self):\n        locales = 'de'\n        klass = self._getTargetClass()\n        result = klass.load(localedir, locales, domain='deformsite')\n>       self.assertEqual(result.__class__, klass)\nE       AssertionError: <class 'gettext.NullTranslations'> != <class 'pyramid.i18n.Translations'>\n\nr2e_tests/test_1.py:308: AssertionError\n_______________ TestLocalizerRequestMixin.test_localizer_from_mo _______________\n\nself = <r2e_tests.test_1.TestLocalizerRequestMixin testMethod=test_localizer_from_mo>\n\n    def test_localizer_from_mo(self):\n        from pyramid.interfaces import ITranslationDirectories\n        from pyramid.i18n import Localizer\n        localedirs = [localedir]\n        self.config.registry.registerUtility(\n            localedirs, ITranslationDirectories)\n        request = self._makeOne()\n        request._LOCALE_ = 'de'\n        result = request.localizer\n        self.assertEqual(result.__class__, Localizer)\n>       self.assertEqual(result.translate('Approve', 'deformsite'),\n                         'Genehmigen')\nE       AssertionError: 'Approve' != 'Genehmigen'\nE       - Approve\nE       + Genehmigen\n\nr2e_tests/test_1.py:473: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x749c0428f460>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x749c0428f460>)\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 0x749c0428f460>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x749c0428f460>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs  = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                  ^^^\nE       + resource url adapter for resource iface <class 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x749c04210fd0>\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 0x749c04210fd0>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]dffc/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]dffc/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]96a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]96a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:585: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x749c0400e850>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]20d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]20d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]dffc/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]dffc/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]420d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]dffc/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]dffc/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]20d696a7458a12b24d52edffc/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]20d696a7458a12b24d52edffc/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:68: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:654: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1130: in execute_actions\n    action = next(action_iter, None)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x749c0432dc10>, 'discriminat...9c041b4550>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\nstate = <pyramid.config.ConflictResolverState object at 0x749c04004910>\n\n    def resolveConflicts(actions, state=None):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n    \n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n    \n        Actions are resolved on a per-order basis because some discriminators\n        cannot be computed until earlier actions have executed. An action in an\n        earlier order may execute successfully only to find out later that it was\n        overridden by another action with a smaller include path. This will result\n        in a conflict as there is no way to revert the original action.\n    \n        ``state`` may be an instance of ``ConflictResolverState`` that\n        can be used to resume execution and resolve the new actions against the\n        list of executed actions from a previous call.\n    \n        \"\"\"\n        if state is None:\n            state = ConflictResolverState()\n    \n        # pick up where we left off last time, but track the new actions as well\n        state.remaining_actions.extend(normalize_actions(actions))\n        actions = state.remaining_actions\n    \n        def orderandpos(v):\n            n, v = v\n            return (v['order'] or 0, n)\n    \n        def orderonly(v):\n            n, v = v\n            return v['order'] or 0\n    \n        sactions = sorted(enumerate(actions, start=state.start), key=orderandpos)\n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n            output = []\n            unique = {}\n    \n            # error out if we went backward in order\n            if state.min_order is not None and order < state.min_order:\n                r = ['Actions were added to order={0} after execution had moved '\n                     'on to order={1}. Conflicting actions: '\n                     .format(order, state.min_order)]\n                for i, action in actiongroup:\n                    for line in str(action['info']).rstrip().split('\\n'):\n                        r.append(\"  \" + line)\n                raise ConfigurationError('\\n'.join(r))\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                # \"ainfo\" is a tuple of (i, action) where \"i\" is an integer\n                # expressing the relative position of this action in the action\n                # list being resolved, and \"action\" is an action dictionary.  The\n                # purpose of an ainfo is to associate an \"i\" with a particular\n                # action; \"i\" exists for sorting after conflict resolution.\n                ainfo = (i, action)\n    \n                # wait to defer discriminators until we are on their order because\n                # the discriminator may depend on state from a previous order\n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n            for discriminator, ainfos in unique.items():\n                # We use (includepath, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"i\".\n                def bypath(ainfo):\n                    path, i = ainfo[1]['includepath'], ainfo[0]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                _, action = ainfo\n    \n                # ensure this new action does not conflict with a previously\n                # resolved action from an earlier order / invocation\n                prev_ainfo = state.resolved_ainfos.get(discriminator)\n                if prev_ainfo is not None:\n                    _, paction = prev_ainfo\n                    basepath, baseinfo = paction['includepath'], paction['info']\n                    includepath = action['includepath']\n                    # if the new action conflicts with the resolved action then\n                    # note the conflict, otherwise drop the action as it's\n                    # effectively overriden by the previous action\n                    if (includepath[:len(basepath)] != basepath or\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n                else:\n                    output.append(ainfo)\n    \n                basepath, baseinfo = action['includepath'], action['info']\n                for _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath or  # not a prefix\n                            includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1312: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1048: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:444: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1247: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1234: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1221: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:543: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]49c040bc280>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]49c040bc280>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]749c040bc280>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]749c040bc280>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x749c040bc280>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:2065: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1186: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1227: AssertionError\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'pyramid.tests.test_config:path/',\n                'pyramid.tests.test_config:other_path/')\n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n                return cb_\n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:3213: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3384: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:337: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:392: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:196: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:532: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:421: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:452: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:156: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:603: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:562: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        self.config_factory.items = [(\n            'watch_files',\n            'foo\\n/baz\\npyramid.tests.test_scripts:*.py',\n        )]\n        inst.pserve_file_config('/base/path.ini', global_conf={'a': '1'})\n        self.assertEqual(self.config_factory.defaults, {\n            'a': '1',\n            'here': os.path.abspath('/base'),\n        })\n>       self.assertEqual(inst.watch_files, [\n            os.path.abspath('/base/foo'),\n            os.path.abspath('/baz'),\n            os.path.abspath(os.path.join(here, '*.py')),\n        ])\nE       AssertionError: Lists differ: ['/ba[87 chars]fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py'] != ['/ba[87 chars]fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py']\nE       \nE       First differing element 2:\nE       '/hom[64 chars]2fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py'\nE       '/hom[64 chars]2fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py'\nE       \nE         ['/base/foo',\nE          '/baz',\nE       -  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/pyramid/tests/test_scripts/*.py']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       +  '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_58fd29d1922fd6420d696a7458a12b24d52edffc/r2e_tests/test_scripts/*.py']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_scripts/test_pserve.py:73: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestTranslationString::test_it\nPASSED r2e_tests/test_1.py::TestTranslationStringFactory::test_it\nPASSED r2e_tests/test_1.py::TestLocalizer::test_ctor\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize_default_translations\nPASSED r2e_tests/test_1.py::TestLocalizer::test_pluralize_pluralizer_already_added\nPASSED r2e_tests/test_1.py::TestLocalizer::test_translate\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_default_default\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_default_from_settings\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_no_registry_on_request\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_use_default_locale_negotiator\nPASSED r2e_tests/test_1.py::Test_negotiate_locale_name::test_with_registry_on_request\nPASSED r2e_tests/test_1.py::Test_get_locale_name::test_name_on_request\nPASSED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo_bad_mo\nPASSED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo_mo_isdir\nPASSED r2e_tests/test_1.py::Test_get_localizer::test_it\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_cookies\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_none\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_params\nPASSED r2e_tests/test_1.py::Test_default_locale_negotiator::test_from_request_attr\nPASSED r2e_tests/test_1.py::TestTranslations::test___repr__\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_different_domain_merge_true_existing\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_different_domain_merge_true_notexisting\nPASSED r2e_tests/test_1.py::TestTranslations::test_add_same_domain_merge_true\nPASSED r2e_tests/test_1.py::TestTranslations::test_default_germanic_pluralization\nPASSED r2e_tests/test_1.py::TestTranslations::test_dgettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dngettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dugettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_dungettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_ldgettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_ldngettext\nPASSED r2e_tests/test_1.py::TestTranslations::test_load_domain_None\nPASSED r2e_tests/test_1.py::TestTranslations::test_load_locales_None\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_gnutranslations\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_gnutranslations_not_translations\nPASSED r2e_tests/test_1.py::TestTranslations::test_merge_not_gnutranslations\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_custom_localizer_for_custom_locale\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_custom_localizer_for_default_locale\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_default_localizer\nPASSED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_localizer_from_mo_bad_mo\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_changing_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_uses_original_dict\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_csrf_trusted_origins\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestDeprecatedPredicates::test_it\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_normal_and_exception_view_intr_derived_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_check_csrf_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_package_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_class_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::Test_make_localizer::test_locale_from_mo - Assert...\nFAILED r2e_tests/test_1.py::Test_make_localizer::test_territory_fallback - As...\nFAILED r2e_tests/test_1.py::TestTranslations::test_add_default_domain_replaces_plural_first_time\nFAILED r2e_tests/test_1.py::TestTranslations::test_load_found_locale_and_domain\nFAILED r2e_tests/test_1.py::TestTranslations::test_load_found_locale_and_domain_locale_is_string\nFAILED r2e_tests/test_1.py::TestLocalizerRequestMixin::test_localizer_from_mo\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 50 failed, 818 passed in 4.33s ========================\n",
    "old_commit_res_stderr": ""
}
CHANGES.txt pyramid/i18n.py pyramid/tests/test_i18n.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title:** Default Domain Does Not Update Pluralization for Non-Germanic Languages

**Description:**
When adding a message file with a non-germanic plural rule to the default domain, the pluralization remains using the default germanic rule. This results in incorrect plural forms being applied for languages that have different pluralization rules.

**Example Buggy Code:**
```python
# Initialize translations for the default domain with germanic plural rule
translations = Translations(domain='messages')
translations.plural = lambda n: int(n != 1)

# Add a French message file with a French plural rule
french_translations = Translations(domain='messages')
french_translations.plural = lambda n: n > 1
translations.add(french_translations)

# Attempt to get plural forms
print(translations.plural(0))  # Expected: 0
print(translations.plural(1))  # Expected: 0
print(translations.plural(2))  # Expected: 1
```

**Expected Behavior:**
After adding the French translations, the plural function in the default domain should use the French pluralization rules. Therefore:
- `translations.plural(0)` should return `0`
- `translations.plural(1)` should return `0`
- `translations.plural(2)` should return `1`

**Actual Behavior:**
The plural function still uses the germanic rule:
- `translations.plural(0)` returns `1` instead of `0`
- `translations.plural(1)` returns `0` as expected
- `translations.plural(2)` returns `1` as expected

This indicates that the plural rule for the default domain is not being updated correctly when a non-germanic language is added.
[/ISSUE]
--- END ISSUE ---

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

--- BEGIN FILE ---
```
### pyramid/i18n.py
import gettext
import os

from translationstring import (
    Translator,
    Pluralizer,
    TranslationString, # API
    TranslationStringFactory, # API
    )

from pyramid.compat import PY2
from pyramid.decorator import reify

from pyramid.interfaces import (
    ILocalizer,
    ITranslationDirectories,
    ILocaleNegotiator,
    )

from pyramid.threadlocal import get_current_registry

TranslationString = TranslationString  # PyFlakes
TranslationStringFactory = TranslationStringFactory  # PyFlakes


class Localizer(object):
    """
    An object providing translation and pluralizations related to
    the current request's locale name.  A
    :class:`pyramid.i18n.Localizer` object is created using the
    :func:`pyramid.i18n.get_localizer` function.
    """
    def __init__(self, locale_name, translations):
        self.locale_name = locale_name
        self.translations = translations
        self.pluralizer = None
        self.translator = None

    def translate(self, tstring, domain=None, mapping=None):
        """
        Translate a :term:`translation string` to the current language
        and interpolate any *replacement markers* in the result.  The
        ``translate`` method accepts three arguments: ``tstring``
        (required), ``domain`` (optional) and ``mapping`` (optional).
        When called, it will translate the ``tstring`` translation
        string to a ``unicode`` object using the current locale.  If
        the current locale could not be determined, the result of
        interpolation of the default value is returned.  The optional
        ``domain`` argument can be used to specify or override the
        domain of the ``tstring`` (useful when ``tstring`` is a normal
        string rather than a translation string).  The optional
        ``mapping`` argument can specify or override the ``tstring``
        interpolation mapping, useful when the ``tstring`` argument is
        a simple string instead of a translation string.

        Example::

           from pyramid.18n import TranslationString
           ts = TranslationString('Add ${item}', domain='mypackage',
                                  mapping={'item':'Item'})
           translated = localizer.translate(ts)

        Example::

           translated = localizer.translate('Add ${item}', domain='mypackage',
                                            mapping={'item':'Item'})

        """
        if self.translator is None:
            self.translator = Translator(self.translations)
        return self.translator(tstring, domain=domain, mapping=mapping)

    def pluralize(self, singular, plural, n, domain=None, mapping=None):
        """
        Return a Unicode string translation by using two
        :term:`message identifier` objects as a singular/plural pair
        and an ``n`` value representing the number that appears in the
        message using gettext plural forms support.  The ``singular``
        and ``plural`` objects should be unicode strings. There is no
        reason to use translation string objects as arguments as all
        metadata is ignored.
        
        ``n`` represents the number of elements. ``domain`` is the
        translation domain to use to do the pluralization, and ``mapping``
        is the interpolation mapping that should be used on the result. If
        the ``domain`` is not supplied, a default domain is used (usually
        ``messages``).
        
        Example::

           num = 1
           translated = localizer.pluralize('Add ${num} item',
                                            'Add ${num} items',
                                            num,
                                            mapping={'num':num})

        If using the gettext plural support, which is required for
        languages that have pluralisation rules other than n != 1, the
        ``singular`` argument must be the message_id defined in the
        translation file. The plural argument is not used in this case.

        Example::

           num = 1
           translated = localizer.pluralize('item_plural',
                                            '',
                                            num,
                                            mapping={'num':num})

        
        """
        if self.pluralizer is None:
            self.pluralizer = Pluralizer(self.translations)
        return self.pluralizer(singular, plural, n, domain=domain,
                               mapping=mapping)


def default_locale_negotiator(request):
    """ The default :term:`locale negotiator`.  Returns a locale name
    or ``None``.

    - First, the negotiator looks for the ``_LOCALE_`` attribute of
      the request object (possibly set by a view or a listener for an
      :term:`event`). If the attribute exists and it is not ``None``,
      its value will be used.
  
    - Then it looks for the ``request.params['_LOCALE_']`` value.

    - Then it looks for the ``request.cookies['_LOCALE_']`` value.

    - Finally, the negotiator returns ``None`` if the locale could not
      be determined via any of the previous checks (when a locale
      negotiator returns ``None``, it signifies that the
      :term:`default locale name` should be used.)
    """
    name = '_LOCALE_'
    locale_name = getattr(request, name, None)
    if locale_name is None:
        locale_name = request.params.get(name)
        if locale_name is None:
            locale_name = request.cookies.get(name)
    return locale_name

def negotiate_locale_name(request):
    """ Negotiate and return the :term:`locale name` associated with
    the current request."""
    try:
        registry = request.registry
    except AttributeError:
        registry = get_current_registry()
    negotiator = registry.queryUtility(ILocaleNegotiator,
                                       default=default_locale_negotiator)
    locale_name = negotiator(request)

    if locale_name is None:
        settings = registry.settings or {}
        locale_name = settings.get('default_locale_name', 'en')

    return locale_name

def get_locale_name(request):
    """
    .. deprecated:: 1.5
        Use :attr:`pyramid.request.Request.locale_name` directly instead.
        Return the :term:`locale name` associated with the current request.
    """
    return request.locale_name

def make_localizer(current_locale_name, translation_directories):
    """ Create a :class:`pyramid.i18n.Localizer` object
    corresponding to the provided locale name from the 
    translations found in the list of translation directories."""
    translations = Translations()
    translations._catalog = {}

    locales_to_try = []
    if '_' in current_locale_name:
        locales_to_try = [current_locale_name.split('_')[0]]
    locales_to_try.append(current_locale_name)

    # intent: order locales left to right in least specific to most specific,
    # e.g. ['de', 'de_DE'].  This services the intent of creating a
    # translations object that returns a "more specific" translation for a
    # region, but will fall back to a "less specific" translation for the
    # locale if necessary.  Ordering from least specific to most specific
    # allows us to call translations.add in the below loop to get this
    # behavior.

    for tdir in translation_directories:
        locale_dirs = []
        for lname in locales_to_try:
            ldir = os.path.realpath(os.path.join(tdir, lname))
            if os.path.isdir(ldir):
                locale_dirs.append(ldir)

        for locale_dir in locale_dirs:
            messages_dir = os.path.join(locale_dir, 'LC_MESSAGES')
            if not os.path.isdir(os.path.realpath(messages_dir)):
                continue
            for mofile in os.listdir(messages_dir):
                mopath = os.path.realpath(os.path.join(messages_dir,
                                                       mofile))
                if mofile.endswith('.mo') and os.path.isfile(mopath):
                    with open(mopath, 'rb') as mofp:
                        domain = mofile[:-3]
                        dtrans = Translations(mofp, domain)
                        translations.add(dtrans)

    return Localizer(locale_name=current_locale_name,
                          translations=translations)

def get_localizer(request):
    """
    .. deprecated:: 1.5
        Use the :attr:`pyramid.request.Request.localizer` attribute directly
        instead.  Retrieve a :class:`pyramid.i18n.Localizer` object
        corresponding to the current request's locale name.
    """
    return request.localizer

class Translations(gettext.GNUTranslations, object):
    """An extended translation catalog class (ripped off from Babel) """

    DEFAULT_DOMAIN = 'messages'

    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):
        """Initialize the translations catalog.

        :param fileobj: the file-like object the translation should be read
                        from
        """
        # germanic plural by default; self.plural will be overwritten by
        # GNUTranslations._parse (called as a side effect if fileobj is
        # passed to GNUTranslations.__init__) with a "real" self.plural for
        # this domain; see https://github.com/Pylons/pyramid/issues/235
        self.plural = lambda n: int(n != 1) 
        gettext.GNUTranslations.__init__(self, fp=fileobj)
        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))
        self.domain = domain
        self._domains = {}

    @classmethod
    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):
        """Load translations from the given directory.

        :param dirname: the directory containing the ``MO`` files
        :param locales: the list of locales in order of preference (items in
                        this list can be either `Locale` objects or locale
                        strings)
        :param domain: the message domain
        :return: the loaded catalog, or a ``NullTranslations`` instance if no
                 matching translations were found
        :rtype: `Translations`
        """
        if locales is not None:
            if not isinstance(locales, (list, tuple)):
                locales = [locales]
            locales = [str(l) for l in locales]
        if not domain:
            domain = cls.DEFAULT_DOMAIN
        filename = gettext.find(domain, dirname, locales)
        if not filename:
            return gettext.NullTranslations()
        with open(filename, 'rb') as fp:
            return cls(fileobj=fp, domain=domain)

    def __repr__(self):
        return '<%s: "%s">' % (type(self).__name__,
                               self._info.get('project-id-version'))

    def add(self, translations, merge=True):
        """Add the given translations to the catalog.

        If the domain of the translations is different than that of the
        current catalog, they are added as a catalog that is only accessible
        by the various ``d*gettext`` functions.

        :param translations: the `Translations` instance with the messages to
                             add
        :param merge: whether translations for message domains that have
                      already been added should be merged with the existing
                      translations
        :return: the `Translations` instance (``self``) so that `merge` calls
                 can be easily chained
        :rtype: `Translations`
        """
        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)
        if merge and domain == self.domain:
            return self.merge(translations)

        existing = self._domains.get(domain)
        if merge and existing is not None:
            existing.merge(translations)
        else:
            translations.add_fallback(self)
            self._domains[domain] = translations

        return self

    def merge(self, translations):
        """Merge the given translations into the catalog.

        Message translations in the specified catalog override any messages
        with the same identifier in the existing catalog.

        :param translations: the `Translations` instance with the messages to
                             merge
        :return: the `Translations` instance (``self``) so that `merge` calls
                 can be easily chained
        :rtype: `Translations`
        """
        if isinstance(translations, gettext.GNUTranslations):
            self._catalog.update(translations._catalog)
            if isinstance(translations, Translations):
                self.files.extend(translations.files)

        return self

    def dgettext(self, domain, message):
        """Like ``gettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).gettext(message)
    
    def ldgettext(self, domain, message):
        """Like ``lgettext()``, but look the message up in the specified 
        domain.
        """ 
        return self._domains.get(domain, self).lgettext(message)
    
    def dugettext(self, domain, message):
        """Like ``ugettext()``, but look the message up in the specified
        domain.
        """
        if PY2:
            return self._domains.get(domain, self).ugettext(message)
        else:
            return self._domains.get(domain, self).gettext(message)
    
    def dngettext(self, domain, singular, plural, num):
        """Like ``ngettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).ngettext(singular, plural, num)
    
    def ldngettext(self, domain, singular, plural, num):
        """Like ``lngettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).lngettext(singular, plural, num)
    
    def dungettext(self, domain, singular, plural, num):
        """Like ``ungettext()`` but look the message up in the specified
        domain.
        """
        if PY2:
            return self._domains.get(domain, self).ungettext(
                singular, plural, num)
        else:
            return self._domains.get(domain, self).ngettext(
                singular, plural, num)

class LocalizerRequestMixin(object):
    @reify
    def localizer(self):
        """ Convenience property to return a localizer """
        registry = self.registry

        current_locale_name = self.locale_name
        localizer = registry.queryUtility(ILocalizer, name=current_locale_name)

        if localizer is None:
            # no localizer utility registered yet
            tdirs = registry.queryUtility(ITranslationDirectories, default=[])
            localizer = make_localizer(current_locale_name, tdirs)

            registry.registerUtility(localizer, ILocalizer,
                                     name=current_locale_name)

        return localizer

    @reify
    def locale_name(self):
        locale_name = negotiate_locale_name(self)
        return locale_name
        
    

```
--- 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:** Default Domain Does Not Update Pluralization for Non-Germanic Languages

**Description:**
When adding a message file with a non-germanic plural rule to the default domain, the pluralization remains using the default germanic rule. This results in incorrect plural forms being applied for languages that have different pluralization rules.

**Example Buggy Code:**
```python
# Initialize translations for the default domain with germanic plural rule
translations = Translations(domain='messages')
translations.plural = lambda n: int(n != 1)

# Add a French message file with a French plural rule
french_translations = Translations(domain='messages')
french_translations.plural = lambda n: n > 1
translations.add(french_translations)

# Attempt to get plural forms
print(translations.plural(0))  # Expected: 0
print(translations.plural(1))  # Expected: 0
print(translations.plural(2))  # Expected: 1
```

**Expected Behavior:**
After adding the French translations, the plural function in the default domain should use the French pluralization rules. Therefore:
- `translations.plural(0)` should return `0`
- `translations.plural(1)` should return `0`
- `translations.plural(2)` should return `1`

**Actual Behavior:**
The plural function still uses the germanic rule:
- `translations.plural(0)` returns `1` instead of `0`
- `translations.plural(1)` returns `0` as expected
- `translations.plural(2)` returns `1` as expected

This indicates that the plural rule for the default domain is not being updated correctly when a non-germanic language is added.
[/ISSUE]
{
    "TestTranslationString.test_it": "PASSED",
    "TestTranslationStringFactory.test_it": "PASSED",
    "TestLocalizer.test_ctor": "PASSED",
    "TestLocalizer.test_pluralize": "PASSED",
    "TestLocalizer.test_pluralize_default_translations": "PASSED",
    "TestLocalizer.test_pluralize_pluralizer_already_added": "PASSED",
    "TestLocalizer.test_translate": "PASSED",
    "Test_negotiate_locale_name.test_default_default": "PASSED",
    "Test_negotiate_locale_name.test_default_from_settings": "PASSED",
    "Test_negotiate_locale_name.test_no_registry_on_request": "PASSED",
    "Test_negotiate_locale_name.test_use_default_locale_negotiator": "PASSED",
    "Test_negotiate_locale_name.test_with_registry_on_request": "PASSED",
    "Test_get_locale_name.test_name_on_request": "PASSED",
    "Test_make_localizer.test_locale_from_mo_bad_mo": "PASSED",
    "Test_make_localizer.test_locale_from_mo_mo_isdir": "PASSED",
    "Test_get_localizer.test_it": "PASSED",
    "Test_default_locale_negotiator.test_from_cookies": "PASSED",
    "Test_default_locale_negotiator.test_from_none": "PASSED",
    "Test_default_locale_negotiator.test_from_params": "PASSED",
    "Test_default_locale_negotiator.test_from_request_attr": "PASSED",
    "TestTranslations.test___repr__": "PASSED",
    "TestTranslations.test_add_default_domain_replaces_plural_first_time": "PASSED",
    "TestTranslations.test_add_different_domain_merge_true_existing": "PASSED",
    "TestTranslations.test_add_different_domain_merge_true_notexisting": "PASSED",
    "TestTranslations.test_add_same_domain_merge_true": "PASSED",
    "TestTranslations.test_default_germanic_pluralization": "PASSED",
    "TestTranslations.test_dgettext": "PASSED",
    "TestTranslations.test_dngettext": "PASSED",
    "TestTranslations.test_dugettext": "PASSED",
    "TestTranslations.test_dungettext": "PASSED",
    "TestTranslations.test_ldgettext": "PASSED",
    "TestTranslations.test_ldngettext": "PASSED",
    "TestTranslations.test_load_domain_None": "PASSED",
    "TestTranslations.test_load_locales_None": "PASSED",
    "TestTranslations.test_merge_gnutranslations": "PASSED",
    "TestTranslations.test_merge_gnutranslations_not_translations": "PASSED",
    "TestTranslations.test_merge_not_gnutranslations": "PASSED",
    "TestLocalizerRequestMixin.test_custom_localizer_for_custom_locale": "PASSED",
    "TestLocalizerRequestMixin.test_custom_localizer_for_default_locale": "PASSED",
    "TestLocalizerRequestMixin.test_default_localizer": "PASSED",
    "TestLocalizerRequestMixin.test_localizer_from_mo_bad_mo": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_object_event_subscriber": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_default_resource_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_nodefault_resource_iface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_self": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_defaults": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_iface_specified": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_predicate": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_default_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_introspectables": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_nondefault_iface": "PASSED",
    "Test_eventonly.test_defaults": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_already_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_not_yet_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_missing_abspath": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_samename": "PASSED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_string_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_value": "PASSED",
    "TestOverrideProvider.test_has_resource_no_overrides": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_None": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_True": "PASSED",
    "TestOverrideProvider.test_resource_isdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_False": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_values": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_different_type": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_same_type": "PASSED",
    "TestPackageOverrides.test_ctor_registers_loader_type": "PASSED",
    "TestPackageOverrides.test_ctor_sets_loader": "PASSED",
    "TestPackageOverrides.test_ctor_sets_local_state": "PASSED",
    "TestPackageOverrides.test_filtered_sources": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_filename": "PASSED",
    "TestPackageOverrides.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_stream": "PASSED",
    "TestPackageOverrides.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_string": "PASSED",
    "TestPackageOverrides.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_has_resource": "PASSED",
    "TestPackageOverrides.test_has_resource_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_insert_directory": "PASSED",
    "TestPackageOverrides.test_insert_emptystring": "PASSED",
    "TestPackageOverrides.test_insert_file": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_isdir_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_isdir_false": "PASSED",
    "TestPackageOverrides.test_isdir_true": "PASSED",
    "TestPackageOverrides.test_listdir": "PASSED",
    "TestPackageOverrides.test_listdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists": "PASSED",
    "TestPackageAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream": "PASSED",
    "TestPackageAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_string": "PASSED",
    "TestPackageAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_string_with_prefix": "PASSED",
    "TestPackageAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_isdir_false": "PASSED",
    "TestPackageAssetSource.test_isdir_true": "PASSED",
    "TestPackageAssetSource.test_listdir": "PASSED",
    "TestPackageAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists": "PASSED",
    "TestFSAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_filename": "PASSED",
    "TestFSAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_filename_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_stream": "PASSED",
    "TestFSAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_string": "PASSED",
    "TestFSAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_string_with_prefix": "PASSED",
    "TestFSAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_isdir_false": "PASSED",
    "TestFSAssetSource.test_isdir_true": "PASSED",
    "TestFSAssetSource.test_listdir": "PASSED",
    "TestFSAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestDirectoryOverride.test_it_match": "PASSED",
    "TestDirectoryOverride.test_it_no_match": "PASSED",
    "TestFileOverride.test_it_match": "PASSED",
    "TestFileOverride.test_it_no_match": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_and_no_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_conflict": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_text_type_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_response_factory": "PASSED",
    "TestFactoriesMixin.test_set_response_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "PASSED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties_conflict": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_callable": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_property": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_unnamed_callable": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test___getattr__matches": "PASSED",
    "ConfiguratorTests.test___getattr__matches_no_action_wrap": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_dont_exist": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_exist": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds__lock": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds_clear_view_lookup_cache": "PASSED",
    "ConfiguratorTests.test__fix_registry_has_listeners": "PASSED",
    "ConfiguratorTests.test__fix_registry_notify": "PASSED",
    "ConfiguratorTests.test__fix_registry_queryAdapterOrSelf": "PASSED",
    "ConfiguratorTests.test__fix_registry_registerSelfAdapter": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_already_absolute": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_notastring": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_relative": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_None": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_not_None": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ConfiguratorTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_autocommit_no_conflicts": "PASSED",
    "ConfiguratorTests.test_begin": "PASSED",
    "ConfiguratorTests.test_begin_with_request": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ConfiguratorTests.test_commit_conflict_simple": "PASSED",
    "ConfiguratorTests.test_commit_conflict_with_two_includes": "PASSED",
    "ConfiguratorTests.test_conflict_set_forbidden_view": "PASSED",
    "ConfiguratorTests.test_conflict_set_notfound_view": "PASSED",
    "ConfiguratorTests.test_ctor_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_authentication_policy": "PASSED",
    "ConfiguratorTests.test_ctor_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_ctor_default_permission": "PASSED",
    "ConfiguratorTests.test_ctor_default_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_default_view_mapper": "PASSED",
    "ConfiguratorTests.test_ctor_default_webob_response_adapter_registered": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_None": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_custom": "PASSED",
    "ConfiguratorTests.test_ctor_httpexception_view_default": "PASSED",
    "ConfiguratorTests.test_ctor_no_root_factory": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_custom_settings": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_ctor_session_factory": "PASSED",
    "ConfiguratorTests.test_ctor_with_introspection": "PASSED",
    "ConfiguratorTests.test_ctor_with_package_registry": "PASSED",
    "ConfiguratorTests.test_ctor_with_root_factory": "PASSED",
    "ConfiguratorTests.test_end": "PASSED",
    "ConfiguratorTests.test_hook_zca": "PASSED",
    "ConfiguratorTests.test_include_with_dotted_name": "PASSED",
    "ConfiguratorTests.test_include_with_missing_source_file": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme_missing": "PASSED",
    "ConfiguratorTests.test_include_with_nested_route_prefix": "PASSED",
    "ConfiguratorTests.test_include_with_python_callable": "PASSED",
    "ConfiguratorTests.test_include_with_route_prefix": "PASSED",
    "ConfiguratorTests.test_introspector_decorator": "PASSED",
    "ConfiguratorTests.test_make_wsgi_app": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_notstring_success": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_fail": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_success": "PASSED",
    "ConfiguratorTests.test_scan_integration": "PASSED",
    "ConfiguratorTests.test_scan_integration_dottedname_package": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_extra_kw": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_ignore": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_onerror": "PASSED",
    "ConfiguratorTests.test_setup_registry_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_setup_registry_calls_fix_registry": "PASSED",
    "ConfiguratorTests.test_setup_registry_custom_settings": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_name": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_setup_registry_default_permission": "PASSED",
    "ConfiguratorTests.test_setup_registry_dottedname_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_explicit_notfound_trumps_iexceptionresponse": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes_spaces": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_no_default_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_exceptionresponse_views": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_view_predicates": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_webob_iresponse_adapter": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_response_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_tweens": "PASSED",
    "ConfiguratorTests.test_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "PASSED",
    "ConfiguratorTests.test_with_package_module": "PASSED",
    "ConfiguratorTests.test_with_package_package": "PASSED",
    "TestConfigurator_add_directive.test_directive_persists_across_configurator_creations": "PASSED",
    "TestConfigurator_add_directive.test_extend_action_method_successful": "PASSED",
    "TestConfigurator_add_directive.test_extend_same_name_doesnt_conflict": "PASSED",
    "TestConfigurator__add_predicate.test_factory_as_object": "PASSED",
    "TestActionState.test_action_simple": "PASSED",
    "TestActionState.test_action_with_includepath": "PASSED",
    "TestActionState.test_action_with_includepath_and_info": "PASSED",
    "TestActionState.test_action_with_info": "PASSED",
    "TestActionState.test_action_with_introspectables": "PASSED",
    "TestActionState.test_action_with_order": "PASSED",
    "TestActionState.test_execute_actions_dicts": "PASSED",
    "TestActionState.test_execute_actions_error": "PASSED",
    "TestActionState.test_execute_actions_tuples": "PASSED",
    "TestActionState.test_execute_actions_with_introspectable_no_callable": "PASSED",
    "TestActionState.test_execute_actions_with_introspectables": "PASSED",
    "TestActionState.test_executing_conflicting_action_across_orders": "PASSED",
    "TestActionState.test_executing_conflicting_action_across_reentrant_orders": "PASSED",
    "TestActionState.test_it": "PASSED",
    "TestActionState.test_processSpec": "PASSED",
    "TestActionState.test_reentrant_action": "PASSED",
    "TestActionState.test_reentrant_action_error": "PASSED",
    "TestActionState.test_reentrant_action_with_deferred_discriminator": "PASSED",
    "TestActionState.test_reentrant_action_without_clear": "PASSED",
    "Test_reentrant_action_functional.test_deferred_discriminator": "PASSED",
    "Test_reentrant_action_functional.test_functional": "PASSED",
    "Test_resolveConflicts.test_conflicts_across_orders": "PASSED",
    "Test_resolveConflicts.test_it_conflict": "PASSED",
    "Test_resolveConflicts.test_it_success_dicts": "PASSED",
    "Test_resolveConflicts.test_it_success_tuples": "PASSED",
    "Test_resolveConflicts.test_it_with_actions_grouped_by_order": "PASSED",
    "Test_resolveConflicts.test_override_success_across_orders": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_default_renderers": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer_dottedname_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_defaults": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_discriminator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_path_no_pattern": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_pattern_with_path": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_attr": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_context": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_permission": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_renderer": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_accept": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_highorder": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_regex": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_pregenerator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_method": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_param": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_xhr": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_already_registered": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_not_yet_registered": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_add_permission": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_changing_set_default_csrf_options": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_csrf_options": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_permission": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_uses_original_dict": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_None": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_already_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_not_yet_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_nosettings": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_withsettings": "PASSED",
    "TestSettings.test_csrf_trusted_origins": "PASSED",
    "TestSettings.test_debug_all": "PASSED",
    "TestSettings.test_debug_authorization": "PASSED",
    "TestSettings.test_debug_notfound": "PASSED",
    "TestSettings.test_debug_routematch": "PASSED",
    "TestSettings.test_debug_templates": "PASSED",
    "TestSettings.test_default_locale_name": "PASSED",
    "TestSettings.test_noargs": "PASSED",
    "TestSettings.test_originals_kept": "PASSED",
    "TestSettings.test_prevent_cachebust": "PASSED",
    "TestSettings.test_prevent_http_cache": "PASSED",
    "TestSettings.test_reload_all": "PASSED",
    "TestSettings.test_reload_assets": "PASSED",
    "TestSettings.test_reload_resources": "PASSED",
    "TestSettings.test_reload_templates": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_explicitrenderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_twice": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_defaults": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_multiple": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_single": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_template": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_resources": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_forget_result": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_remember_result": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_dottedname": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_instance": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_unsuitable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_conflict": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_distinct": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "PASSED",
    "TestTweens.test___call___explicit": "PASSED",
    "TestTweens.test___call___implicit": "PASSED",
    "TestTweens.test_add_explicit": "PASSED",
    "TestTweens.test_add_implicit": "PASSED",
    "TestTweens.test_implicit_ordering_1": "PASSED",
    "TestTweens.test_implicit_ordering_2": "PASSED",
    "TestTweens.test_implicit_ordering_3": "PASSED",
    "TestTweens.test_implicit_ordering_4": "PASSED",
    "TestTweens.test_implicit_ordering_5": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_direct": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_indirect": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_and_under_partials": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_with_missing_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_multiple_matching_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_partial_fallbacks": "PASSED",
    "TestPredicateList.test_custom_predicates_can_affect_traversal": "PASSED",
    "TestPredicateList.test_different_custom_predicates_with_same_hash": "PASSED",
    "TestPredicateList.test_match_param_from_dict": "PASSED",
    "TestPredicateList.test_match_param_from_dict_fails": "PASSED",
    "TestPredicateList.test_match_param_from_string": "PASSED",
    "TestPredicateList.test_match_param_from_string_fails": "PASSED",
    "TestPredicateList.test_notted": "PASSED",
    "TestPredicateList.test_ordering_importance_and_number": "PASSED",
    "TestPredicateList.test_ordering_importance_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_number_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_xhr_and_request_method_trump_only_containment": "PASSED",
    "TestPredicateList.test_predicate_text_is_correct": "PASSED",
    "TestPredicateList.test_request_method_ordering_hashes_same": "PASSED",
    "TestPredicateList.test_request_method_sequence": "PASSED",
    "TestPredicateList.test_traverse_has_remainder_already": "PASSED",
    "TestPredicateList.test_traverse_matches": "PASSED",
    "TestPredicateList.test_traverse_matches_with_highorder_chars": "PASSED",
    "TestPredicateList.test_unknown_predicate": "PASSED",
    "Test_takes_one_arg.test_function_annotations": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_function_noargs": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_function_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_false": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_true": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_instance_nocall": "PASSED",
    "Test_takes_one_arg.test_instance_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_method_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_firstname_request_with_secondname": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_no_init": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_no_init": "PASSED",
    "TestNotted.test_it_with_phash_val": "PASSED",
    "TestNotted.test_it_without_phash_val": "PASSED",
    "TestDeprecatedPredicates.test_it": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_exception_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_normal_and_exception_view_intr_derived_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash_custom_response": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_absolute": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_here_no_utility_registered": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_package_relative": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_class_method_no_attr": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_trumps_for": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_more_preds_first_bests_fewer_preds_last": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_multiviews": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_only_exc_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_mulview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_misconfiguration": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_no_regular_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for__as_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_mixed_case_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview___discriminator__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_call_ordering": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_context_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_exception_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_no_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_check_csrf_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_param": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator_tuple": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_missing_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name_unicode": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_no_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_nonexistant_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_get_implies_head": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_and_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_noniface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name_exception": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_introspector_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_no_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_with_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_conflicts": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_doesnt_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_wrapped_view_is_decorated": "PASSED",
    "TestViewsConfigurationMixin.test_add_views_with_accept_multiview_replaces_existing": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_function": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_no_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_with_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate_with_mismatch": "PASSED",
    "Test_runtime_exc_view.test_call": "PASSED",
    "Test_runtime_exc_view.test_call_dispatches_on_exception": "PASSED",
    "Test_runtime_exc_view.test_permitted": "PASSED",
    "Test_runtime_exc_view.test_permitted_dispatches_on_exception": "PASSED",
    "Test_requestonly.test_defaults": "PASSED",
    "Test_requestonly.test_otherattr": "PASSED",
    "Test_isexception.test_is_IException": "PASSED",
    "Test_isexception.test_is_IException_subinterface": "PASSED",
    "Test_isexception.test_is_exception_class": "PASSED",
    "Test_isexception.test_is_exception_instance": "PASSED",
    "TestMultiView.test___call__": "PASSED",
    "TestMultiView.test___call__intermediate_not_found": "PASSED",
    "TestMultiView.test___call__raise_not_found_isnt_interpreted_as_pred_mismatch": "PASSED",
    "TestMultiView.test___call_permissive_has_call_permissive": "PASSED",
    "TestMultiView.test___call_permissive_has_no_call_permissive": "PASSED",
    "TestMultiView.test__call__not_found": "PASSED",
    "TestMultiView.test__call__with_accept_match": "PASSED",
    "TestMultiView.test__call__with_accept_miss": "PASSED",
    "TestMultiView.test__call_permissive__not_found": "PASSED",
    "TestMultiView.test_add": "PASSED",
    "TestMultiView.test_add_with_phash": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept2": "PASSED",
    "TestMultiView.test_class_implements_ISecuredView": "PASSED",
    "TestMultiView.test_get_views": "PASSED",
    "TestMultiView.test_get_views_best_match_returns_None": "PASSED",
    "TestMultiView.test_get_views_no_self_accepts": "PASSED",
    "TestMultiView.test_get_views_request_has_no_accept": "PASSED",
    "TestMultiView.test_instance_implements_ISecuredView": "PASSED",
    "TestMultiView.test_match_not_found": "PASSED",
    "TestMultiView.test_match_predicate_fails": "PASSED",
    "TestMultiView.test_match_predicate_succeeds": "PASSED",
    "TestMultiView.test_multiple_with_functions_as_views": "PASSED",
    "TestMultiView.test_permitted": "PASSED",
    "TestMultiView.test_permitted_no_match_with__permitted__": "PASSED",
    "TestMultiView.test_permitted_no_views": "PASSED",
    "TestDefaultViewMapper.test__view_as_function_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request_and_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly_with_attr": "PASSED",
    "Test_preserve_view_attrs.test_it_different": "PASSED",
    "Test_preserve_view_attrs.test_it_different_with_existing_original_view": "PASSED",
    "Test_preserve_view_attrs.test_it_same": "PASSED",
    "Test_preserve_view_attrs.test_it_view_is_None": "PASSED",
    "TestStaticURLInfo.test_add_already_exists": "PASSED",
    "TestStaticURLInfo.test_add_cachebust_prevented": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_abspath": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_for_more_specific_path": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite_explicit": "PASSED",
    "TestStaticURLInfo.test_add_package_root": "PASSED",
    "TestStaticURLInfo.test_add_url_noendslash": "PASSED",
    "TestStaticURLInfo.test_add_url_noscheme": "PASSED",
    "TestStaticURLInfo.test_add_url_withendslash": "PASSED",
    "TestStaticURLInfo.test_add_viewname": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_context": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_for_": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_permission": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_renderer": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_route_prefix": "PASSED",
    "TestStaticURLInfo.test_generate_missing": "PASSED",
    "TestStaticURLInfo.test_generate_quoting": "PASSED",
    "TestStaticURLInfo.test_generate_registration_miss": "PASSED",
    "TestStaticURLInfo.test_generate_route_url": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name1": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name2": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_abspath": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_nomatch": "PASSED",
    "TestStaticURLInfo.test_generate_url_quoted_remote": "PASSED",
    "TestStaticURLInfo.test_generate_url_unquoted_local": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_anchor": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_query": "PASSED",
    "TestStaticURLInfo.test_verifyClass": "PASSED",
    "TestStaticURLInfo.test_verifyObject": "PASSED",
    "Test_view_description.test_with_text": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "PASSED",
    "TestPCreateCommand.test_confirm_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_site_name": "PASSED",
    "TestPCreateCommand.test_known_scaffold_absolute_path": "PASSED",
    "TestPCreateCommand.test_known_scaffold_multiple_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_single_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_with_path_as_project_target_rendered": "PASSED",
    "TestPCreateCommand.test_no_project_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_no_args": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_exist": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_none_exist": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_hyphen_in_project_name": "PASSED",
    "TestPCreateCommand.test_scaffold_with_package_name": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_unparsable_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_version": "PASSED",
    "TestPCreateCommand.test_unknown_scaffold_name": "PASSED",
    "Test_main.test_it": "PASSED",
    "TestPDistReportCommand.test_no_dists": "PASSED",
    "TestPDistReportCommand.test_with_dists": "PASSED",
    "TestPRequestCommand.test_command_display_headers": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_good_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "PASSED",
    "TestPRequestCommand.test_command_method_configures_logging": "PASSED",
    "TestPRequestCommand.test_command_method_get": "PASSED",
    "TestPRequestCommand.test_command_method_options": "PASSED",
    "TestPRequestCommand.test_command_method_patch": "PASSED",
    "TestPRequestCommand.test_command_method_post": "PASSED",
    "TestPRequestCommand.test_command_method_propfind": "PASSED",
    "TestPRequestCommand.test_command_method_put": "PASSED",
    "TestPRequestCommand.test_command_not_enough_args": "PASSED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "PASSED",
    "TestPRequestCommand.test_command_response_has_no_charset": "PASSED",
    "TestPRequestCommand.test_command_two_args": "PASSED",
    "TestPRequestCommand.test_command_w_basic_auth": "PASSED",
    "TestPRequestCommand.test_command_with_query_string": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_bad_format": "PASSED",
    "TestPRoutesCommand.test_class_view": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_commas": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_newlines": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_spaces": "PASSED",
    "TestPRoutesCommand.test_good_args": "PASSED",
    "TestPRoutesCommand.test_good_format": "PASSED",
    "TestPRoutesCommand.test_no_mapper": "PASSED",
    "TestPRoutesCommand.test_no_routes": "PASSED",
    "TestPRoutesCommand.test_route_as_wsgiapp": "PASSED",
    "TestPRoutesCommand.test_route_no_view": "PASSED",
    "TestPRoutesCommand.test_route_with_no_slash_prefix": "PASSED",
    "TestPRoutesCommand.test_single_route_multiview_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_route_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_views_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_one_view_registered_with_factory": "PASSED",
    "TestPRoutesCommand.test_static_routes_included_in_list": "PASSED",
    "TestPServeCommand.test_get_options_no_command": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_run_no_args": "PASSED",
    "TestPShellCommand.test_command_custom_section_override": "PASSED",
    "TestPShellCommand.test_command_default_shell_option": "PASSED",
    "TestPShellCommand.test_command_errors_with_unknown_shell": "PASSED",
    "TestPShellCommand.test_command_loads_check_variable_override_order": "PASSED",
    "TestPShellCommand.test_command_loads_custom_items": "PASSED",
    "TestPShellCommand.test_command_loads_default_shell": "PASSED",
    "TestPShellCommand.test_command_loads_ipython": "PASSED",
    "TestPShellCommand.test_command_loads_pythonstartup": "PASSED",
    "TestPShellCommand.test_command_loads_setup_from_options": "PASSED",
    "TestPShellCommand.test_command_setup": "PASSED",
    "TestPShellCommand.test_list_shells": "PASSED",
    "TestPShellCommand.test_shell_entry_points": "PASSED",
    "TestPShellCommand.test_shell_ordering": "PASSED",
    "TestPShellCommand.test_shell_override": "PASSED",
    "Test_python_shell_runner.test_it": "PASSED",
    "TestPTweensCommand.test__get_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_and_explicit_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_tweens_only": "PASSED",
    "TestPTweensCommand.test_command_no_tweens": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_all_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_none_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_some_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match_multiview_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview_no_view_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_no_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_traversal": "PASSED",
    "TestPViewsCommand.test__find_view_traversal_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_multi_view_nested": "PASSED",
    "TestPViewsCommand.test_views_command_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_not_found": "PASSED",
    "TestPViewsCommand.test_views_command_not_found_url_starts_without_slash": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route_with_route_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_predicates": "PASSED",
    "Test_make_localizer.test_locale_from_mo": "FAILED",
    "Test_make_localizer.test_territory_fallback": "FAILED",
    "TestTranslations.test_load_found_locale_and_domain": "FAILED",
    "TestTranslations.test_load_found_locale_and_domain_locale_is_string": "FAILED",
    "TestLocalizerRequestMixin.test_localizer_from_mo": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_package": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_file": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_package": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_no_overrides": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_None": "FAILED",
    "TestPackageAssetSource.test_get_filename": "FAILED",
    "TestPackageAssetSource.test_get_filename_with_prefix": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_abspath": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls": "FAILED",
    "ConfiguratorTests.test_ctor_no_registry": "FAILED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_include_constant_root_package": "FAILED",
    "ConfiguratorTests.test_scan_integration_conflict": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_custom_callable": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_partial": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_dotted_name": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_python_callable": "FAILED",
    "TestConfigurator__add_predicate.test_factory_as_dotted_name": "FAILED",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestStaticURLInfo.test_generate_url_cachebust_with_overrides": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRoutesCommand.test_one_route_all_methods_view_only_post": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_all_methods": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_post_and_get": "FAILED",
    "TestPRoutesCommand.test_one_route_with_long_name_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_route_is_get_view_request_method_not_post": "FAILED",
    "TestPRoutesCommand.test_route_request_method_mismatch": "FAILED",
    "TestPRoutesCommand.test_route_static_views": "FAILED",
    "TestPRoutesCommand.test_single_route_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_view_glob": "FAILED",
    "TestPRoutesCommand.test_view_request_method_not_post": "FAILED",
    "TestPServeCommand.test_config_file_finds_watch_files": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED"
}
diff --git a/pyramid/i18n.py b/pyramid/i18n.py
index 79209d342..1d11adfe3 100644
--- a/pyramid/i18n.py
+++ b/pyramid/i18n.py
@@ -22,6 +22,7 @@ from pyramid.threadlocal import get_current_registry
 TranslationString = TranslationString  # PyFlakes
 TranslationStringFactory = TranslationStringFactory  # PyFlakes
 
+DEFAULT_PLURAL = lambda n: int(n != 1)
 
 class Localizer(object):
     """
@@ -233,7 +234,13 @@ class Translations(gettext.GNUTranslations, object):
         # GNUTranslations._parse (called as a side effect if fileobj is
         # passed to GNUTranslations.__init__) with a "real" self.plural for
         # this domain; see https://github.com/Pylons/pyramid/issues/235
-        self.plural = lambda n: int(n != 1) 
+        # It is only overridden the first time a new message file is found
+        # for a given domain, so all message files must have matching plural
+        # rules if they are in the same domain. We keep track of if we have
+        # overridden so we can special case the default domain, which is always
+        # instantiated before a message file is read.
+        # See also https://github.com/Pylons/pyramid/pull/2102
+        self.plural = DEFAULT_PLURAL
         gettext.GNUTranslations.__init__(self, fp=fileobj)
         self.files = list(filter(None, [getattr(fileobj, 'name', None)]))
         self.domain = domain
@@ -285,6 +292,9 @@ class Translations(gettext.GNUTranslations, object):
         :rtype: `Translations`
         """
         domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)
+        if domain == self.DEFAULT_DOMAIN and self.plural is DEFAULT_PLURAL:
+            self.plural = translations.plural
+
         if merge and domain == self.domain:
             return self.merge(translations)
 

{"pyramid/i18n.py": "import gettext\nimport os\n\nfrom translationstring import (\n    Translator,\n    Pluralizer,\n    TranslationString, # API\n    TranslationStringFactory, # API\n    )\n\nfrom pyramid.compat import PY2\nfrom pyramid.decorator import reify\n\nfrom pyramid.interfaces import (\n    ILocalizer,\n    ITranslationDirectories,\n    ILocaleNegotiator,\n    )\n\nfrom pyramid.threadlocal import get_current_registry\n\nTranslationString = TranslationString  # PyFlakes\nTranslationStringFactory = TranslationStringFactory  # PyFlakes\n\n\nclass Localizer(object):\n    \"\"\"\n    An object providing translation and pluralizations related to\n    the current request's locale name.  A\n    :class:`pyramid.i18n.Localizer` object is created using the\n    :func:`pyramid.i18n.get_localizer` function.\n    \"\"\"\n    def __init__(self, locale_name, translations):\n        self.locale_name = locale_name\n        self.translations = translations\n        self.pluralizer = None\n        self.translator = None\n\n    def translate(self, tstring, domain=None, mapping=None):\n        \"\"\"\n        Translate a :term:`translation string` to the current language\n        and interpolate any *replacement markers* in the result.  The\n        ``translate`` method accepts three arguments: ``tstring``\n        (required), ``domain`` (optional) and ``mapping`` (optional).\n        When called, it will translate the ``tstring`` translation\n        string to a ``unicode`` object using the current locale.  If\n        the current locale could not be determined, the result of\n        interpolation of the default value is returned.  The optional\n        ``domain`` argument can be used to specify or override the\n        domain of the ``tstring`` (useful when ``tstring`` is a normal\n        string rather than a translation string).  The optional\n        ``mapping`` argument can specify or override the ``tstring``\n        interpolation mapping, useful when the ``tstring`` argument is\n        a simple string instead of a translation string.\n\n        Example::\n\n           from pyramid.18n import TranslationString\n           ts = TranslationString('Add ${item}', domain='mypackage',\n                                  mapping={'item':'Item'})\n           translated = localizer.translate(ts)\n\n        Example::\n\n           translated = localizer.translate('Add ${item}', domain='mypackage',\n                                            mapping={'item':'Item'})\n\n        \"\"\"\n        if self.translator is None:\n            self.translator = Translator(self.translations)\n        return self.translator(tstring, domain=domain, mapping=mapping)\n\n    def pluralize(self, singular, plural, n, domain=None, mapping=None):\n        \"\"\"\n        Return a Unicode string translation by using two\n        :term:`message identifier` objects as a singular/plural pair\n        and an ``n`` value representing the number that appears in the\n        message using gettext plural forms support.  The ``singular``\n        and ``plural`` objects should be unicode strings. There is no\n        reason to use translation string objects as arguments as all\n        metadata is ignored.\n        \n        ``n`` represents the number of elements. ``domain`` is the\n        translation domain to use to do the pluralization, and ``mapping``\n        is the interpolation mapping that should be used on the result. If\n        the ``domain`` is not supplied, a default domain is used (usually\n        ``messages``).\n        \n        Example::\n\n           num = 1\n           translated = localizer.pluralize('Add ${num} item',\n                                            'Add ${num} items',\n                                            num,\n                                            mapping={'num':num})\n\n        If using the gettext plural support, which is required for\n        languages that have pluralisation rules other than n != 1, the\n        ``singular`` argument must be the message_id defined in the\n        translation file. The plural argument is not used in this case.\n\n        Example::\n\n           num = 1\n           translated = localizer.pluralize('item_plural',\n                                            '',\n                                            num,\n                                            mapping={'num':num})\n\n        \n        \"\"\"\n        if self.pluralizer is None:\n            self.pluralizer = Pluralizer(self.translations)\n        return self.pluralizer(singular, plural, n, domain=domain,\n                               mapping=mapping)\n\n\ndef default_locale_negotiator(request):\n    \"\"\" The default :term:`locale negotiator`.  Returns a locale name\n    or ``None``.\n\n    - First, the negotiator looks for the ``_LOCALE_`` attribute of\n      the request object (possibly set by a view or a listener for an\n      :term:`event`). If the attribute exists and it is not ``None``,\n      its value will be used.\n  \n    - Then it looks for the ``request.params['_LOCALE_']`` value.\n\n    - Then it looks for the ``request.cookies['_LOCALE_']`` value.\n\n    - Finally, the negotiator returns ``None`` if the locale could not\n      be determined via any of the previous checks (when a locale\n      negotiator returns ``None``, it signifies that the\n      :term:`default locale name` should be used.)\n    \"\"\"\n    name = '_LOCALE_'\n    locale_name = getattr(request, name, None)\n    if locale_name is None:\n        locale_name = request.params.get(name)\n        if locale_name is None:\n            locale_name = request.cookies.get(name)\n    return locale_name\n\ndef negotiate_locale_name(request):\n    \"\"\" Negotiate and return the :term:`locale name` associated with\n    the current request.\"\"\"\n    try:\n        registry = request.registry\n    except AttributeError:\n        registry = get_current_registry()\n    negotiator = registry.queryUtility(ILocaleNegotiator,\n                                       default=default_locale_negotiator)\n    locale_name = negotiator(request)\n\n    if locale_name is None:\n        settings = registry.settings or {}\n        locale_name = settings.get('default_locale_name', 'en')\n\n    return locale_name\n\ndef get_locale_name(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :attr:`pyramid.request.Request.locale_name` directly instead.\n        Return the :term:`locale name` associated with the current request.\n    \"\"\"\n    return request.locale_name\n\ndef make_localizer(current_locale_name, translation_directories):\n    \"\"\" Create a :class:`pyramid.i18n.Localizer` object\n    corresponding to the provided locale name from the \n    translations found in the list of translation directories.\"\"\"\n    translations = Translations()\n    translations._catalog = {}\n\n    locales_to_try = []\n    if '_' in current_locale_name:\n        locales_to_try = [current_locale_name.split('_')[0]]\n    locales_to_try.append(current_locale_name)\n\n    # intent: order locales left to right in least specific to most specific,\n    # e.g. ['de', 'de_DE'].  This services the intent of creating a\n    # translations object that returns a \"more specific\" translation for a\n    # region, but will fall back to a \"less specific\" translation for the\n    # locale if necessary.  Ordering from least specific to most specific\n    # allows us to call translations.add in the below loop to get this\n    # behavior.\n\n    for tdir in translation_directories:\n        locale_dirs = []\n        for lname in locales_to_try:\n            ldir = os.path.realpath(os.path.join(tdir, lname))\n            if os.path.isdir(ldir):\n                locale_dirs.append(ldir)\n\n        for locale_dir in locale_dirs:\n            messages_dir = os.path.join(locale_dir, 'LC_MESSAGES')\n            if not os.path.isdir(os.path.realpath(messages_dir)):\n                continue\n            for mofile in os.listdir(messages_dir):\n                mopath = os.path.realpath(os.path.join(messages_dir,\n                                                       mofile))\n                if mofile.endswith('.mo') and os.path.isfile(mopath):\n                    with open(mopath, 'rb') as mofp:\n                        domain = mofile[:-3]\n                        dtrans = Translations(mofp, domain)\n                        translations.add(dtrans)\n\n    return Localizer(locale_name=current_locale_name,\n                          translations=translations)\n\ndef get_localizer(request):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use the :attr:`pyramid.request.Request.localizer` attribute directly\n        instead.  Retrieve a :class:`pyramid.i18n.Localizer` object\n        corresponding to the current request's locale name.\n    \"\"\"\n    return request.localizer\n\nclass Translations(gettext.GNUTranslations, object):\n    \"\"\"An extended translation catalog class (ripped off from Babel) \"\"\"\n\n    DEFAULT_DOMAIN = 'messages'\n\n    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Initialize the translations catalog.\n\n        :param fileobj: the file-like object the translation should be read\n                        from\n        \"\"\"\n        # germanic plural by default; self.plural will be overwritten by\n        # GNUTranslations._parse (called as a side effect if fileobj is\n        # passed to GNUTranslations.__init__) with a \"real\" self.plural for\n        # this domain; see https://github.com/Pylons/pyramid/issues/235\n        self.plural = lambda n: int(n != 1) \n        gettext.GNUTranslations.__init__(self, fp=fileobj)\n        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))\n        self.domain = domain\n        self._domains = {}\n\n    @classmethod\n    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):\n        \"\"\"Load translations from the given directory.\n\n        :param dirname: the directory containing the ``MO`` files\n        :param locales: the list of locales in order of preference (items in\n                        this list can be either `Locale` objects or locale\n                        strings)\n        :param domain: the message domain\n        :return: the loaded catalog, or a ``NullTranslations`` instance if no\n                 matching translations were found\n        :rtype: `Translations`\n        \"\"\"\n        if locales is not None:\n            if not isinstance(locales, (list, tuple)):\n                locales = [locales]\n            locales = [str(l) for l in locales]\n        if not domain:\n            domain = cls.DEFAULT_DOMAIN\n        filename = gettext.find(domain, dirname, locales)\n        if not filename:\n            return gettext.NullTranslations()\n        with open(filename, 'rb') as fp:\n            return cls(fileobj=fp, domain=domain)\n\n    def __repr__(self):\n        return '<%s: \"%s\">' % (type(self).__name__,\n                               self._info.get('project-id-version'))\n\n    def add(self, translations, merge=True):\n        \"\"\"Add the given translations to the catalog.\n\n        If the domain of the translations is different than that of the\n        current catalog, they are added as a catalog that is only accessible\n        by the various ``d*gettext`` functions.\n\n        :param translations: the `Translations` instance with the messages to\n                             add\n        :param merge: whether translations for message domains that have\n                      already been added should be merged with the existing\n                      translations\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)\n        if merge and domain == self.domain:\n            return self.merge(translations)\n\n        existing = self._domains.get(domain)\n        if merge and existing is not None:\n            existing.merge(translations)\n        else:\n            translations.add_fallback(self)\n            self._domains[domain] = translations\n\n        return self\n\n    def merge(self, translations):\n        \"\"\"Merge the given translations into the catalog.\n\n        Message translations in the specified catalog override any messages\n        with the same identifier in the existing catalog.\n\n        :param translations: the `Translations` instance with the messages to\n                             merge\n        :return: the `Translations` instance (``self``) so that `merge` calls\n                 can be easily chained\n        :rtype: `Translations`\n        \"\"\"\n        if isinstance(translations, gettext.GNUTranslations):\n            self._catalog.update(translations._catalog)\n            if isinstance(translations, Translations):\n                self.files.extend(translations.files)\n\n        return self\n\n    def dgettext(self, domain, message):\n        \"\"\"Like ``gettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).gettext(message)\n    \n    def ldgettext(self, domain, message):\n        \"\"\"Like ``lgettext()``, but look the message up in the specified \n        domain.\n        \"\"\" \n        return self._domains.get(domain, self).lgettext(message)\n    \n    def dugettext(self, domain, message):\n        \"\"\"Like ``ugettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ugettext(message)\n        else:\n            return self._domains.get(domain, self).gettext(message)\n    \n    def dngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).ngettext(singular, plural, num)\n    \n    def ldngettext(self, domain, singular, plural, num):\n        \"\"\"Like ``lngettext()``, but look the message up in the specified\n        domain.\n        \"\"\"\n        return self._domains.get(domain, self).lngettext(singular, plural, num)\n    \n    def dungettext(self, domain, singular, plural, num):\n        \"\"\"Like ``ungettext()`` but look the message up in the specified\n        domain.\n        \"\"\"\n        if PY2:\n            return self._domains.get(domain, self).ungettext(\n                singular, plural, num)\n        else:\n            return self._domains.get(domain, self).ngettext(\n                singular, plural, num)\n\nclass LocalizerRequestMixin(object):\n    @reify\n    def localizer(self):\n        \"\"\" Convenience property to return a localizer \"\"\"\n        registry = self.registry\n\n        current_locale_name = self.locale_name\n        localizer = registry.queryUtility(ILocalizer, name=current_locale_name)\n\n        if localizer is None:\n            # no localizer utility registered yet\n            tdirs = registry.queryUtility(ITranslationDirectories, default=[])\n            localizer = make_localizer(current_locale_name, tdirs)\n\n            registry.registerUtility(localizer, ILocalizer,\n                                     name=current_locale_name)\n\n        return localizer\n\n    @reify\n    def locale_name(self):\n        locale_name = negotiate_locale_name(self)\n        return locale_name\n        \n    \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:** Default Domain Does Not Update Pluralization for Non-Germanic Languages

**Description:**
When adding a message file with a non-germanic plural rule to the default domain, the pluralization remains using the default germanic rule. This results in incorrect plural forms being applied for languages that have different pluralization rules.

**Example Buggy Code:**
```python
# Initialize translations for the default domain with germanic plural rule
translations = Translations(domain='messages')
translations.plural = lambda n: int(n != 1)

# Add a French message file with a French plural rule
french_translations = Translations(domain='messages')
french_translations.plural = lambda n: n > 1
translations.add(french_translations)

# Attempt to get plural forms
print(translations.plural(0))  # Expected: 0
print(translations.plural(1))  # Expected: 0
print(translations.plural(2))  # Expected: 1
```

**Expected Behavior:**
After adding the French translations, the plural function in the default domain should use the French pluralization rules. Therefore:
- `translations.plural(0)` should return `0`
- `translations.plural(1)` should return `0`
- `translations.plural(2)` should return `1`

**Actual Behavior:**
The plural function still uses the germanic rule:
- `translations.plural(0)` returns `1` instead of `0`
- `translations.plural(1)` returns `0` as expected
- `translations.plural(2)` returns `1` as expected

This indicates that the plural rule for the default domain is not being updated correctly when a non-germanic language is added.
[/ISSUE]
--- END ISSUE ---

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

--- BEGIN FILE ---
```
### pyramid/i18n.py
import gettext
import os

from translationstring import (
    Translator,
    Pluralizer,
    TranslationString, # API
    TranslationStringFactory, # API
    )

from pyramid.compat import PY2
from pyramid.decorator import reify

from pyramid.interfaces import (
    ILocalizer,
    ITranslationDirectories,
    ILocaleNegotiator,
    )

from pyramid.threadlocal import get_current_registry

TranslationString = TranslationString  # PyFlakes
TranslationStringFactory = TranslationStringFactory  # PyFlakes


class Localizer(object):
    """
    An object providing translation and pluralizations related to
    the current request's locale name.  A
    :class:`pyramid.i18n.Localizer` object is created using the
    :func:`pyramid.i18n.get_localizer` function.
    """
    def __init__(self, locale_name, translations):
        self.locale_name = locale_name
        self.translations = translations
        self.pluralizer = None
        self.translator = None

    def translate(self, tstring, domain=None, mapping=None):
        """
        Translate a :term:`translation string` to the current language
        and interpolate any *replacement markers* in the result.  The
        ``translate`` method accepts three arguments: ``tstring``
        (required), ``domain`` (optional) and ``mapping`` (optional).
        When called, it will translate the ``tstring`` translation
        string to a ``unicode`` object using the current locale.  If
        the current locale could not be determined, the result of
        interpolation of the default value is returned.  The optional
        ``domain`` argument can be used to specify or override the
        domain of the ``tstring`` (useful when ``tstring`` is a normal
        string rather than a translation string).  The optional
        ``mapping`` argument can specify or override the ``tstring``
        interpolation mapping, useful when the ``tstring`` argument is
        a simple string instead of a translation string.

        Example::

           from pyramid.18n import TranslationString
           ts = TranslationString('Add ${item}', domain='mypackage',
                                  mapping={'item':'Item'})
           translated = localizer.translate(ts)

        Example::

           translated = localizer.translate('Add ${item}', domain='mypackage',
                                            mapping={'item':'Item'})

        """
        if self.translator is None:
            self.translator = Translator(self.translations)
        return self.translator(tstring, domain=domain, mapping=mapping)

    def pluralize(self, singular, plural, n, domain=None, mapping=None):
        """
        Return a Unicode string translation by using two
        :term:`message identifier` objects as a singular/plural pair
        and an ``n`` value representing the number that appears in the
        message using gettext plural forms support.  The ``singular``
        and ``plural`` objects should be unicode strings. There is no
        reason to use translation string objects as arguments as all
        metadata is ignored.
        
        ``n`` represents the number of elements. ``domain`` is the
        translation domain to use to do the pluralization, and ``mapping``
        is the interpolation mapping that should be used on the result. If
        the ``domain`` is not supplied, a default domain is used (usually
        ``messages``).
        
        Example::

           num = 1
           translated = localizer.pluralize('Add ${num} item',
                                            'Add ${num} items',
                                            num,
                                            mapping={'num':num})

        If using the gettext plural support, which is required for
        languages that have pluralisation rules other than n != 1, the
        ``singular`` argument must be the message_id defined in the
        translation file. The plural argument is not used in this case.

        Example::

           num = 1
           translated = localizer.pluralize('item_plural',
                                            '',
                                            num,
                                            mapping={'num':num})

        
        """
        if self.pluralizer is None:
            self.pluralizer = Pluralizer(self.translations)
        return self.pluralizer(singular, plural, n, domain=domain,
                               mapping=mapping)


def default_locale_negotiator(request):
    """ The default :term:`locale negotiator`.  Returns a locale name
    or ``None``.

    - First, the negotiator looks for the ``_LOCALE_`` attribute of
      the request object (possibly set by a view or a listener for an
      :term:`event`). If the attribute exists and it is not ``None``,
      its value will be used.
  
    - Then it looks for the ``request.params['_LOCALE_']`` value.

    - Then it looks for the ``request.cookies['_LOCALE_']`` value.

    - Finally, the negotiator returns ``None`` if the locale could not
      be determined via any of the previous checks (when a locale
      negotiator returns ``None``, it signifies that the
      :term:`default locale name` should be used.)
    """
    name = '_LOCALE_'
    locale_name = getattr(request, name, None)
    if locale_name is None:
        locale_name = request.params.get(name)
        if locale_name is None:
            locale_name = request.cookies.get(name)
    return locale_name

def negotiate_locale_name(request):
    """ Negotiate and return the :term:`locale name` associated with
    the current request."""
    try:
        registry = request.registry
    except AttributeError:
        registry = get_current_registry()
    negotiator = registry.queryUtility(ILocaleNegotiator,
                                       default=default_locale_negotiator)
    locale_name = negotiator(request)

    if locale_name is None:
        settings = registry.settings or {}
        locale_name = settings.get('default_locale_name', 'en')

    return locale_name

def get_locale_name(request):
    """
    .. deprecated:: 1.5
        Use :attr:`pyramid.request.Request.locale_name` directly instead.
        Return the :term:`locale name` associated with the current request.
    """
    return request.locale_name

def make_localizer(current_locale_name, translation_directories):
    """ Create a :class:`pyramid.i18n.Localizer` object
    corresponding to the provided locale name from the 
    translations found in the list of translation directories."""
    translations = Translations()
    translations._catalog = {}

    locales_to_try = []
    if '_' in current_locale_name:
        locales_to_try = [current_locale_name.split('_')[0]]
    locales_to_try.append(current_locale_name)

    # intent: order locales left to right in least specific to most specific,
    # e.g. ['de', 'de_DE'].  This services the intent of creating a
    # translations object that returns a "more specific" translation for a
    # region, but will fall back to a "less specific" translation for the
    # locale if necessary.  Ordering from least specific to most specific
    # allows us to call translations.add in the below loop to get this
    # behavior.

    for tdir in translation_directories:
        locale_dirs = []
        for lname in locales_to_try:
            ldir = os.path.realpath(os.path.join(tdir, lname))
            if os.path.isdir(ldir):
                locale_dirs.append(ldir)

        for locale_dir in locale_dirs:
            messages_dir = os.path.join(locale_dir, 'LC_MESSAGES')
            if not os.path.isdir(os.path.realpath(messages_dir)):
                continue
            for mofile in os.listdir(messages_dir):
                mopath = os.path.realpath(os.path.join(messages_dir,
                                                       mofile))
                if mofile.endswith('.mo') and os.path.isfile(mopath):
                    with open(mopath, 'rb') as mofp:
                        domain = mofile[:-3]
                        dtrans = Translations(mofp, domain)
                        translations.add(dtrans)

    return Localizer(locale_name=current_locale_name,
                          translations=translations)

def get_localizer(request):
    """
    .. deprecated:: 1.5
        Use the :attr:`pyramid.request.Request.localizer` attribute directly
        instead.  Retrieve a :class:`pyramid.i18n.Localizer` object
        corresponding to the current request's locale name.
    """
    return request.localizer

class Translations(gettext.GNUTranslations, object):
    """An extended translation catalog class (ripped off from Babel) """

    DEFAULT_DOMAIN = 'messages'

    def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN):
        """Initialize the translations catalog.

        :param fileobj: the file-like object the translation should be read
                        from
        """
        # germanic plural by default; self.plural will be overwritten by
        # GNUTranslations._parse (called as a side effect if fileobj is
        # passed to GNUTranslations.__init__) with a "real" self.plural for
        # this domain; see https://github.com/Pylons/pyramid/issues/235
        self.plural = lambda n: int(n != 1) 
        gettext.GNUTranslations.__init__(self, fp=fileobj)
        self.files = list(filter(None, [getattr(fileobj, 'name', None)]))
        self.domain = domain
        self._domains = {}

    @classmethod
    def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN):
        """Load translations from the given directory.

        :param dirname: the directory containing the ``MO`` files
        :param locales: the list of locales in order of preference (items in
                        this list can be either `Locale` objects or locale
                        strings)
        :param domain: the message domain
        :return: the loaded catalog, or a ``NullTranslations`` instance if no
                 matching translations were found
        :rtype: `Translations`
        """
        if locales is not None:
            if not isinstance(locales, (list, tuple)):
                locales = [locales]
            locales = [str(l) for l in locales]
        if not domain:
            domain = cls.DEFAULT_DOMAIN
        filename = gettext.find(domain, dirname, locales)
        if not filename:
            return gettext.NullTranslations()
        with open(filename, 'rb') as fp:
            return cls(fileobj=fp, domain=domain)

    def __repr__(self):
        return '<%s: "%s">' % (type(self).__name__,
                               self._info.get('project-id-version'))

    def add(self, translations, merge=True):
        """Add the given translations to the catalog.

        If the domain of the translations is different than that of the
        current catalog, they are added as a catalog that is only accessible
        by the various ``d*gettext`` functions.

        :param translations: the `Translations` instance with the messages to
                             add
        :param merge: whether translations for message domains that have
                      already been added should be merged with the existing
                      translations
        :return: the `Translations` instance (``self``) so that `merge` calls
                 can be easily chained
        :rtype: `Translations`
        """
        domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN)
        if merge and domain == self.domain:
            return self.merge(translations)

        existing = self._domains.get(domain)
        if merge and existing is not None:
            existing.merge(translations)
        else:
            translations.add_fallback(self)
            self._domains[domain] = translations

        return self

    def merge(self, translations):
        """Merge the given translations into the catalog.

        Message translations in the specified catalog override any messages
        with the same identifier in the existing catalog.

        :param translations: the `Translations` instance with the messages to
                             merge
        :return: the `Translations` instance (``self``) so that `merge` calls
                 can be easily chained
        :rtype: `Translations`
        """
        if isinstance(translations, gettext.GNUTranslations):
            self._catalog.update(translations._catalog)
            if isinstance(translations, Translations):
                self.files.extend(translations.files)

        return self

    def dgettext(self, domain, message):
        """Like ``gettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).gettext(message)
    
    def ldgettext(self, domain, message):
        """Like ``lgettext()``, but look the message up in the specified 
        domain.
        """ 
        return self._domains.get(domain, self).lgettext(message)
    
    def dugettext(self, domain, message):
        """Like ``ugettext()``, but look the message up in the specified
        domain.
        """
        if PY2:
            return self._domains.get(domain, self).ugettext(message)
        else:
            return self._domains.get(domain, self).gettext(message)
    
    def dngettext(self, domain, singular, plural, num):
        """Like ``ngettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).ngettext(singular, plural, num)
    
    def ldngettext(self, domain, singular, plural, num):
        """Like ``lngettext()``, but look the message up in the specified
        domain.
        """
        return self._domains.get(domain, self).lngettext(singular, plural, num)
    
    def dungettext(self, domain, singular, plural, num):
        """Like ``ungettext()`` but look the message up in the specified
        domain.
        """
        if PY2:
            return self._domains.get(domain, self).ungettext(
                singular, plural, num)
        else:
            return self._domains.get(domain, self).ngettext(
                singular, plural, num)

class LocalizerRequestMixin(object):
    @reify
    def localizer(self):
        """ Convenience property to return a localizer """
        registry = self.registry

        current_locale_name = self.locale_name
        localizer = registry.queryUtility(ILocalizer, name=current_locale_name)

        if localizer is None:
            # no localizer utility registered yet
            tdirs = registry.queryUtility(ITranslationDirectories, default=[])
            localizer = make_localizer(current_locale_name, tdirs)

            registry.registerUtility(localizer, ILocalizer,
                                     name=current_locale_name)

        return localizer

    @reify
    def locale_name(self):
        locale_name = negotiate_locale_name(self)
        return locale_name
        
    

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