Repository: pypi/warehouse

Issue:
Update pyramid to 1.8.1

There's a new version of [pyramid](https://pypi.python.org/pypi/pyramid) available.
You are currently using **1.7.3**. I have updated it to **1.8.1**



These links might come in handy:  <a href="http://pypi.python.org/pypi/pyramid">PyPI</a> | <a href="https://pyup.io/changelogs/pyramid/">Changelog</a> | <a href="https://trypyramid.com">Homepage</a> 



### Changelog
> 
>### 1.8

>================

>- No major changes from 1.8b1.



>### 1.8b1

>==================

>Features
>--------

>- Added an ``override`` option to ``config.add_translation_dirs`` to allow
>  later calls to place translation directories at a higher priority than
>  earlier calls. See https://github.com/Pylons/pyramid/pull/2902

>Documentation Changes
>---------------------

>- Improve registry documentation to discuss uses as a component registry
>  and as a dictionary. See https://github.com/Pylons/pyramid/pull/2893

>- Quick Tour, Quick Tutorial, and most other remaining documentation updated to
>  use cookiecutters instead of pcreate and scaffolds.
>  See https://github.com/Pylons/pyramid/pull/2888 and
>  https://github.com/Pylons/pyramid/pull/2889

>- Fix unittests in wiki2 to work without different dependencies between
>  py2 and py3. See https://github.com/Pylons/pyramid/pull/2899

>- Update Windows documentation to track newer Python 3 improvements to the
>  installer. See https://github.com/Pylons/pyramid/pull/2900

>- Updated the ``mod_wsgi`` tutorial to use cookiecutters and Apache 2.4+.
>  See https://github.com/Pylons/pyramid/pull/2901



>### 1.8a1

>==================

>Backward Incompatibilities
>--------------------------

>- Support for the ``IContextURL`` interface that was deprecated in Pyramid 1.3
>  has been removed.  See https://github.com/Pylons/pyramid/pull/2822

>- Following the Pyramid deprecation period (1.6 -&gt; 1.8),
>  daemon support for pserve has been removed. This includes removing the
>  daemon commands (start, stop, restart, status) as well as the following
>  arguments: ``--daemon``, ``--pid-file``, ``--log-file``,
>  ``--monitor-restart``, ``--status``, ``--user``, ``--group``,
>  ``--stop-daemon``

>  To run your server as a daemon you should use a process manager instead of
>  pserve.

>  See https://github.com/Pylons/pyramid/pull/2615

>- ``pcreate`` is now interactive by default. You will be prompted if a file
>  already exists with different content. Previously if there were similar
>  files it would silently skip them unless you specified ``--interactive``
>  or ``--overwrite``.
>  See https://github.com/Pylons/pyramid/pull/2775

>- Removed undocumented argument ``cachebust_match`` from
>  ``pyramid.static.static_view``. This argument was shipped accidentally
>  in Pyramid 1.6. See https://github.com/Pylons/pyramid/pull/2681

>- Change static view to avoid setting the ``Content-Encoding`` response header
>  to an encoding guessed using Python&#39;s ``mimetypes`` module. This was causing
>  clients to decode the content of gzipped files when downloading them. The
>  client would end up with a ``foo.txt.gz`` file on disk that was already
>  decoded, thus should really be ``foo.txt``. Also, the ``Content-Encoding``
>  should only have been used if the client itself broadcast support for the
>  encoding via ``Accept-Encoding`` request headers.
>  See https://github.com/Pylons/pyramid/pull/2810

>- Settings are no longer accessible as attributes on the settings object
>  (e.g. ``request.registry.settings.foo``). This was deprecated in Pyramid 1.2.
>  See https://github.com/Pylons/pyramid/pull/2823

>Features
>--------

>- Python 3.6 compatibility.
>  https://github.com/Pylons/pyramid/issues/2835

>- ``pcreate`` learned about ``--package-name`` to allow you to create a new
>  project in an existing folder with a different package name than the project
>  name. See https://github.com/Pylons/pyramid/pull/2783

>- The ``_get_credentials`` private method of ``BasicAuthAuthenticationPolicy``
>  has been extracted into standalone function ``extract_http_basic_credentials``
>  in ``pyramid.authentication`` module, this function extracts HTTP Basic
>  credentials from a ``request`` object, and returns them as a named tuple.
>  See https://github.com/Pylons/pyramid/pull/2662

>- Pyramid 1.4 silently dropped a feature of the configurator that has been
>  restored. It&#39;s again possible for action discriminators to conflict across
>  different action orders.
>  See https://github.com/Pylons/pyramid/pull/2757

>- ``pyramid.paster.bootstrap`` and its sibling ``pyramid.scripting.prepare``
>  can now be used as context managers to automatically invoke the ``closer``
>  and pop threadlocals off of the stack to prevent memory leaks.
>  See https://github.com/Pylons/pyramid/pull/2760

>- Added ``pyramid.config.Configurator.add_exception_view`` and the
>  ``pyramid.view.exception_view_config`` decorator. It is now possible using
>  these methods or via the new ``exception_only=True`` option to ``add_view``
>  to add a view which will only be matched when handling an exception.
>  Previously any exception views were also registered for a traversal
>  context that inherited from the exception class which prevented any
>  exception-only optimizations.
>  See https://github.com/Pylons/pyramid/pull/2660

>- Added the ``exception_only`` boolean to
>  ``pyramid.interfaces.IViewDeriverInfo`` which can be used by view derivers
>  to determine if they are wrapping a view which only handles exceptions.
>  This means that it is no longer necessary to perform request-time checks
>  for ``request.exception`` to determine if the view is handling an exception
>  - the pipeline can be optimized at config-time.
>  See https://github.com/Pylons/pyramid/pull/2660

>- ``pserve`` should now work with ``gevent`` and other workers that need
>  to monkeypatch the process, assuming the server and / or the app do so
>  as soon as possible before importing the rest of pyramid.
>  See https://github.com/Pylons/pyramid/pull/2797

>- Pyramid no longer copies the settings object passed to the
>  ``pyramid.config.Configurator(settings=)``. The original ``dict`` is kept.
>  See https://github.com/Pylons/pyramid/pull/2823

>- The csrf trusted origins setting may now be a whitespace-separated list of
>  domains. Previously only a python list was allowed. Also, it can now be set
>  using the ``PYRAMID_CSRF_TRUSTED_ORIGINS`` environment variable similar to
>  other settings. See https://github.com/Pylons/pyramid/pull/2823

>- ``pserve --reload`` now uses the
>  `hupper &lt;http://docs.pylonsproject.org/projects/hupper/en/latest/&gt;`
>  library to monitor file changes. This comes with many improvements:

>  - If the `watchdog &lt;http://pythonhosted.org/watchdog/&gt;`_ package is
>    installed then monitoring will be done using inotify instead of
>    cpu and disk-intensive polling.

>  - The monitor is now a separate process that will not crash and starts up
>    before any of your code.

>  - The monitor will not restart the process after a crash until a file is
>    saved.

>  - The monitor works on windows.

>  - You can now trigger a reload manually from a pyramid view or any other
>    code via ``hupper.get_reloader().trigger_reload()``. Kind of neat.

>  - You can trigger a reload by issuing a ``SIGHUP`` to the monitor process.

>  See https://github.com/Pylons/pyramid/pull/2805

>- A new ``[pserve]`` section is supported in your config files with a
>  ``watch_files`` key that can configure ``pserve --reload`` to monitor custom
>  file paths. See https://github.com/Pylons/pyramid/pull/2827

>- Allow streaming responses to be made from subclasses of
>  ``pyramid.httpexceptions.HTTPException``. Previously the response would
>  be unrolled while testing for a body, making it impossible to stream
>  a response.
>  See https://github.com/Pylons/pyramid/pull/2863

>- Update starter, alchemy and zodb scaffolds to support IPv6 by using the
>  new ``listen`` directives in waitress.
>  See https://github.com/Pylons/pyramid/pull/2853

>- All p* scripts now use argparse instead of optparse. This improves their
>  ``--help`` output as well as enabling nicer documentation of their options.
>  See https://github.com/Pylons/pyramid/pull/2864

>- Any deferred configuration action registered via ``config.action`` may now
>  depend on threadlocal state, such as asset overrides, being active when
>  the action is executed.
>  See https://github.com/Pylons/pyramid/pull/2873

>- Asset specifications for directories passed to
>  ``config.add_translation_dirs`` now support overriding the entire asset
>  specification, including the folder name. Previously only the package name
>  was supported and the folder would always need to have the same name.
>  See https://github.com/Pylons/pyramid/pull/2873

>- ``config.begin()`` will propagate the current threadlocal request through
>  as long as the registry is the same. For example:

>  .. code-block:: python

>     request = Request.blank(...)
>     config.begin(request)   pushes a request
>     config.begin()          propagates the previous request through unchanged
>     assert get_current_request() is request

>  See https://github.com/Pylons/pyramid/pull/2873

>Bug Fixes
>---------

>- Fixed bug in ``proutes`` such that it now shows the correct view when a
>  class and ``attr`` is involved.
>  See: https://github.com/Pylons/pyramid/pull/2687

>- Fix a ``FutureWarning`` in Python 3.5 when using ``re.split`` on the
>  ``format`` setting to the ``proutes`` script.
>  See https://github.com/Pylons/pyramid/pull/2714

>- Fix a ``RuntimeWarning`` emitted by WebOb when using arbitrary objects
>  as the ``userid`` in the ``AuthTktAuthenticationPolicy``. This is now caught
>  by the policy and the object is serialized as a base64 string to avoid
>  the cryptic warning. Since the userid will be read back as a string on
>  subsequent requests a more useful warning is emitted encouraging you to
>  use a primitive type instead.
>  See https://github.com/Pylons/pyramid/pull/2715

>- Pyramid 1.6 introduced the ability for an action to invoke another action.
>  There was a bug in the way that ``config.add_view`` would interact with
>  custom view derivers introduced in Pyramid 1.7 because the view&#39;s
>  discriminator cannot be computed until view derivers and view predicates
>  have been created in earlier orders. Invoking an action from another action
>  would trigger an unrolling of the pipeline and would compute discriminators
>  before they were ready. The new behavior respects the ``order`` of the action
>  and ensures the discriminators are not computed until dependent actions
>  from previous orders have executed.
>  See https://github.com/Pylons/pyramid/pull/2757

>- Fix bug in i18n where the default domain would always use the Germanic plural
>  style, even if a different plural function is defined in the relevant
>  messages file. See https://github.com/Pylons/pyramid/pull/2859

>- The ``config.override_asset`` method now occurs during
>  ``pyramid.config.PHASE1_CONFIG`` such that it is ordered to execute before
>  any calls to ``config.add_translation_dirs``.
>  See https://github.com/Pylons/pyramid/pull/2873

>Deprecations
>------------

>- The ``pcreate`` script and related scaffolds have been deprecated in favor
>  of the popular
>  `cookiecutter &lt;https://cookiecutter.readthedocs.io/en/latest/&gt;`_ project.

>  All of Pyramid&#39;s official scaffolds as well as the tutorials have been
>  ported to cookiecutters:

>  - `pyramid-cookiecutter-starter
>    &lt;https://github.com/Pylons/pyramid-cookiecutter-starter&gt;`_

>  - `pyramid-cookiecutter-alchemy
>    &lt;https://github.com/Pylons/pyramid-cookiecutter-alchemy&gt;`_

>  - `pyramid-cookiecutter-zodb
>    &lt;https://github.com/Pylons/pyramid-cookiecutter-zodb&gt;`_

>  See https://github.com/Pylons/pyramid/pull/2780

>Documentation Changes
>---------------------

>- Update Typographical Conventions.
>  https://github.com/Pylons/pyramid/pull/2838

>- Add `pyramid_nacl_session
>  &lt;http://docs.pylonsproject.org/projects/pyramid-nacl-session/en/latest/&gt;`_
>  to session factories. See https://github.com/Pylons/pyramid/issues/2791

>- Update ``HACKING.txt`` from stale branch that was never merged to master.
>  See https://github.com/Pylons/pyramid/pull/2782

>- Updated Windows installation instructions and related bits.
>  See https://github.com/Pylons/pyramid/issues/2661

>- Fix an inconsistency in the documentation between view predicates and
>  route predicates and highlight the differences in their APIs.
>  See https://github.com/Pylons/pyramid/pull/2764

>- Clarify a possible misuse of the ``headers`` kwarg to subclasses of
>  ``pyramid.httpexceptions.HTTPException`` in which more appropriate
>  kwargs from the parent class ``pyramid.response.Response`` should be
>  used instead. See https://github.com/Pylons/pyramid/pull/2750

>- The SQLAlchemy + URL Dispatch + Jinja2 (``wiki2``) and
>  ZODB + Traversal + Chameleon (``wiki``) tutorials have been updated to
>  utilize the new cookiecutters and drop support for the ``pcreate``
>  scaffolds.

>  See https://github.com/Pylons/pyramid/pull/2881 and
>  https://github.com/Pylons/pyramid/pull/2883.

>- Improve output of p* script descriptions for help.
>  See https://github.com/Pylons/pyramid/pull/2886

>- Quick Tour updated to use cookiecutters instead of pcreate and scaffolds.
>  See https://github.com/Pylons/pyramid/pull/2888







*Got merge conflicts? Close this PR and delete the branch. I'll create a new PR for you.*

Happy merging! 🤖



Discussion:

Resolving patch:
diff --git a/warehouse/sessions.py b/warehouse/sessions.py
--- a/warehouse/sessions.py
+++ b/warehouse/sessions.py
@@ -272,16 +272,13 @@ def session_view(view, info):
         # with a small wrapper around it to ensure that it has a Vary: Cookie
         # header.
         return add_vary("Cookie")(view)
+    elif info.exception_only:
+        return view
     else:
         # If we're not using the session on this view, then we'll wrap the view
         # with a wrapper that just ensures that the session cannot be used.
         @functools.wraps(view)
         def wrapped(context, request):
-            # TODO: When Pyramid 1.8 is released we can make this better by
-            #       using info.exception_only.
-            if request.exception is not None:
-                return view(context, request)
-
             # Save the original session so that we can restore it once the
             # inner views have been called.
             original_session = request.session


Test patch:
diff --git a/tests/unit/accounts/test_auth_policy.py b/tests/unit/accounts/test_auth_policy.py
--- a/tests/unit/accounts/test_auth_policy.py
+++ b/tests/unit/accounts/test_auth_policy.py
@@ -12,6 +12,7 @@
 
 import pretend
 
+from pyramid import authentication
 from pyramid.interfaces import IAuthenticationPolicy
 from zope.interface.verify import verifyClass
 
@@ -28,10 +29,17 @@ def test_verify(self):
         )
 
     def test_unauthenticated_userid_no_userid(self, monkeypatch):
+        extract_http_basic_credentials = \
+            pretend.call_recorder(lambda request: None)
+        monkeypatch.setattr(
+            authentication,
+            "extract_http_basic_credentials",
+            extract_http_basic_credentials,
+        )
+
         policy = auth_policy.BasicAuthAuthenticationPolicy(
             check=pretend.stub(),
         )
-        policy._get_credentials = pretend.call_recorder(lambda request: None)
 
         vary_cb = pretend.stub()
         add_vary_cb = pretend.call_recorder(lambda *v: vary_cb)
@@ -42,17 +50,22 @@ def test_unauthenticated_userid_no_userid(self, monkeypatch):
         )
 
         assert policy.unauthenticated_userid(request) is None
-        assert policy._get_credentials.calls == [pretend.call(request)]
+        assert extract_http_basic_credentials.calls == [pretend.call(request)]
         assert add_vary_cb.calls == [pretend.call("Authorization")]
         assert request.add_response_callback.calls == [pretend.call(vary_cb)]
 
     def test_unauthenticated_userid_with_userid(self, monkeypatch):
+        extract_http_basic_credentials = \
+            pretend.call_recorder(lambda request: ("username", "password"))
+        monkeypatch.setattr(
+            authentication,
+            "extract_http_basic_credentials",
+            extract_http_basic_credentials,
+        )
+
         policy = auth_policy.BasicAuthAuthenticationPolicy(
             check=pretend.stub(),
         )
-        policy._get_credentials = pretend.call_recorder(
-            lambda request: ("username", "password")
-        )
 
         vary_cb = pretend.stub()
         add_vary_cb = pretend.call_recorder(lambda *v: vary_cb)
@@ -68,6 +81,7 @@ def test_unauthenticated_userid_with_userid(self, monkeypatch):
         )
 
         assert policy.unauthenticated_userid(request) is userid
+        assert extract_http_basic_credentials.calls == [pretend.call(request)]
         assert request.find_service.calls == [
             pretend.call(IUserService, context=None),
         ]
diff --git a/tests/unit/test_sessions.py b/tests/unit/test_sessions.py
--- a/tests/unit/test_sessions.py
+++ b/tests/unit/test_sessions.py
@@ -544,7 +544,7 @@ def test_has_options(self):
     @pytest.mark.parametrize("uses_session", [False, None])
     def test_invalid_session(self, uses_session):
         context = pretend.stub()
-        request = pretend.stub(session=pretend.stub(), exception=None)
+        request = pretend.stub(session=pretend.stub())
         response = pretend.stub()
 
         @pretend.call_recorder
@@ -552,7 +552,7 @@ def view(context, request):
             assert isinstance(request.session, InvalidSession)
             return response
 
-        info = pretend.stub(options={})
+        info = pretend.stub(options={}, exception_only=False)
         if uses_session is not None:
             info.options["uses_session"] = uses_session
         derived_view = session_view(view, info)