summaryrefslogtreecommitdiff
path: root/docs/narr
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2016-09-28 20:38:15 -0500
committerMichael Merickel <michael@merickel.org>2016-09-28 20:38:15 -0500
commit8ce5736478f035cc14cfd247e7d936dc4db1f7b5 (patch)
tree48d48dc3433e915df60d2549cebab64762fdd4fd /docs/narr
parente8c66a339e9f7d83bd2408952de53ef30dba0794 (diff)
parent7391d365ce68677c588cf60c1431d29a786c6e82 (diff)
downloadpyramid-8ce5736478f035cc14cfd247e7d936dc4db1f7b5.tar.gz
pyramid-8ce5736478f035cc14cfd247e7d936dc4db1f7b5.tar.bz2
pyramid-8ce5736478f035cc14cfd247e7d936dc4db1f7b5.zip
Merge branch 'master' into exception_only
Diffstat (limited to 'docs/narr')
-rw-r--r--docs/narr/commandline.rst31
-rw-r--r--docs/narr/firstapp.rst6
-rw-r--r--docs/narr/hooks.rst37
-rw-r--r--docs/narr/i18n.rst2
-rw-r--r--docs/narr/install.rst73
-rw-r--r--docs/narr/introduction.rst2
-rw-r--r--docs/narr/project.rst14
-rw-r--r--docs/narr/upgrading.rst6
-rw-r--r--docs/narr/urldispatch.rst6
9 files changed, 122 insertions, 55 deletions
diff --git a/docs/narr/commandline.rst b/docs/narr/commandline.rst
index 6cd90d42f..242bc7ec7 100644
--- a/docs/narr/commandline.rst
+++ b/docs/narr/commandline.rst
@@ -649,6 +649,10 @@ using the :func:`pyramid.paster.bootstrap` command in the body of your script.
.. versionadded:: 1.1
:func:`pyramid.paster.bootstrap`
+.. versionchanged:: 1.8
+ Added the ability for ``bootstrap`` to cleanup automatically via the
+ ``with`` statement.
+
In the simplest case, :func:`pyramid.paster.bootstrap` can be used with a
single argument, which accepts the :term:`PasteDeploy` ``.ini`` file
representing your Pyramid application's configuration as a single argument:
@@ -656,8 +660,9 @@ representing your Pyramid application's configuration as a single argument:
.. code-block:: python
from pyramid.paster import bootstrap
- env = bootstrap('/path/to/my/development.ini')
- print(env['request'].route_url('home'))
+
+ with bootstrap('/path/to/my/development.ini') as env:
+ print(env['request'].route_url('home'))
:func:`pyramid.paster.bootstrap` returns a dictionary containing
framework-related information. This dictionary will always contain a
@@ -723,8 +728,9 @@ load instead of ``main``:
.. code-block:: python
from pyramid.paster import bootstrap
- env = bootstrap('/path/to/my/development.ini#another')
- print(env['request'].route_url('home'))
+
+ with bootstrap('/path/to/my/development.ini#another') as env:
+ print(env['request'].route_url('home'))
The above example specifies the ``another`` ``app``, ``pipeline``, or
``composite`` section of your PasteDeploy configuration file. The ``app``
@@ -761,9 +767,9 @@ desired request and passing it into :func:`~pyramid.paster.bootstrap`:
from pyramid.request import Request
request = Request.blank('/', base_url='https://example.com/prefix')
- env = bootstrap('/path/to/my/development.ini#another', request=request)
- print(env['request'].application_url)
- # will print 'https://example.com/prefix'
+ with bootstrap('/path/to/my/development.ini#another', request=request) as env:
+ print(env['request'].application_url)
+ # will print 'https://example.com/prefix'
Now you can readily use Pyramid's APIs for generating URLs:
@@ -776,7 +782,9 @@ Now you can readily use Pyramid's APIs for generating URLs:
Cleanup
~~~~~~~
-When your scripting logic finishes, it's good manners to call the ``closer``
+If you're using the ``with``-statement variant then there's nothing to
+worry about. However if you're using the returned environment directly then
+when your scripting logic finishes, it's good manners to call the ``closer``
callback:
.. code-block:: python
@@ -891,15 +899,12 @@ contains the following code:
omit = options.omit
if omit is None:
omit = []
- env = bootstrap(config_uri)
- settings, closer = env['registry'].settings, env['closer']
- try:
+ with bootstrap(config_uri) as env:
+ settings = env['registry'].settings
for k, v in settings.items():
if any([k.startswith(x) for x in omit]):
continue
print('%-40s %-20s' % (k, v))
- finally:
- closer()
This script uses the Python ``optparse`` module to allow us to make sense out
of extra arguments passed to the script. It uses the
diff --git a/docs/narr/firstapp.rst b/docs/narr/firstapp.rst
index a8491eabd..ad05976c0 100644
--- a/docs/narr/firstapp.rst
+++ b/docs/narr/firstapp.rst
@@ -27,15 +27,15 @@ installed, an HTTP server is started on TCP port 8080.
On UNIX:
-.. code-block:: text
+.. code-block:: bash
$ $VENV/bin/python helloworld.py
On Windows:
-.. code-block:: text
+.. code-block:: doscon
- C:\> %VENV%\Scripts\python.exe helloworld.py
+ c:\> %VENV%\Scripts\python helloworld.py
This command will not return and nothing will be printed to the console. When
port 8080 is visited by a browser on the URL ``/hello/world``, the server will
diff --git a/docs/narr/hooks.rst b/docs/narr/hooks.rst
index 7fbac2080..b22b31bf9 100644
--- a/docs/narr/hooks.rst
+++ b/docs/narr/hooks.rst
@@ -26,7 +26,7 @@ Not Found View by using the
:linenos:
def notfound(request):
- return Response('Not Found, dude', status='404 Not Found')
+ return Response('Not Found', status='404 Not Found')
def main(globals, **settings):
config = Configurator()
@@ -45,7 +45,7 @@ and a :term:`scan`, you can replace the Not Found View by using the
@notfound_view_config()
def notfound(request):
- return Response('Not Found, dude', status='404 Not Found')
+ return Response('Not Found', status='404 Not Found')
def main(globals, **settings):
config = Configurator()
@@ -67,11 +67,11 @@ Views can carry predicates limiting their applicability. For example:
@notfound_view_config(request_method='GET')
def notfound_get(request):
- return Response('Not Found during GET, dude', status='404 Not Found')
+ return Response('Not Found during GET', status='404 Not Found')
@notfound_view_config(request_method='POST')
def notfound_post(request):
- return Response('Not Found during POST, dude', status='404 Not Found')
+ return Response('Not Found during POST', status='404 Not Found')
def main(globals, **settings):
config = Configurator()
@@ -1481,7 +1481,7 @@ method. For example:
phash = text
def __call__(self, context, request):
- return getattr(context, 'content_type', None) == self.val
+ return request.content_type == self.val
The constructor of a predicate factory takes two arguments: ``val`` and
``config``. The ``val`` argument will be the argument passed to
@@ -1500,13 +1500,28 @@ with the name and the value serialized. The result of ``phash`` is not seen in
output anywhere, it just informs the uniqueness constraints for view
configuration.
-The ``__call__`` method of a predicate factory must accept a resource
-(``context``) and a request, and must return ``True`` or ``False``. It is the
-"meat" of the predicate.
+The ``__call__`` method differs depending on whether the predicate is used as
+a :term:`view predicate` or a :term:`route predicate`:
-You can use the same predicate factory as both a view predicate and as a route
-predicate, but you'll need to call ``add_view_predicate`` and
-``add_route_predicate`` separately with the same factory.
+- When used as a route predicate, the ``__call__`` signature is
+ ``(info, request)``. The ``info`` object is a dictionary containing two
+ keys: ``match`` and ``route``. ``info['match']`` is the matchdict containing
+ the patterns matched in the route pattern. ``info['route']`` is the
+ :class:`pyramid.interfaces.IRoute` object for the current route.
+
+- When used as a view predicate, the ``__call__`` signature is
+ ``(context, request)``. The ``context`` is the result of :term:`traversal`
+ performed using either the route's :term:`root factory` or the app's
+ :term:`default root factory`.
+
+In both cases the ``__call__`` method is expected to return ``True`` or
+``False``.
+
+It is possible to use the same predicate factory as both a view predicate and
+as a route predicate, but they'll need to handle the ``info`` or ``context``
+argument specially (many predicates do not need this argument) and you'll need
+to call ``add_view_predicate`` and ``add_route_predicate`` separately with
+the same factory.
.. _subscriber_predicates:
diff --git a/docs/narr/i18n.rst b/docs/narr/i18n.rst
index 131832aae..3549b53a5 100644
--- a/docs/narr/i18n.rst
+++ b/docs/narr/i18n.rst
@@ -294,7 +294,7 @@ Lingua like so:
.. code-block:: doscon
- C> %VENV%\Scripts\pip install lingua
+ c:\> %VENV%\Scripts\pip install lingua
.. index::
diff --git a/docs/narr/install.rst b/docs/narr/install.rst
index 7d96f4074..570cb2285 100644
--- a/docs/narr/install.rst
+++ b/docs/narr/install.rst
@@ -21,9 +21,8 @@ the following sections.
.. sidebar:: Python Versions
- As of this writing, :app:`Pyramid` has been tested under Python 2.7,
- Python 3.3, Python 3.4, Python 3.5, PyPy, and PyPy3. :app:`Pyramid` does
- not run under any version of Python before 2.7.
+ As of this writing, :app:`Pyramid` is tested against Python 2.7,
+ Python 3.4, Python 3.5, PyPy.
:app:`Pyramid` is known to run on all popular UNIX-like systems such as Linux,
Mac OS X, and FreeBSD, as well as on Windows platforms. It is also known to
@@ -92,8 +91,24 @@ If your Windows system doesn't have a Python interpreter, you'll need to
install it by downloading a Python 3.x-series interpreter executable from
`python.org's download section <https://www.python.org/downloads/>`_ (the files
labeled "Windows Installer"). Once you've downloaded it, double click on the
-executable and accept the defaults during the installation process. You may
-also need to download and install the Python for Windows extensions.
+executable, and select appropriate options during the installation process. To
+standardize this documentation, we used the GUI installer and selected the
+following options:
+
+- Screen 1: Install Python 3.x.x (32- or 64-bit)
+ - Check "Install launcher for all users (recommended)"
+ - Check "Add Python 3.x to PATH"
+ - Click "Customize installation"
+- Screen 2: Optional Features
+ - Check all options
+ - Click "Next"
+- Screen 3: Advanced Options
+ - Check all options
+ - Customize install location: "C:\\Python3x", where "x" is the minor
+ version of Python
+ - Click "Next"
+
+You might also need to download and install the Python for Windows extensions.
.. seealso:: See the official Python documentation :ref:`Using Python on
Windows <python:using-on-windows>` for full details.
@@ -104,14 +119,19 @@ also need to download and install the Python for Windows extensions.
directions. Make sure you get the proper 32- or 64-bit build and Python
version.
+.. seealso:: `Python launcher for Windows
+ <https://docs.python.org/3/using/windows.html#launcher>`_ provides a command
+ ``py`` that allows users to run any installed version of Python.
+
.. warning::
- After you install Python on Windows, you may need to add the ``C:\Python3x``
- directory to your environment's ``Path``, where ``x`` is the minor version
- of installed Python, in order to make it possible to invoke Python from a
- command prompt by typing ``python``. To do so, right click ``My Computer``,
- select ``Properties`` --> ``Advanced Tab`` --> ``Environment Variables`` and
- add that directory to the end of the ``Path`` environment variable.
+ After you install Python on Windows, you might need to add the
+ ``c:\Python3x`` directory to your environment's ``Path``, where ``x`` is the
+ minor version of installed Python, in order to make it possible to invoke
+ Python from a command prompt by typing ``python``. To do so, right click
+ ``My Computer``, select ``Properties`` --> ``Advanced Tab`` -->
+ ``Environment Variables``, and add that directory to the end of the ``Path``
+ environment variable.
.. seealso:: See `Configuring Python (on Windows)
<https://docs.python.org/3/using/windows.html#configuring-python>`_ for
@@ -171,6 +191,29 @@ After installing Python as described previously in :ref:`for-mac-os-x-users` or
$ $VENV/bin/pip install "pyramid==\ |release|\ "
+.. index::
+ single: $VENV/bin/pip vs. source bin/activate
+
+.. _venv-bin-pip-vs-source-bin-activate:
+
+.. note:: Why use ``$VENV/bin/pip`` instead of ``source bin/activate``, then
+ ``pip``?
+
+ ``$VENV/bin/pip`` clearly specifies that ``pip`` is run from within the
+ virtual environment and not at the system level.
+
+ ``activate`` drops turds into the user's shell environment, leaving them
+ vulnerable to executing commands in the wrong context. ``deactivate`` might
+ not correctly restore previous shell environment variables.
+
+ Although using ``source bin/activate``, then ``pip``, requires fewer key
+ strokes to issue commands once invoked, there are other things to consider.
+ Michael F. Lamb (datagrok) presents a summary in `Virtualenv's bin/activate
+ is Doing It Wrong <https://gist.github.com/datagrok/2199506>`_.
+
+ Ultimately we prefer to keep things clear and simple, so we use
+ ``$VENV/bin/pip``.
+
.. index::
single: installing on Windows
@@ -190,7 +233,8 @@ After installing Python as described previously in
c:\> set VENV=c:\env
# replace "x" with your minor version of Python 3
- c:\> c:\Python3x\Scripts\python3 -m venv %VENV%
+ c:\> c:\Python3x\python -m venv %VENV%
+ c:\> cd %VENV%
You can either follow the use of the environment variable ``%VENV%``, or
replace it with the root directory of the virtual environment. If you choose
@@ -204,7 +248,10 @@ After installing Python as described previously in
.. parsed-literal::
- c:\\env> %VENV%\\Scripts\\pip install "pyramid==\ |release|\ "
+ c:\\> %VENV%\\Scripts\\pip install "pyramid==\ |release|\ "
+
+.. note:: See the note above for :ref:`Why use $VENV/bin/pip instead of source
+ bin/activate, then pip <venv-bin-pip-vs-source-bin-activate>`.
What Gets Installed
diff --git a/docs/narr/introduction.rst b/docs/narr/introduction.rst
index de6ac408b..47638579b 100644
--- a/docs/narr/introduction.rst
+++ b/docs/narr/introduction.rst
@@ -860,7 +860,7 @@ Every release of Pyramid has 100% statement coverage via unit and integration
tests, as measured by the ``coverage`` tool available on PyPI. It also has
greater than 95% decision/condition coverage as measured by the
``instrumental`` tool available on PyPI. It is automatically tested by Travis,
-and Jenkins on Python 2.7, Python 3.3, Python 3.4, Python 3.5, PyPy, and PyPy3
+and Jenkins on Python 2.7, Python 3.4, Python 3.5, and PyPy
after each commit to its GitHub repository. Official Pyramid add-ons are held
to a similar testing standard. We still find bugs in Pyramid and its official
add-ons, but we've noticed we find a lot more of them while working on other
diff --git a/docs/narr/project.rst b/docs/narr/project.rst
index 1ce12a938..71bd176f6 100644
--- a/docs/narr/project.rst
+++ b/docs/narr/project.rst
@@ -87,9 +87,9 @@ On UNIX:
Or on Windows:
-.. code-block:: text
+.. code-block:: doscon
- > %VENV%\Scripts\pcreate -s starter MyProject
+ c:\> %VENV%\Scripts\pcreate -s starter MyProject
As a result of invoking the ``pcreate`` command, a directory named
``MyProject`` is created. That directory is a :term:`project` directory. The
@@ -161,8 +161,8 @@ Or on Windows:
.. code-block:: doscon
- > cd MyProject
- > %VENV%\Scripts\pip install -e .
+ c:\> cd MyProject
+ c:\> %VENV%\Scripts\pip install -e .
Elided output from a run of this command on UNIX is shown below:
@@ -199,7 +199,7 @@ On Windows:
.. code-block:: doscon
- > %VENV%\Scripts\pip install -e ".[testing]"
+ c:\> %VENV%\Scripts\pip install -e ".[testing]"
Once the testing requirements are installed, then you can run the tests using
the ``py.test`` command that was just installed in the ``bin`` directory of
@@ -215,7 +215,7 @@ On Windows:
.. code-block:: doscon
- > %VENV%\Scripts\py.test -q
+ c:\> %VENV%\Scripts\py.test -q
Here's sample output from a test run on UNIX:
@@ -282,7 +282,7 @@ On Windows:
.. code-block:: text
- > %VENV%\Scripts\pserve development.ini
+ c:\> %VENV%\Scripts\pserve development.ini
Here's sample output from a run of ``pserve`` on UNIX:
diff --git a/docs/narr/upgrading.rst b/docs/narr/upgrading.rst
index 21b696775..4e434c3c6 100644
--- a/docs/narr/upgrading.rst
+++ b/docs/narr/upgrading.rst
@@ -205,10 +205,10 @@ On UNIX, you can do that via:
On Windows, you need to issue two commands:
-.. code-block:: bash
+.. code-block:: doscon
- C:\> set PYTHONWARNINGS=default
- C:\> Scripts/pserve.exe development.ini
+ c:\> set PYTHONWARNINGS=default
+ c:\> Scripts/pserve.exe development.ini
At this point, it's ensured that deprecation warnings will be printed to the
console whenever a codepath is hit that generates one. You can then click
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst
index 7d37c04df..9ac01e24a 100644
--- a/docs/narr/urldispatch.rst
+++ b/docs/narr/urldispatch.rst
@@ -850,7 +850,7 @@ application:
from pyramid.httpexceptions import HTTPNotFound
def notfound(request):
- return HTTPNotFound('Not found, bro.')
+ return HTTPNotFound()
def no_slash(request):
return Response('No slash')
@@ -871,7 +871,7 @@ If a request enters the application with the ``PATH_INFO`` value of
However, if a request enters the application with the ``PATH_INFO`` value of
``/no_slash/``, *no* route will match, and the slash-appending not found view
will not find a matching route with an appended slash. As a result, the
-``notfound`` view will be called and it will return a "Not found, bro." body.
+``notfound`` view will be called and it will return a "Not found" body.
If a request enters the application with the ``PATH_INFO`` value of
``/has_slash/``, the second route will match. If a request enters the
@@ -892,7 +892,7 @@ exactly the same job:
@notfound_view_config(append_slash=True)
def notfound(request):
- return HTTPNotFound('Not found, bro.')
+ return HTTPNotFound()
@view_config(route_name='noslash')
def no_slash(request):