summaryrefslogtreecommitdiff
path: root/docs/tutorials
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2020-01-03 23:14:53 -0600
committerMichael Merickel <michael@merickel.org>2020-01-03 23:14:53 -0600
commit828e069de5d0c98e6d54cfdbf20b1a8acd1f6b39 (patch)
treebe692270de956199b4cfb1eda8a9fc24ceb8374e /docs/tutorials
parent7820b922cc1b87147cc60288dff0bbdfd7b5bc8a (diff)
parent148cf5138638ce6b1b92b4e13fe1444df9451e34 (diff)
downloadpyramid-828e069de5d0c98e6d54cfdbf20b1a8acd1f6b39.tar.gz
pyramid-828e069de5d0c98e6d54cfdbf20b1a8acd1f6b39.tar.bz2
pyramid-828e069de5d0c98e6d54cfdbf20b1a8acd1f6b39.zip
Merge branch 'master' into security-docs
Diffstat (limited to 'docs/tutorials')
-rw-r--r--docs/tutorials/wiki/authorization.rst10
-rw-r--r--docs/tutorials/wiki/basiclayout.rst18
-rw-r--r--docs/tutorials/wiki/definingviews.rst4
-rw-r--r--docs/tutorials/wiki/installation.rst59
-rw-r--r--docs/tutorials/wiki/src/authorization/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/authorization/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/authorization/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/authorization/setup.py2
-rw-r--r--docs/tutorials/wiki/src/authorization/tests/__init__.py (renamed from docs/tutorials/wiki2/src/tests/tutorial/tests/__init__.py)0
-rw-r--r--docs/tutorials/wiki/src/authorization/tests/test_it.py (renamed from docs/tutorials/wiki/src/authorization/tutorial/tests.py)8
-rw-r--r--docs/tutorials/wiki/src/authorization/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/authorization/tutorial/views/default.py10
-rw-r--r--docs/tutorials/wiki/src/authorization/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/src/basiclayout/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/basiclayout/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/basiclayout/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/basiclayout/setup.py2
-rw-r--r--docs/tutorials/wiki/src/basiclayout/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki/src/basiclayout/tests/test_it.py (renamed from docs/tutorials/wiki/src/basiclayout/tutorial/tests.py)8
-rw-r--r--docs/tutorials/wiki/src/basiclayout/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/basiclayout/tutorial/views/default.py2
-rw-r--r--docs/tutorials/wiki/src/basiclayout/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/src/installation/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/installation/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/installation/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/installation/setup.py2
-rw-r--r--docs/tutorials/wiki/src/installation/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki/src/installation/tests/test_it.py (renamed from docs/tutorials/wiki/src/installation/tutorial/tests.py)8
-rw-r--r--docs/tutorials/wiki/src/installation/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/installation/tutorial/views/default.py2
-rw-r--r--docs/tutorials/wiki/src/installation/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/src/models/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/models/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/models/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/models/setup.py2
-rw-r--r--docs/tutorials/wiki/src/models/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki/src/models/tests/test_it.py (renamed from docs/tutorials/wiki/src/models/tutorial/tests.py)8
-rw-r--r--docs/tutorials/wiki/src/models/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/models/tutorial/views/default.py2
-rw-r--r--docs/tutorials/wiki/src/models/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/src/tests/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/tests/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/tests/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/tests/setup.py2
-rw-r--r--docs/tutorials/wiki/src/tests/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki/src/tests/tests/test_it.py (renamed from docs/tutorials/wiki/src/tests/tutorial/tests.py)18
-rw-r--r--docs/tutorials/wiki/src/tests/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/tests/tutorial/views/default.py10
-rw-r--r--docs/tutorials/wiki/src/tests/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/src/views/.coveragerc1
-rw-r--r--docs/tutorials/wiki/src/views/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki/src/views/pytest.ini7
-rw-r--r--docs/tutorials/wiki/src/views/setup.py2
-rw-r--r--docs/tutorials/wiki/src/views/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki/src/views/tests/test_it.py24
-rw-r--r--docs/tutorials/wiki/src/views/tutorial/templates/layout.pt2
-rw-r--r--docs/tutorials/wiki/src/views/tutorial/tests.py18
-rw-r--r--docs/tutorials/wiki/src/views/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki/src/views/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki/tests.rst16
-rw-r--r--docs/tutorials/wiki2/basiclayout.rst27
-rw-r--r--docs/tutorials/wiki2/definingmodels.rst126
-rw-r--r--docs/tutorials/wiki2/installation.rst121
-rw-r--r--docs/tutorials/wiki2/src/authentication/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/authentication/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/authentication/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/authentication/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/authentication/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/authentication/setup.py6
-rw-r--r--docs/tutorials/wiki2/src/authentication/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/authentication/tests/test_it.py (renamed from docs/tutorials/wiki2/src/authentication/tutorial/tests.py)17
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/views/auth.py2
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/authentication/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/authorization/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/authorization/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/authorization/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/authorization/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/authorization/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/authorization/setup.py6
-rw-r--r--docs/tutorials/wiki2/src/authorization/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/authorization/tests/test_it.py (renamed from docs/tutorials/wiki2/src/authorization/tutorial/tests.py)17
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/views/auth.py2
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/setup.py12
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tests/test_it.py (renamed from docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py)17
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja22
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.jinja24
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/basiclayout/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/installation/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/installation/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/installation/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/installation/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/installation/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/installation/setup.py12
-rw-r--r--docs/tutorials/wiki2/src/installation/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/installation/tests/test_it.py (renamed from docs/tutorials/wiki2/src/installation/tutorial/tests.py)17
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/templates/layout.jinja22
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja24
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/installation/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/models/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/models/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/models/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/models/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/models/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/models/setup.py6
-rw-r--r--docs/tutorials/wiki2/src/models/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/models/tests/test_it.py66
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/templates/layout.jinja22
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.jinja24
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/tests.py65
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/models/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/tests/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/tests/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/tests/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/tests/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/tests/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/tests/setup.py6
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/test_functional.py (renamed from docs/tutorials/wiki2/src/tests/tutorial/tests/test_functional.py)0
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/test_initdb.py10
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/test_security.py (renamed from docs/tutorials/wiki2/src/tests/tutorial/tests/test_security.py)6
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/test_user_model.py (renamed from docs/tutorials/wiki2/src/tests/tutorial/tests/test_user_model.py)10
-rw-r--r--docs/tutorials/wiki2/src/tests/tests/test_views.py (renamed from docs/tutorials/wiki2/src/tests/tutorial/tests/test_views.py)28
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/tests/test_initdb.py16
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/views/auth.py2
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/tests/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/src/views/.coveragerc1
-rw-r--r--docs/tutorials/wiki2/src/views/MANIFEST.in3
-rw-r--r--docs/tutorials/wiki2/src/views/development.ini7
-rw-r--r--docs/tutorials/wiki2/src/views/production.ini7
-rw-r--r--docs/tutorials/wiki2/src/views/pytest.ini7
-rw-r--r--docs/tutorials/wiki2/src/views/setup.py6
-rw-r--r--docs/tutorials/wiki2/src/views/tests/__init__.py0
-rw-r--r--docs/tutorials/wiki2/src/views/tests/test_it.py66
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/__init__.py2
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/alembic/script.py.mako2
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/alembic/versions/README.txt2
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/pshell.py1
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/templates/404.jinja22
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/tests.py65
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/views/default.py6
-rw-r--r--docs/tutorials/wiki2/src/views/tutorial/views/notfound.py2
-rw-r--r--docs/tutorials/wiki2/tests.rst43
185 files changed, 744 insertions, 678 deletions
diff --git a/docs/tutorials/wiki/authorization.rst b/docs/tutorials/wiki/authorization.rst
index ef914cab5..2ff9deb31 100644
--- a/docs/tutorials/wiki/authorization.rst
+++ b/docs/tutorials/wiki/authorization.rst
@@ -99,7 +99,7 @@ Here we use "dummy" data to represent user and groups sources.
Add an ACL
~~~~~~~~~~
-Open ``tutorial/models.py`` and add the following import statement near the top:
+Open ``tutorial/models/__init__.py`` and add the following import statement near the top:
.. literalinclude:: src/authorization/tutorial/models/__init__.py
:lines: 4-8
@@ -179,7 +179,7 @@ Open ``tutorial/views/default.py`` and add a ``permission='edit'`` parameter to
:language: python
.. literalinclude:: src/authorization/tutorial/views/default.py
- :lines: 68-70
+ :lines: 69-71
:emphasize-lines: 2-3
:language: python
@@ -191,12 +191,12 @@ Add a ``permission='view'`` parameter to the ``@view_config`` decorator for
``view_wiki()`` and ``view_page()`` as follows:
.. literalinclude:: src/authorization/tutorial/views/default.py
- :lines: 23-24
+ :lines: 21-22
:emphasize-lines: 1-2
:language: python
.. literalinclude:: src/authorization/tutorial/views/default.py
- :lines: 28-29
+ :lines: 27-28
:emphasize-lines: 1-2
:language: python
@@ -318,7 +318,7 @@ Our ``tutorial/__init__.py`` will look like this when we are done:
Only the highlighted lines need to be added or edited.
-Our ``tutorial/models.py`` will look like this when we are done:
+Our ``tutorial/models/__init__.py`` will look like this when we are done:
.. literalinclude:: src/authorization/tutorial/models/__init__.py
:linenos:
diff --git a/docs/tutorials/wiki/basiclayout.rst b/docs/tutorials/wiki/basiclayout.rst
index 52d3f4670..4eb5c4283 100644
--- a/docs/tutorials/wiki/basiclayout.rst
+++ b/docs/tutorials/wiki/basiclayout.rst
@@ -107,6 +107,12 @@ Next include routes from the ``.routes`` module.
:lineno-match:
:language: py
+The included module contains the following function.
+
+.. literalinclude:: src/basiclayout/tutorial/routes.py
+ :linenos:
+ :language: py
+
This registers a "static view" using the :meth:`pyramid.config.Configurator.add_static_view` method.
This view answers requests whose URL path starts with ``/static``.
This statement registers a view that will serve up static assets, such as CSS and image files.
@@ -121,7 +127,7 @@ Alternatively the cookiecutter could have used an *absolute* asset specification
The third argument is an optional ``cache_max_age`` which specifies the number of seconds the static asset will be HTTP-cached.
-Next perform a :term:`scan`.
+Back into our ``__init__.py``, next perform a :term:`scan`.
.. literalinclude:: src/basiclayout/tutorial/__init__.py
:lines: 21
@@ -208,12 +214,12 @@ Let's try to understand the components in this module:
The ``context`` argument signifies that the decorated view callable ``my_view`` should only be run when :term:`traversal` finds the ``tutorial.models.MyModel`` :term:`resource` as the :term:`context` of a request.
In English this means that when the URL ``/`` is visited, and because ``MyModel`` is the root model, this view callable will be invoked.
- The ``renderer`` argument names an :term:`asset specification` of ``templates/mytemplate.pt``.
+ The ``renderer`` argument names an :term:`asset specification` of ``tutorial:templates/mytemplate.pt``.
This asset specification points at a :term:`Chameleon` template which lives in the ``mytemplate.pt`` file within the ``templates`` directory of the ``tutorial`` package.
And indeed if you look in the ``templates`` directory of this package, you will see a ``mytemplate.pt`` template file
This template renders the default home page of the generated project.
- This asset specification is *relative* to the ``views`` package.
- Alternatively we could have used the absolute asset specification ``tutorial:templates/mytemplate.pt``.
+ This asset specification is *absolute* to the ``views`` package.
+ Alternatively we could have used the relative asset specification ``../templates/mytemplate.pt``.
Since this call to ``@view_config`` doesn't pass a ``name`` argument, the ``my_view`` function which it decorates represents the "default" view callable used when the context is of the type ``MyModel``.
@@ -225,7 +231,7 @@ Let's try to understand the components in this module:
The function returns the dictionary ``{'project': 'myproj'}``.
This dictionary is used by the template named by the ``mytemplate.pt`` asset specification to fill in certain values on the page.
-Let us open ``tutorial/views/default.py`` in the ``views`` package to look at the second view.
+Let us open ``tutorial/views/notfound.py`` in the ``views`` package to look at the second view.
.. literalinclude:: src/basiclayout/tutorial/views/notfound.py
:linenos:
@@ -237,7 +243,7 @@ Without repeating ourselves, we will point out the differences between this view
The ``notfound_view`` function is decorated with ``@notfound_view_config``.
This decorator registers a :term:`Not Found View` using :meth:`pyramid.config.Configurator.add_notfound_view`.
- The ``renderer`` argument names an :term:`asset specification` of ``templates/404.pt``.
+ The ``renderer`` argument names an :term:`asset specification` of ``tutorial:templates/404.pt``.
#. *Lines 5-7*.
A :term:`view callable` named ``notfound_view`` is defined, which is decorated in the step above.
diff --git a/docs/tutorials/wiki/definingviews.rst b/docs/tutorials/wiki/definingviews.rst
index bd8dc6ecf..2e4d009a1 100644
--- a/docs/tutorials/wiki/definingviews.rst
+++ b/docs/tutorials/wiki/definingviews.rst
@@ -73,7 +73,7 @@ Success executing this command will end with a line to the console similar to th
.. code-block:: text
- Successfully installed docutils-0.14 tutorial
+ Successfully installed docutils-0.15.2 tutorial
Adding view functions in the ``views`` package
@@ -356,7 +356,7 @@ Our templates name static assets, including CSS and images.
We don't need to create these files within our package's ``static`` directory because they were provided by the cookiecutter at the time we created the project.
As an example, the CSS file will be accessed via ``http://localhost:6543/static/theme.css`` by virtue of the call to the ``add_static_view`` directive in the ``routes.py`` file.
-Any number and type of static assets can be placed in this directory (or subdirectories)
+Any number and type of static assets can be placed in this directory (or subdirectories).
They are referred to by either URL or using the convenience method ``static_url``, for example ``request.static_url('<package>:static/foo.css')``, within templates.
diff --git a/docs/tutorials/wiki/installation.rst b/docs/tutorials/wiki/installation.rst
index cfa021540..6088f577d 100644
--- a/docs/tutorials/wiki/installation.rst
+++ b/docs/tutorials/wiki/installation.rst
@@ -185,18 +185,20 @@ The console will show ``pip`` checking for packages and installing missing packa
.. code-block:: bash
- Successfully installed BTrees-4.5.1 Chameleon-3.5 Mako-1.0.7 \
- MarkupSafe-1.1.0 PasteDeploy-1.5.2 Pygments-2.2.0 WebTest-2.0.32 \
- ZConfig-3.3.0 ZEO-5.2.0 ZODB-5.5.1 ZODB3-3.11.0 atomicwrites-1.2.1 \
- attrs-18.2.0 beautifulsoup4-4.6.3 coverage-4.5.2 hupper-1.4.1 \
- more-itertools-4.3.0 persistent-4.4.3 plaster-1.0 plaster-pastedeploy-0.6 \
- pluggy-0.8.0 py-1.7.0 pyramid-1.10.1 pyramid-chameleon-0.3 \
- pyramid-debugtoolbar-4.5 pyramid-mako-1.0.2 pyramid-retry-1.0 \
- pyramid-tm-2.2.1 pyramid-zodbconn-0.8.1 pytest-4.0.0 pytest-cov-2.6.0 \
- repoze.lru-0.7 six-1.11.0 transaction-2.4.0 translationstring-1.3 \
- tutorial venusian-1.1.0 waitress-1.1.0 webob-1.8.4 zc.lockfile-1.4 \
- zdaemon-4.3 zodbpickle-1.0.2 zodburi-2.3.0 zope.deprecation-4.3.0 \
- zope.interface-4.6.0
+ Successfully installed BTrees-4.6.1 Chameleon-3.6.2 Mako-1.1.0 \
+ MarkupSafe-1.1.1 PasteDeploy-2.0.1 Pygments-2.5.2 WebTest-2.0.33 \
+ ZConfig-3.5.0 ZEO-5.2.1 ZODB-5.5.1 ZODB3-3.11.0 attrs-19.3.0 \
+ beautifulsoup4-4.8.2 cffi-1.13.2 coverage-5.0.1 hupper-1.9.1 \
+ importlib-metadata-1.3.0 more-itertools-8.0.2 packaging-19.2 \
+ persistent-4.5.1 plaster-1.0 plaster-pastedeploy-0.7 pluggy-0.13.1 \
+ py-1.8.1 pycparser-2.19 pyparsing-2.4.6 pyramid-1.10.4 \
+ pyramid-chameleon-0.3 pyramid-debugtoolbar-4.5.1 pyramid-mako-1.1.0 \
+ pyramid-retry-2.1 pyramid-tm-2.3 pyramid-zodbconn-0.8.1 pytest-5.3.2 \
+ pytest-cov-2.8.1 repoze.lru-0.7 six-1.13.0 soupsieve-1.9.5 \
+ transaction-3.0.0 translationstring-1.3 tutorial venusian-3.0.0 \
+ waitress-1.4.1 wcwidth-0.1.7 webob-1.8.5 zc.lockfile-2.0 zdaemon-4.3 \
+ zipp-0.6.0 zodbpickle-2.0.0 zodburi-2.4.0 zope.deprecation-4.4.0 \
+ zope.interface-4.7.1
Testing requirements are defined in our project's ``setup.py`` file, in the ``tests_require`` and ``extras_require`` stanzas.
@@ -241,8 +243,8 @@ For a successful test run, you should see output that ends like this:
.. code-block:: bash
- .
- 1 passed in 0.24 seconds
+ ..
+ 2 passed in 0.49 seconds
Expose test coverage information
@@ -274,29 +276,28 @@ If successful, you will see output something like this:
.. code-block:: bash
======================== test session starts =========================
- platform darwin -- Python 3.7.0, pytest-4.0.0, py-1.7.0, pluggy-0.8.0
- rootdir: /Users/stevepiercy/projects/hack-on-pyramid/tutorial, inifile: pytest.ini
- plugins: cov-2.6.0
- collected 1 item
+ platform darwin -- Python 3.7.3, pytest-5.3.2, py-1.8.1, pluggy-0.13.1
+ rootdir: /filepath/tutorial, inifile: pytest.ini, testpaths: tutorial
+ plugins: cov-2.8.1
+ collected 2 items
+
+ tutorial/tests.py .. [100%]
- tutorial/tests.py .
- [100%]
---------- coverage: platform darwin, python 3.7.0-final-0 -----------
Name Stmts Miss Cover Missing
-----------------------------------------------------------
- tutorial/__init__.py 17 12 29% 7-8, 14-23
+ tutorial/__init__.py 16 11 31% 7-8, 14-22
tutorial/models/__init__.py 8 4 50% 9-12
tutorial/pshell.py 6 6 0% 1-12
tutorial/routes.py 2 2 0% 1-2
tutorial/views/__init__.py 0 0 100%
tutorial/views/default.py 4 0 100%
- tutorial/views/notfound.py 4 4 0% 1-7
+ tutorial/views/notfound.py 4 0 100%
-----------------------------------------------------------
- TOTAL 41 28 32%
-
+ TOTAL 40 23 42%
- ===================== 1 passed in 0.31 seconds =======================
+ ===================== 2 passed in 0.55 seconds =======================
Our package doesn't quite have 100% test coverage.
@@ -316,14 +317,14 @@ On Unix
.. code-block:: bash
- $VENV/bin/pytest --cov=tutorial tutorial/tests.py -q
+ $VENV/bin/pytest --cov=tutorial tests.py -q
On Windows
^^^^^^^^^^
.. code-block:: doscon
- %VENV%\Scripts\pytest --cov=tutorial tutorial\tests.py -q
+ %VENV%\Scripts\pytest --cov=tutorial tests -q
``pytest`` follows :ref:`conventions for Python test discovery <pytest:test discovery>`.
@@ -365,8 +366,8 @@ If successful, you will see something like this on your console:
.. code-block:: text
- Starting subprocess with file monitor
- Starting server in PID 44078.
+ Starting monitor for PID 65233.
+ Starting server in PID 65233.
Serving on http://localhost:6543
Serving on http://localhost:6543
diff --git a/docs/tutorials/wiki/src/authorization/.coveragerc b/docs/tutorials/wiki/src/authorization/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/authorization/.coveragerc
+++ b/docs/tutorials/wiki/src/authorization/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/authorization/MANIFEST.in b/docs/tutorials/wiki/src/authorization/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/authorization/MANIFEST.in
+++ b/docs/tutorials/wiki/src/authorization/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/authorization/pytest.ini b/docs/tutorials/wiki/src/authorization/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/authorization/pytest.ini
+++ b/docs/tutorials/wiki/src/authorization/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/authorization/setup.py b/docs/tutorials/wiki/src/authorization/setup.py
index fa5948acb..f19d643e6 100644
--- a/docs/tutorials/wiki/src/authorization/setup.py
+++ b/docs/tutorials/wiki/src/authorization/setup.py
@@ -44,7 +44,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/__init__.py b/docs/tutorials/wiki/src/authorization/tests/__init__.py
index e69de29bb..e69de29bb 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/__init__.py
+++ b/docs/tutorials/wiki/src/authorization/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/authorization/tutorial/tests.py b/docs/tutorials/wiki/src/authorization/tests/test_it.py
index 6279d9f66..6c72bcc62 100644
--- a/docs/tutorials/wiki/src/authorization/tutorial/tests.py
+++ b/docs/tutorials/wiki/src/authorization/tests/test_it.py
@@ -11,8 +11,14 @@ class ViewTests(unittest.TestCase):
testing.tearDown()
def test_my_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
request = testing.DummyRequest()
info = my_view(request)
self.assertEqual(info['project'], 'myproj')
+ def test_notfound_view(self):
+ from tutorial.views.notfound import notfound_view
+ request = testing.DummyRequest()
+ info = notfound_view(request)
+ self.assertEqual(info, {})
+
diff --git a/docs/tutorials/wiki/src/authorization/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/authorization/tutorial/templates/layout.pt
index b606e8dad..06a3c8157 100644
--- a/docs/tutorials/wiki/src/authorization/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/authorization/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/authorization/tutorial/views/default.py b/docs/tutorials/wiki/src/authorization/tutorial/views/default.py
index 3a3b170e2..7ba99c65b 100644
--- a/docs/tutorials/wiki/src/authorization/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/authorization/tutorial/views/default.py
@@ -24,7 +24,7 @@ def view_wiki(context, request):
return HTTPFound(location=request.resource_url(context, 'FrontPage'))
-@view_config(context='..models.Page', renderer='../templates/view.pt',
+@view_config(context='..models.Page', renderer='tutorial:templates/view.pt',
permission='view')
def view_page(context, request):
wiki = context.__parent__
@@ -47,7 +47,7 @@ def view_page(context, request):
@view_config(name='add_page', context='..models.Wiki',
- renderer='../templates/edit.pt',
+ renderer='tutorial:templates/edit.pt',
permission='edit')
def add_page(context, request):
pagename = request.subpath[0]
@@ -67,7 +67,7 @@ def add_page(context, request):
@view_config(name='edit_page', context='..models.Page',
- renderer='../templates/edit.pt',
+ renderer='tutorial:templates/edit.pt',
permission='edit')
def edit_page(context, request):
if 'form.submitted' in request.params:
@@ -80,8 +80,8 @@ def edit_page(context, request):
@view_config(context='..models.Wiki', name='login',
- renderer='../templates/login.pt')
-@forbidden_view_config(renderer='../templates/login.pt')
+ renderer='tutorial:templates/login.pt')
+@forbidden_view_config(renderer='tutorial:templates/login.pt')
def login(request):
login_url = request.resource_url(request.context, 'login')
referrer = request.url
diff --git a/docs/tutorials/wiki/src/authorization/tutorial/views/notfound.py b/docs/tutorials/wiki/src/authorization/tutorial/views/notfound.py
index d44b4d0e6..dd0b00488 100644
--- a/docs/tutorials/wiki/src/authorization/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/authorization/tutorial/views/notfound.py
@@ -3,7 +3,7 @@ from pyramid.view import notfound_view_config
from ..models import Page
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
pagename = request.path
diff --git a/docs/tutorials/wiki/src/basiclayout/.coveragerc b/docs/tutorials/wiki/src/basiclayout/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/basiclayout/.coveragerc
+++ b/docs/tutorials/wiki/src/basiclayout/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/basiclayout/MANIFEST.in b/docs/tutorials/wiki/src/basiclayout/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/basiclayout/MANIFEST.in
+++ b/docs/tutorials/wiki/src/basiclayout/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/basiclayout/pytest.ini b/docs/tutorials/wiki/src/basiclayout/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/basiclayout/pytest.ini
+++ b/docs/tutorials/wiki/src/basiclayout/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/basiclayout/setup.py b/docs/tutorials/wiki/src/basiclayout/setup.py
index d6d488ed2..f85780010 100644
--- a/docs/tutorials/wiki/src/basiclayout/setup.py
+++ b/docs/tutorials/wiki/src/basiclayout/setup.py
@@ -42,7 +42,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki/src/basiclayout/tests/__init__.py b/docs/tutorials/wiki/src/basiclayout/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki/src/basiclayout/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/basiclayout/tutorial/tests.py b/docs/tutorials/wiki/src/basiclayout/tests/test_it.py
index 6279d9f66..6c72bcc62 100644
--- a/docs/tutorials/wiki/src/basiclayout/tutorial/tests.py
+++ b/docs/tutorials/wiki/src/basiclayout/tests/test_it.py
@@ -11,8 +11,14 @@ class ViewTests(unittest.TestCase):
testing.tearDown()
def test_my_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
request = testing.DummyRequest()
info = my_view(request)
self.assertEqual(info['project'], 'myproj')
+ def test_notfound_view(self):
+ from tutorial.views.notfound import notfound_view
+ request = testing.DummyRequest()
+ info = notfound_view(request)
+ self.assertEqual(info, {})
+
diff --git a/docs/tutorials/wiki/src/basiclayout/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/basiclayout/tutorial/templates/layout.pt
index 9fdaef00f..9ca01382b 100644
--- a/docs/tutorials/wiki/src/basiclayout/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/basiclayout/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/basiclayout/tutorial/views/default.py b/docs/tutorials/wiki/src/basiclayout/tutorial/views/default.py
index 5d708d15c..51ec5ed98 100644
--- a/docs/tutorials/wiki/src/basiclayout/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/basiclayout/tutorial/views/default.py
@@ -3,6 +3,6 @@ from pyramid.view import view_config
from ..models import MyModel
-@view_config(context=MyModel, renderer='../templates/mytemplate.pt')
+@view_config(context=MyModel, renderer='tutorial:templates/mytemplate.pt')
def my_view(request):
return {'project': 'myproj'}
diff --git a/docs/tutorials/wiki/src/basiclayout/tutorial/views/notfound.py b/docs/tutorials/wiki/src/basiclayout/tutorial/views/notfound.py
index 728791d0a..59a37280e 100644
--- a/docs/tutorials/wiki/src/basiclayout/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/basiclayout/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki/src/installation/.coveragerc b/docs/tutorials/wiki/src/installation/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/installation/.coveragerc
+++ b/docs/tutorials/wiki/src/installation/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/installation/MANIFEST.in b/docs/tutorials/wiki/src/installation/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/installation/MANIFEST.in
+++ b/docs/tutorials/wiki/src/installation/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/installation/pytest.ini b/docs/tutorials/wiki/src/installation/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/installation/pytest.ini
+++ b/docs/tutorials/wiki/src/installation/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/installation/setup.py b/docs/tutorials/wiki/src/installation/setup.py
index d6d488ed2..f85780010 100644
--- a/docs/tutorials/wiki/src/installation/setup.py
+++ b/docs/tutorials/wiki/src/installation/setup.py
@@ -42,7 +42,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki/src/installation/tests/__init__.py b/docs/tutorials/wiki/src/installation/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki/src/installation/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/installation/tutorial/tests.py b/docs/tutorials/wiki/src/installation/tests/test_it.py
index 6279d9f66..6c72bcc62 100644
--- a/docs/tutorials/wiki/src/installation/tutorial/tests.py
+++ b/docs/tutorials/wiki/src/installation/tests/test_it.py
@@ -11,8 +11,14 @@ class ViewTests(unittest.TestCase):
testing.tearDown()
def test_my_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
request = testing.DummyRequest()
info = my_view(request)
self.assertEqual(info['project'], 'myproj')
+ def test_notfound_view(self):
+ from tutorial.views.notfound import notfound_view
+ request = testing.DummyRequest()
+ info = notfound_view(request)
+ self.assertEqual(info, {})
+
diff --git a/docs/tutorials/wiki/src/installation/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/installation/tutorial/templates/layout.pt
index 9fdaef00f..9ca01382b 100644
--- a/docs/tutorials/wiki/src/installation/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/installation/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/installation/tutorial/views/default.py b/docs/tutorials/wiki/src/installation/tutorial/views/default.py
index 5d708d15c..51ec5ed98 100644
--- a/docs/tutorials/wiki/src/installation/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/installation/tutorial/views/default.py
@@ -3,6 +3,6 @@ from pyramid.view import view_config
from ..models import MyModel
-@view_config(context=MyModel, renderer='../templates/mytemplate.pt')
+@view_config(context=MyModel, renderer='tutorial:templates/mytemplate.pt')
def my_view(request):
return {'project': 'myproj'}
diff --git a/docs/tutorials/wiki/src/installation/tutorial/views/notfound.py b/docs/tutorials/wiki/src/installation/tutorial/views/notfound.py
index 728791d0a..59a37280e 100644
--- a/docs/tutorials/wiki/src/installation/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/installation/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki/src/models/.coveragerc b/docs/tutorials/wiki/src/models/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/models/.coveragerc
+++ b/docs/tutorials/wiki/src/models/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/models/MANIFEST.in b/docs/tutorials/wiki/src/models/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/models/MANIFEST.in
+++ b/docs/tutorials/wiki/src/models/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/models/pytest.ini b/docs/tutorials/wiki/src/models/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/models/pytest.ini
+++ b/docs/tutorials/wiki/src/models/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/models/setup.py b/docs/tutorials/wiki/src/models/setup.py
index d6d488ed2..f85780010 100644
--- a/docs/tutorials/wiki/src/models/setup.py
+++ b/docs/tutorials/wiki/src/models/setup.py
@@ -42,7 +42,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki/src/models/tests/__init__.py b/docs/tutorials/wiki/src/models/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki/src/models/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/models/tutorial/tests.py b/docs/tutorials/wiki/src/models/tests/test_it.py
index 6279d9f66..6c72bcc62 100644
--- a/docs/tutorials/wiki/src/models/tutorial/tests.py
+++ b/docs/tutorials/wiki/src/models/tests/test_it.py
@@ -11,8 +11,14 @@ class ViewTests(unittest.TestCase):
testing.tearDown()
def test_my_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
request = testing.DummyRequest()
info = my_view(request)
self.assertEqual(info['project'], 'myproj')
+ def test_notfound_view(self):
+ from tutorial.views.notfound import notfound_view
+ request = testing.DummyRequest()
+ info = notfound_view(request)
+ self.assertEqual(info, {})
+
diff --git a/docs/tutorials/wiki/src/models/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/models/tutorial/templates/layout.pt
index 9fdaef00f..9ca01382b 100644
--- a/docs/tutorials/wiki/src/models/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/models/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/models/tutorial/views/default.py b/docs/tutorials/wiki/src/models/tutorial/views/default.py
index 5d708d15c..51ec5ed98 100644
--- a/docs/tutorials/wiki/src/models/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/models/tutorial/views/default.py
@@ -3,6 +3,6 @@ from pyramid.view import view_config
from ..models import MyModel
-@view_config(context=MyModel, renderer='../templates/mytemplate.pt')
+@view_config(context=MyModel, renderer='tutorial:templates/mytemplate.pt')
def my_view(request):
return {'project': 'myproj'}
diff --git a/docs/tutorials/wiki/src/models/tutorial/views/notfound.py b/docs/tutorials/wiki/src/models/tutorial/views/notfound.py
index 728791d0a..59a37280e 100644
--- a/docs/tutorials/wiki/src/models/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/models/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki/src/tests/.coveragerc b/docs/tutorials/wiki/src/tests/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/tests/.coveragerc
+++ b/docs/tutorials/wiki/src/tests/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/tests/MANIFEST.in b/docs/tutorials/wiki/src/tests/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/tests/MANIFEST.in
+++ b/docs/tutorials/wiki/src/tests/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/tests/pytest.ini b/docs/tutorials/wiki/src/tests/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/tests/pytest.ini
+++ b/docs/tutorials/wiki/src/tests/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/tests/setup.py b/docs/tutorials/wiki/src/tests/setup.py
index fa5948acb..f19d643e6 100644
--- a/docs/tutorials/wiki/src/tests/setup.py
+++ b/docs/tutorials/wiki/src/tests/setup.py
@@ -44,7 +44,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki/src/tests/tests/__init__.py b/docs/tutorials/wiki/src/tests/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki/src/tests/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/tests/tutorial/tests.py b/docs/tutorials/wiki/src/tests/tests/test_it.py
index ff1c07b7c..e45380e6f 100644
--- a/docs/tutorials/wiki/src/tests/tutorial/tests.py
+++ b/docs/tutorials/wiki/src/tests/tests/test_it.py
@@ -5,7 +5,7 @@ from pyramid import testing
class PageModelTests(unittest.TestCase):
def _getTargetClass(self):
- from .models import Page
+ from tutorial.models import Page
return Page
def _makeOne(self, data='some data'):
@@ -18,7 +18,7 @@ class PageModelTests(unittest.TestCase):
class WikiModelTests(unittest.TestCase):
def _getTargetClass(self):
- from .models import Wiki
+ from tutorial.models import Wiki
return Wiki
def _makeOne(self):
@@ -32,7 +32,7 @@ class WikiModelTests(unittest.TestCase):
class AppmakerTests(unittest.TestCase):
def _callFUT(self, zodb_root):
- from .models import appmaker
+ from tutorial.models import appmaker
return appmaker(zodb_root)
def test_it(self):
@@ -43,7 +43,7 @@ class AppmakerTests(unittest.TestCase):
class ViewWikiTests(unittest.TestCase):
def test_it(self):
- from .views.default import view_wiki
+ from tutorial.views.default import view_wiki
context = testing.DummyResource()
request = testing.DummyRequest()
response = view_wiki(context, request)
@@ -51,7 +51,7 @@ class ViewWikiTests(unittest.TestCase):
class ViewPageTests(unittest.TestCase):
def _callFUT(self, context, request):
- from .views.default import view_page
+ from tutorial.views.default import view_page
return view_page(context, request)
def test_it(self):
@@ -77,7 +77,7 @@ class ViewPageTests(unittest.TestCase):
class AddPageTests(unittest.TestCase):
def _callFUT(self, context, request):
- from .views.default import add_page
+ from tutorial.views.default import add_page
return add_page(context, request)
def test_it_notsubmitted(self):
@@ -103,7 +103,7 @@ class AddPageTests(unittest.TestCase):
class EditPageTests(unittest.TestCase):
def _callFUT(self, context, request):
- from .views.default import edit_page
+ from tutorial.views.default import edit_page
return edit_page(context, request)
def test_it_notsubmitted(self):
@@ -124,7 +124,7 @@ class EditPageTests(unittest.TestCase):
class SecurityTests(unittest.TestCase):
def test_hashing(self):
- from .security import hash_password, check_password
+ from tutorial.security import hash_password, check_password
password = 'secretpassword'
hashed_password = hash_password(password)
self.assertTrue(check_password(hashed_password, password))
@@ -145,7 +145,7 @@ class FunctionalTests(unittest.TestCase):
def setUp(self):
import tempfile
import os.path
- from . import main
+ from tutorial import main
self.tmpdir = tempfile.mkdtemp()
dbpath = os.path.join( self.tmpdir, 'test.db')
diff --git a/docs/tutorials/wiki/src/tests/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/tests/tutorial/templates/layout.pt
index b606e8dad..06a3c8157 100644
--- a/docs/tutorials/wiki/src/tests/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/tests/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/tests/tutorial/views/default.py b/docs/tutorials/wiki/src/tests/tutorial/views/default.py
index 3a3b170e2..7ba99c65b 100644
--- a/docs/tutorials/wiki/src/tests/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/tests/tutorial/views/default.py
@@ -24,7 +24,7 @@ def view_wiki(context, request):
return HTTPFound(location=request.resource_url(context, 'FrontPage'))
-@view_config(context='..models.Page', renderer='../templates/view.pt',
+@view_config(context='..models.Page', renderer='tutorial:templates/view.pt',
permission='view')
def view_page(context, request):
wiki = context.__parent__
@@ -47,7 +47,7 @@ def view_page(context, request):
@view_config(name='add_page', context='..models.Wiki',
- renderer='../templates/edit.pt',
+ renderer='tutorial:templates/edit.pt',
permission='edit')
def add_page(context, request):
pagename = request.subpath[0]
@@ -67,7 +67,7 @@ def add_page(context, request):
@view_config(name='edit_page', context='..models.Page',
- renderer='../templates/edit.pt',
+ renderer='tutorial:templates/edit.pt',
permission='edit')
def edit_page(context, request):
if 'form.submitted' in request.params:
@@ -80,8 +80,8 @@ def edit_page(context, request):
@view_config(context='..models.Wiki', name='login',
- renderer='../templates/login.pt')
-@forbidden_view_config(renderer='../templates/login.pt')
+ renderer='tutorial:templates/login.pt')
+@forbidden_view_config(renderer='tutorial:templates/login.pt')
def login(request):
login_url = request.resource_url(request.context, 'login')
referrer = request.url
diff --git a/docs/tutorials/wiki/src/tests/tutorial/views/notfound.py b/docs/tutorials/wiki/src/tests/tutorial/views/notfound.py
index d44b4d0e6..dd0b00488 100644
--- a/docs/tutorials/wiki/src/tests/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/tests/tutorial/views/notfound.py
@@ -3,7 +3,7 @@ from pyramid.view import notfound_view_config
from ..models import Page
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
pagename = request.path
diff --git a/docs/tutorials/wiki/src/views/.coveragerc b/docs/tutorials/wiki/src/views/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki/src/views/.coveragerc
+++ b/docs/tutorials/wiki/src/views/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki/src/views/MANIFEST.in b/docs/tutorials/wiki/src/views/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki/src/views/MANIFEST.in
+++ b/docs/tutorials/wiki/src/views/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki/src/views/pytest.ini b/docs/tutorials/wiki/src/views/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki/src/views/pytest.ini
+++ b/docs/tutorials/wiki/src/views/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki/src/views/setup.py b/docs/tutorials/wiki/src/views/setup.py
index 6f3cae397..439bb7759 100644
--- a/docs/tutorials/wiki/src/views/setup.py
+++ b/docs/tutorials/wiki/src/views/setup.py
@@ -43,7 +43,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
diff --git a/docs/tutorials/wiki/src/views/tests/__init__.py b/docs/tutorials/wiki/src/views/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki/src/views/tests/__init__.py
diff --git a/docs/tutorials/wiki/src/views/tests/test_it.py b/docs/tutorials/wiki/src/views/tests/test_it.py
new file mode 100644
index 000000000..6c72bcc62
--- /dev/null
+++ b/docs/tutorials/wiki/src/views/tests/test_it.py
@@ -0,0 +1,24 @@
+import unittest
+
+from pyramid import testing
+
+
+class ViewTests(unittest.TestCase):
+ def setUp(self):
+ self.config = testing.setUp()
+
+ def tearDown(self):
+ testing.tearDown()
+
+ def test_my_view(self):
+ from tutorial.views.default import my_view
+ request = testing.DummyRequest()
+ info = my_view(request)
+ self.assertEqual(info['project'], 'myproj')
+
+ def test_notfound_view(self):
+ from tutorial.views.notfound import notfound_view
+ request = testing.DummyRequest()
+ info = notfound_view(request)
+ self.assertEqual(info, {})
+
diff --git a/docs/tutorials/wiki/src/views/tutorial/templates/layout.pt b/docs/tutorials/wiki/src/views/tutorial/templates/layout.pt
index b606e8dad..06a3c8157 100644
--- a/docs/tutorials/wiki/src/views/tutorial/templates/layout.pt
+++ b/docs/tutorials/wiki/src/views/tutorial/templates/layout.pt
@@ -1,5 +1,5 @@
<!DOCTYPE html metal:define-macro="layout">
-<html lang="{{request.locale_name}}">
+<html lang="${request.locale_name}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
diff --git a/docs/tutorials/wiki/src/views/tutorial/tests.py b/docs/tutorials/wiki/src/views/tutorial/tests.py
deleted file mode 100644
index 6279d9f66..000000000
--- a/docs/tutorials/wiki/src/views/tutorial/tests.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import unittest
-
-from pyramid import testing
-
-
-class ViewTests(unittest.TestCase):
- def setUp(self):
- self.config = testing.setUp()
-
- def tearDown(self):
- testing.tearDown()
-
- def test_my_view(self):
- from .views.default import my_view
- request = testing.DummyRequest()
- info = my_view(request)
- self.assertEqual(info['project'], 'myproj')
-
diff --git a/docs/tutorials/wiki/src/views/tutorial/views/default.py b/docs/tutorials/wiki/src/views/tutorial/views/default.py
index b4b65a49b..e7921cf2f 100644
--- a/docs/tutorials/wiki/src/views/tutorial/views/default.py
+++ b/docs/tutorials/wiki/src/views/tutorial/views/default.py
@@ -15,7 +15,7 @@ def view_wiki(context, request):
return HTTPFound(location=request.resource_url(context, 'FrontPage'))
-@view_config(context='..models.Page', renderer='../templates/view.pt')
+@view_config(context='..models.Page', renderer='tutorial:templates/view.pt')
def view_page(context, request):
wiki = context.__parent__
@@ -36,7 +36,7 @@ def view_page(context, request):
@view_config(name='add_page', context='..models.Wiki',
- renderer='../templates/edit.pt')
+ renderer='tutorial:templates/edit.pt')
def add_page(context, request):
pagename = request.subpath[0]
if 'form.submitted' in request.params:
@@ -54,7 +54,7 @@ def add_page(context, request):
@view_config(name='edit_page', context='..models.Page',
- renderer='../templates/edit.pt')
+ renderer='tutorial:templates/edit.pt')
def edit_page(context, request):
if 'form.submitted' in request.params:
context.data = request.params['body']
diff --git a/docs/tutorials/wiki/src/views/tutorial/views/notfound.py b/docs/tutorials/wiki/src/views/tutorial/views/notfound.py
index d44b4d0e6..dd0b00488 100644
--- a/docs/tutorials/wiki/src/views/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki/src/views/tutorial/views/notfound.py
@@ -3,7 +3,7 @@ from pyramid.view import notfound_view_config
from ..models import Page
-@notfound_view_config(renderer='../templates/404.pt')
+@notfound_view_config(renderer='tutorial:templates/404.pt')
def notfound_view(request):
request.response.status = 404
pagename = request.path
diff --git a/docs/tutorials/wiki/tests.rst b/docs/tutorials/wiki/tests.rst
index 9dacc5f96..f710b3b10 100644
--- a/docs/tutorials/wiki/tests.rst
+++ b/docs/tutorials/wiki/tests.rst
@@ -4,7 +4,7 @@
Adding Tests
============
-We will now add tests for the models and the views and a few functional tests in ``tests.py``.
+We will now add tests for the models and the views and a few functional tests in ``tests/test_it.py``.
Tests ensure that an application works, and that it continues to work when changes are made in the future.
@@ -12,10 +12,9 @@ Test the models
===============
We write tests for the ``model`` classes and the ``appmaker``.
-Changing ``tests.py``, we will write a separate test class for each ``model`` class
+We will modify our ``test_it.py`` file, writing a separate test class for each ``model`` class.
We will also write a test class for the ``appmaker``.
-To do so, we will retain the ``tutorial.tests.ViewTests`` class that was generated from choosing the ``zodb`` backend option.
We will add three test classes, one for each of the following:
- the ``Page`` model named ``PageModelTests``
@@ -26,7 +25,7 @@ We will add three test classes, one for each of the following:
Test the views
==============
-We will modify our ``tests.py`` file, adding tests for each view function that we added previously.
+We will modify our ``test_it.py`` file, adding tests for each view function that we added previously.
As a result, we will delete the ``ViewTests`` class that the ``zodb`` backend option provided, and add four other test classes: ``ViewWikiTests``, ``ViewPageTests``, ``AddPageTests``, and ``EditPageTests``.
These test the ``view_wiki``, ``view_page``, ``add_page``, and ``edit_page`` views.
@@ -35,14 +34,15 @@ Functional tests
================
We will test the whole application, covering security aspects that are not tested in the unit tests, such as logging in, logging out, checking that the ``viewer`` user cannot add or edit pages, but the ``editor`` user can, and so on.
+As a result we will add two test classes, ``SecurityTests`` and ``FunctionalTests``.
-View the results of all our edits to ``tests.py``
-=================================================
+View the results of all our edits to ``tests/test_it.py``
+=========================================================
-Open the ``tutorial/tests.py`` module, and edit it such that it appears as follows:
+Open the ``tests/test_it.py`` module, and edit it such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests.py
+.. literalinclude:: src/tests/tests/test_it.py
:linenos:
:language: python
diff --git a/docs/tutorials/wiki2/basiclayout.rst b/docs/tutorials/wiki2/basiclayout.rst
index f3a9db223..ae58d80a5 100644
--- a/docs/tutorials/wiki2/basiclayout.rst
+++ b/docs/tutorials/wiki2/basiclayout.rst
@@ -58,16 +58,16 @@ dictionary of settings parsed from the ``.ini`` file, which contains
deployment-related values, such as ``pyramid.reload_templates``,
``sqlalchemy.url``, and so on.
-Next include :term:`Jinja2` templating bindings so that we can use renderers
-with the ``.jinja2`` extension within our project.
+Next include the package ``models`` using a dotted Python path. The exact
+setup of the models will be covered later.
.. literalinclude:: src/basiclayout/tutorial/__init__.py
:lines: 8
:lineno-match:
:language: py
-Next include the package ``models`` using a dotted Python path. The exact
-setup of the models will be covered later.
+Next include :term:`Jinja2` templating bindings so that we can use renderers
+with the ``.jinja2`` extension within our project.
.. literalinclude:: src/basiclayout/tutorial/__init__.py
:lines: 9
@@ -184,6 +184,25 @@ database and provide an alternate error response. That response will include
the text shown at the end of the file, which will be displayed in the browser
to inform the user about possible actions to take to solve the problem.
+Open ``tutorial/views/notfound.py`` in the ``views`` package to look at the second view.
+
+.. literalinclude:: src/basiclayout/tutorial/views/notfound.py
+ :linenos:
+ :language: python
+
+Without repeating ourselves, we will point out the differences between this view and the previous.
+
+#. *Line 4*.
+ The ``notfound_view`` function is decorated with ``@notfound_view_config``.
+ This decorator registers a :term:`Not Found View` using :meth:`pyramid.config.Configurator.add_notfound_view`.
+
+ The ``renderer`` argument names an :term:`asset specification` of ``tutorial:templates/404.jinja2``.
+
+#. *Lines 5-7*.
+ A :term:`view callable` named ``notfound_view`` is defined, which is decorated in the step above.
+ It sets the HTTP response status code to ``404``.
+ The function returns an empty dictionary to the template ``404.jinja2``, which accepts no parameters anyway.
+
Content models with the ``models`` package
------------------------------------------
diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst
index 6624e4cdc..4b80e09ac 100644
--- a/docs/tutorials/wiki2/definingmodels.rst
+++ b/docs/tutorials/wiki2/definingmodels.rst
@@ -33,10 +33,12 @@ Open ``tutorial/setup.py`` and edit it to look like the following:
.. literalinclude:: src/models/setup.py
:linenos:
- :emphasize-lines: 13
+ :emphasize-lines: 11-24
:language: python
-Only the highlighted line needs to be added.
+It is a good practice to sort packages alphabetically to make them easier to find.
+Our cookiecutter does not have its packages sorted because it merely tacks on additional packages depending on our selections.
+After adding ``bcrypt`` and sorting packages, we should have the above ``requires`` list.
.. note::
@@ -70,7 +72,7 @@ like the following.
.. code-block:: text
- Successfully installed bcrypt-3.1.4 cffi-1.11.5 pycparser-2.18 tutorial
+ Successfully installed bcrypt-3.1.7 cffi-1.13.2 pycparser-2.19 tutorial
Remove ``mymodel.py``
@@ -185,86 +187,19 @@ Success executing these commands will generate output similar to the following.
.. code-block:: text
- 2018-06-29 01:28:42,407 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:28:42,407 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:28:42,408 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:28:42,408 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:28:42,409 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-29 01:28:42,409 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,410 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num
- FROM alembic_version
- 2018-06-29 01:28:42,410 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,411 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT name FROM sqlite_master WHERE type='table' ORDER BY name
- 2018-06-29 01:28:42,412 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,413 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("models")
- 2018-06-29 01:28:42,413 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,414 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table'
- 2018-06-29 01:28:42,414 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,414 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA foreign_key_list("models")
- 2018-06-29 01:28:42,414 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,414 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table'
- 2018-06-29 01:28:42,415 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,416 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_list("models")
- 2018-06-29 01:28:42,416 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,416 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_info("my_index")
- 2018-06-29 01:28:42,416 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_list("models")
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_info("my_index")
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table'
- 2018-06-29 01:28:42,417 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- Generating /<somepath>/tutorial/tutorial/alembic/versions/20180629_23e9f8eb6c28.py ... done
+ 2019-12-28 02:02:31,841 INFO [alembic.runtime.migration:154][MainThread] Context impl SQLiteImpl.
+ 2019-12-28 02:02:31,841 INFO [alembic.runtime.migration:161][MainThread] Will assume non-transactional DDL.
+ 2019-12-28 02:02:31,844 INFO [alembic.autogenerate.compare:134][MainThread] Detected added table 'users'
+ 2019-12-28 02:02:31,845 INFO [alembic.autogenerate.compare:134][MainThread] Detected added table 'pages'
+ 2019-12-28 02:02:31,853 INFO [alembic.autogenerate.compare:621][MainThread] Detected removed index 'my_index' on 'models'
+ 2019-12-28 02:02:31,853 INFO [alembic.autogenerate.compare:176][MainThread] Detected removed table 'models'
+ Generating <somepath>/tutorial/tutorial/alembic/versions/20191228_226a73ffaeef.py ... done
.. code-block:: text
- 2018-06-29 01:29:37,957 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:29:37,958 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:29:37,958 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:29:37,958 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:29:37,960 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-29 01:29:37,960 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,960 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num
- FROM alembic_version
- 2018-06-29 01:29:37,960 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,963 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- CREATE TABLE users (
- id INTEGER NOT NULL,
- name TEXT NOT NULL,
- role TEXT NOT NULL,
- password_hash TEXT,
- CONSTRAINT pk_users PRIMARY KEY (id),
- CONSTRAINT uq_users_name UNIQUE (name)
- )
-
-
- 2018-06-29 01:29:37,963 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,966 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-29 01:29:37,968 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- CREATE TABLE pages (
- id INTEGER NOT NULL,
- name TEXT NOT NULL,
- data TEXT NOT NULL,
- creator_id INTEGER NOT NULL,
- CONSTRAINT pk_pages PRIMARY KEY (id),
- CONSTRAINT fk_pages_creator_id_users FOREIGN KEY(creator_id) REFERENCES users (id),
- CONSTRAINT uq_pages_name UNIQUE (name)
- )
-
-
- 2018-06-29 01:29:37,968 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,969 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-29 01:29:37,969 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- DROP INDEX my_index
- 2018-06-29 01:29:37,969 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,970 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-29 01:29:37,970 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- DROP TABLE models
- 2018-06-29 01:29:37,970 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,971 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-29 01:29:37,972 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] UPDATE alembic_version SET version_num='23e9f8eb6c28' WHERE alembic_version.version_num = 'b6b22ae3e628'
- 2018-06-29 01:29:37,972 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-29 01:29:37,972 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
+ 2019-12-28 02:03:15,390 INFO [alembic.runtime.migration:154][MainThread] Context impl SQLiteImpl.
+ 2019-12-28 02:03:15,391 INFO [alembic.runtime.migration:161][MainThread] Will assume non-transactional DDL.
+ 2019-12-28 02:03:15,393 INFO [alembic.runtime.migration:513][MainThread] Running upgrade a8e203c3ce9c -> 226a73ffaeef, use new models Page and User
.. _wiki2_alembic_overview:
@@ -318,26 +253,23 @@ Only the highlighted lines need to be changed.
Populating the database
=======================
-Because our model has changed, and to repopulate the database, we
-need to rerun the ``initialize_tutorial_db`` command to pick up the changes
-we've made to the initialize_db.py file. See :ref:`initialize_db_wiki2` for instructions.
+Because our model has changed, and to repopulate the database, we need to rerun the ``initialize_tutorial_db`` command to pick up the changes we've made to the ``initialize_db.py`` file.
-Success will look something like this:
+On Unix
+-------
-.. code-block:: text
+.. code-block:: bash
+
+ $VENV/bin/initialize_tutorial_db development.ini
+
+On Windows
+----------
+
+.. code-block:: doscon
+
+ %VENV%\Scripts\initialize_tutorial_db development.ini
- 2018-06-29 01:30:39,326 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:30:39,326 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:30:39,327 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-29 01:30:39,327 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-29 01:30:39,328 INFO [sqlalchemy.engine.base.Engine:682][MainThread] BEGIN (implicit)
- 2018-06-29 01:30:39,329 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO users (name, role, password_hash) VALUES (?, ?, ?)
- 2018-06-29 01:30:39,329 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ('editor', 'editor', '$2b$12$PlaJSN7goVbyx8OFs8yAju9n5gHGdI6PZ2QRJGM2jDCiEU4ItUNxy')
- 2018-06-29 01:30:39,330 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO users (name, role, password_hash) VALUES (?, ?, ?)
- 2018-06-29 01:30:39,330 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ('basic', 'basic', '$2b$12$MvXdM8jlkbjEyPZ6uXzRg.yatZZK8jCwfPaM7kFkmVJiJjRoCCvmW')
- 2018-06-29 01:30:39,331 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO pages (name, data, creator_id) VALUES (?, ?, ?)
- 2018-06-29 01:30:39,331 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ('FrontPage', 'This is the front page', 1)
- 2018-06-29 01:30:39,332 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
+There should be no output to your console to indicate success.
View the application in a browser
diff --git a/docs/tutorials/wiki2/installation.rst b/docs/tutorials/wiki2/installation.rst
index 705979065..55fca15a1 100644
--- a/docs/tutorials/wiki2/installation.rst
+++ b/docs/tutorials/wiki2/installation.rst
@@ -177,26 +177,30 @@ The console will show ``pip`` checking for packages and installing missing packa
.. code-block:: bash
- Successfully installed Jinja2-2.8 Mako-1.0.6 MarkupSafe-0.23 \
- PasteDeploy-1.5.2 Pygments-2.1.3 SQLAlchemy-1.1.4 WebOb-1.6.3 \
- WebTest-2.0.24 beautifulsoup4-4.5.1 coverage-4.2 py-1.4.32 pyramid-1.7.3 \
- pyramid-debugtoolbar-3.0.5 pyramid-jinja2-2.7 pyramid-mako-1.0.2 \
- pyramid-tm-1.1.1 pytest-3.0.5 pytest-cov-2.4.0 repoze.lru-0.6 six-1.10.0 \
- transaction-2.0.3 translationstring-1.3 tutorial venusian-1.0 \
- waitress-1.0.1 zope.deprecation-4.2.0 zope.interface-4.3.3 \
- zope.sqlalchemy-0.7.7
+ Successfully installed Jinja2-2.10.3 Mako-1.1.0 MarkupSafe-1.1.1 \
+ PasteDeploy-2.0.1 Pygments-2.5.2 SQLAlchemy-1.3.12 WebTest-2.0.33 \
+ alembic-1.3.2 attrs-19.3.0 beautifulsoup4-4.8.2 coverage-5.0.1 \
+ hupper-1.9.1 importlib-metadata-1.3.0 more-itertools-8.0.2 packaging-19.2 \
+ plaster-1.0 plaster-pastedeploy-0.7 pluggy-0.13.1 py-1.8.1 \
+ pyparsing-2.4.6 pyramid-1.10.4 pyramid-debugtoolbar-4.5.1 \
+ pyramid-jinja2-2.8 pyramid-mako-1.1.0 pyramid-retry-2.1 pyramid-tm-2.3 \
+ pytest-5.3.2 pytest-cov-2.8.1 python-dateutil-2.8.1 python-editor-1.0.4 \
+ repoze.lru-0.7 six-1.13.0 soupsieve-1.9.5 transaction-3.0.0 \
+ translationstring-1.3 tutorial venusian-3.0.0 waitress-1.4.1 \
+ wcwidth-0.1.7 webob-1.8.5 zipp-0.6.0 zope.deprecation-4.4.0 \
+ zope.interface-4.7.1 zope.sqlalchemy-1.2
Testing requirements are defined in our project's ``setup.py`` file, in the ``tests_require`` and ``extras_require`` stanzas.
.. literalinclude:: src/installation/setup.py
:language: python
:lineno-match:
- :lines: 24-28
+ :lines: 25-29
.. literalinclude:: src/installation/setup.py
:language: python
:lineno-match:
- :lines: 48-50
+ :lines: 49-51
.. _initialize_db_wiki2:
@@ -226,26 +230,11 @@ The output to your console should be something like this:
.. code-block:: text
- 2018-06-22 17:57:31,587 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:31,587 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:31,588 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:31,588 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:31,589 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-22 17:57:31,589 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- CREATE TABLE alembic_version (
- version_num VARCHAR(32) NOT NULL,
- CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
- )
-
-
- 2018-06-22 17:57:31,591 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:31,591 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-22 17:57:31,594 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT name FROM sqlite_master WHERE type='table' ORDER BY name
- 2018-06-22 17:57:31,594 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- Generating /<somepath>/tutorial/alembic/versions/20180622_bab5a278ce04.py ... done
+ 2019-12-28 00:46:03,850 INFO [alembic.runtime.migration:154][MainThread] Context impl SQLiteImpl.
+ 2019-12-28 00:46:03,850 INFO [alembic.runtime.migration:161][MainThread] Will assume non-transactional DDL.
+ 2019-12-28 00:46:03,853 INFO [alembic.autogenerate.compare:134][MainThread] Detected added table 'models'
+ 2019-12-28 00:46:03,853 INFO [alembic.autogenerate.compare:586][MainThread] Detected added index 'my_index' on '['name']'
+ Generating <somepath>/tutorial/tutorial/alembic/versions/20191228_a8e203c3ce9c.py ... done
Upgrade to that revision.
@@ -267,34 +256,9 @@ The output to your console should be something like this:
.. code-block:: text
- 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:37,816 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-22 17:57:37,816 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num
- FROM alembic_version
- 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version")
- 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,819 INFO [sqlalchemy.engine.base.Engine:1151][MainThread]
- CREATE TABLE models (
- id INTEGER NOT NULL,
- name TEXT,
- value INTEGER,
- CONSTRAINT pk_models PRIMARY KEY (id)
- )
-
-
- 2018-06-22 17:57:37,820 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,822 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-22 17:57:37,824 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] CREATE UNIQUE INDEX my_index ON models (name)
- 2018-06-22 17:57:37,824 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
- 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO alembic_version (version_num) VALUES ('bab5a278ce04')
- 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ()
- 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
+ 2019-12-28 00:52:12,158 INFO [alembic.runtime.migration:154][MainThread] Context impl SQLiteImpl.
+ 2019-12-28 00:52:12,158 INFO [alembic.runtime.migration:161][MainThread] Will assume non-transactional DDL.
+ 2019-12-28 00:52:12,160 INFO [alembic.runtime.migration:513][MainThread] Running upgrade -> a8e203c3ce9c, init
.. _load_data_wiki2:
@@ -318,22 +282,9 @@ On Windows
%VENV%\Scripts\initialize_tutorial_db development.ini
-The output to your console should be something like this:
-
-.. code-block:: bash
-
- 2018-06-22 17:57:46,241 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:46,241 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:46,242 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
- 2018-06-22 17:57:46,242 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] ()
- 2018-06-22 17:57:46,243 INFO [sqlalchemy.engine.base.Engine:682][MainThread] BEGIN (implicit)
- 2018-06-22 17:57:46,244 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO models (name, value) VALUES (?, ?)
- 2018-06-22 17:57:46,245 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ('one', 1)
- 2018-06-22 17:57:46,246 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT
-
-Success! You should now have a ``tutorial.sqlite`` file in your current
-working directory. This is an SQLite database with a single table defined in it
-(``models``) and single record inside of that.
+There should be no output to your console.
+You should now have a ``tutorial.sqlite`` file in your current working directory.
+This is an SQLite database with three tables defined in it, ``alembic_version``, ``models``, and ``master``, where the first two tables each have single record inside of them.
.. _sql_running_tests:
@@ -398,29 +349,31 @@ If successful, you will see output something like this:
.. code-block:: bash
======================== test session starts ========================
- platform Python 3.6.5, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
- rootdir: /<somepath>/tutorial, inifile: pytest.ini
- plugins: cov-2.5.1
+ platform -- Python 3.7.3, pytest-5.3.2, py-1.8.1, pluggy-0.13.1
+ rootdir: <somepath>/tutorial, inifile: pytest.ini, testpaths: tutorial
+ plugins: cov-2.8.1
collected 2 items
tutorial/tests.py ..
- ------------------ coverage: platform Python 3.6.5 ------------------
+
+ ------------------ coverage: platform Python 3.7.3 ------------------
Name Stmts Miss Cover Missing
-----------------------------------------------------------------
tutorial/__init__.py 8 6 25% 7-12
tutorial/models/__init__.py 24 0 100%
tutorial/models/meta.py 5 0 100%
tutorial/models/mymodel.py 8 0 100%
+ tutorial/pshell.py 7 7 0% 1-13
tutorial/routes.py 3 3 0% 1-3
tutorial/scripts/__init__.py 0 0 100%
- tutorial/scripts/initialize_db.py 24 24 0% 1-34
+ tutorial/scripts/initialize_db.py 22 22 0% 1-38
tutorial/views/__init__.py 0 0 100%
tutorial/views/default.py 12 0 100%
tutorial/views/notfound.py 4 4 0% 1-7
-----------------------------------------------------------------
- TOTAL 88 37 58%
+ TOTAL 93 42 55%
- ===================== 2 passed in 0.57 seconds ======================
+ ===================== 2 passed in 0.64 seconds ======================
Our package doesn't quite have 100% test coverage.
@@ -440,7 +393,7 @@ On Unix
.. code-block:: bash
- $VENV/bin/pytest --cov=tutorial tutorial/tests.py -q
+ $VENV/bin/pytest --cov=tutorial tests -q
On Windows
^^^^^^^^^^
@@ -489,8 +442,8 @@ If successful, you will see something like this on your console:
.. code-block:: text
- Starting subprocess with file monitor
- Starting server in PID 44078.
+ Starting monitor for PID 68932.
+ Starting server in PID 68932.
Serving on http://localhost:6543
Serving on http://localhost:6543
diff --git a/docs/tutorials/wiki2/src/authentication/.coveragerc b/docs/tutorials/wiki2/src/authentication/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/authentication/.coveragerc
+++ b/docs/tutorials/wiki2/src/authentication/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/authentication/MANIFEST.in b/docs/tutorials/wiki2/src/authentication/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/authentication/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/authentication/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/authentication/development.ini b/docs/tutorials/wiki2/src/authentication/development.ini
index 8fbb5fd38..7fda4cb7b 100644
--- a/docs/tutorials/wiki2/src/authentication/development.ini
+++ b/docs/tutorials/wiki2/src/authentication/development.ini
@@ -47,7 +47,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -72,6 +72,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/authentication/production.ini b/docs/tutorials/wiki2/src/authentication/production.ini
index 9fef64f83..8e878a707 100644
--- a/docs/tutorials/wiki2/src/authentication/production.ini
+++ b/docs/tutorials/wiki2/src/authentication/production.ini
@@ -41,7 +41,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -66,6 +66,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/authentication/pytest.ini b/docs/tutorials/wiki2/src/authentication/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/authentication/pytest.ini
+++ b/docs/tutorials/wiki2/src/authentication/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/authentication/setup.py b/docs/tutorials/wiki2/src/authentication/setup.py
index f71998afc..500c5e599 100644
--- a/docs/tutorials/wiki2/src/authentication/setup.py
+++ b/docs/tutorials/wiki2/src/authentication/setup.py
@@ -13,7 +13,7 @@ requires = [
'bcrypt',
'docutils',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
+ 'pyramid',
'pyramid_debugtoolbar',
'pyramid_jinja2',
'pyramid_retry',
@@ -45,7 +45,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -57,7 +57,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/authentication/tests/__init__.py b/docs/tutorials/wiki2/src/authentication/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/authentication/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/tests.py b/docs/tutorials/wiki2/src/authentication/tests/test_it.py
index ce650ca7c..ea16534fc 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/tests.py
+++ b/docs/tutorials/wiki2/src/authentication/tests/test_it.py
@@ -1,8 +1,9 @@
import unittest
-import transaction
from pyramid import testing
+import transaction
+
def dummy_request(dbsession):
return testing.DummyRequest(dbsession=dbsession)
@@ -13,10 +14,10 @@ class BaseTest(unittest.TestCase):
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('.models')
+ self.config.include('tutorial.models')
settings = self.config.get_settings()
- from .models import (
+ from tutorial.models import (
get_engine,
get_session_factory,
get_tm_session,
@@ -28,11 +29,11 @@ class BaseTest(unittest.TestCase):
self.session = get_tm_session(session_factory, transaction.manager)
def init_database(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
Base.metadata.create_all(self.engine)
def tearDown(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
testing.tearDown()
transaction.abort()
@@ -45,13 +46,13 @@ class TestMyViewSuccessCondition(BaseTest):
super(TestMyViewSuccessCondition, self).setUp()
self.init_database()
- from .models import MyModel
+ from tutorial.models import MyModel
model = MyModel(name='one', value=55)
self.session.add(model)
def test_passing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info['one'].name, 'one')
self.assertEqual(info['project'], 'myproj')
@@ -60,6 +61,6 @@ class TestMyViewSuccessCondition(BaseTest):
class TestMyViewFailureCondition(BaseTest):
def test_failing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/__init__.py b/docs/tutorials/wiki2/src/authentication/tutorial/__init__.py
index 5d4bae3d7..ce2e9f12a 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.include('.security')
config.scan()
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/authentication/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/authentication/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/pshell.py b/docs/tutorials/wiki2/src/authentication/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/authentication/tutorial/templates/404.jinja2
index 37b0a16b6..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid tutorial wiki</span> <span class="smaller">(based on TurboGears 20-Minute Wiki)</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/views/auth.py b/docs/tutorials/wiki2/src/authentication/tutorial/views/auth.py
index 2b993b430..16fa616e5 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/views/auth.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/views/auth.py
@@ -11,7 +11,7 @@ from pyramid.view import (
from ..models import User
-@view_config(route_name='login', renderer='../templates/login.jinja2')
+@view_config(route_name='login', renderer='tutorial:templates/login.jinja2')
def login(request):
next_url = request.params.get('next', request.referrer)
if not next_url:
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/views/default.py b/docs/tutorials/wiki2/src/authentication/tutorial/views/default.py
index 2f0210255..d1c429950 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/views/default.py
@@ -20,7 +20,7 @@ def view_wiki(request):
next_url = request.route_url('view_page', pagename='FrontPage')
return HTTPFound(location=next_url)
-@view_config(route_name='view_page', renderer='../templates/view.jinja2')
+@view_config(route_name='view_page', renderer='tutorial:templates/view.jinja2')
def view_page(request):
pagename = request.matchdict['pagename']
page = request.dbsession.query(models.Page).filter_by(name=pagename).first()
@@ -42,7 +42,7 @@ def view_page(request):
edit_url = request.route_url('edit_page', pagename=page.name)
return dict(page=page, content=content, edit_url=edit_url)
-@view_config(route_name='edit_page', renderer='../templates/edit.jinja2')
+@view_config(route_name='edit_page', renderer='tutorial:templates/edit.jinja2')
def edit_page(request):
pagename = request.matchdict['pagename']
page = request.dbsession.query(models.Page).filter_by(name=pagename).one()
@@ -59,7 +59,7 @@ def edit_page(request):
save_url=request.route_url('edit_page', pagename=page.name),
)
-@view_config(route_name='add_page', renderer='../templates/edit.jinja2')
+@view_config(route_name='add_page', renderer='tutorial:templates/edit.jinja2')
def add_page(request):
user = request.user
if user is None or user.role not in ('editor', 'basic'):
diff --git a/docs/tutorials/wiki2/src/authentication/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/authentication/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/authentication/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/authentication/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/authorization/.coveragerc b/docs/tutorials/wiki2/src/authorization/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/authorization/.coveragerc
+++ b/docs/tutorials/wiki2/src/authorization/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/authorization/MANIFEST.in b/docs/tutorials/wiki2/src/authorization/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/authorization/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/authorization/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/authorization/development.ini b/docs/tutorials/wiki2/src/authorization/development.ini
index 8fbb5fd38..7fda4cb7b 100644
--- a/docs/tutorials/wiki2/src/authorization/development.ini
+++ b/docs/tutorials/wiki2/src/authorization/development.ini
@@ -47,7 +47,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -72,6 +72,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/authorization/production.ini b/docs/tutorials/wiki2/src/authorization/production.ini
index 9fef64f83..8e878a707 100644
--- a/docs/tutorials/wiki2/src/authorization/production.ini
+++ b/docs/tutorials/wiki2/src/authorization/production.ini
@@ -41,7 +41,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -66,6 +66,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/authorization/pytest.ini b/docs/tutorials/wiki2/src/authorization/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/authorization/pytest.ini
+++ b/docs/tutorials/wiki2/src/authorization/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/authorization/setup.py b/docs/tutorials/wiki2/src/authorization/setup.py
index f71998afc..500c5e599 100644
--- a/docs/tutorials/wiki2/src/authorization/setup.py
+++ b/docs/tutorials/wiki2/src/authorization/setup.py
@@ -13,7 +13,7 @@ requires = [
'bcrypt',
'docutils',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
+ 'pyramid',
'pyramid_debugtoolbar',
'pyramid_jinja2',
'pyramid_retry',
@@ -45,7 +45,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -57,7 +57,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/authorization/tests/__init__.py b/docs/tutorials/wiki2/src/authorization/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/authorization/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/tests.py b/docs/tutorials/wiki2/src/authorization/tests/test_it.py
index ce650ca7c..ea16534fc 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/tests.py
+++ b/docs/tutorials/wiki2/src/authorization/tests/test_it.py
@@ -1,8 +1,9 @@
import unittest
-import transaction
from pyramid import testing
+import transaction
+
def dummy_request(dbsession):
return testing.DummyRequest(dbsession=dbsession)
@@ -13,10 +14,10 @@ class BaseTest(unittest.TestCase):
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('.models')
+ self.config.include('tutorial.models')
settings = self.config.get_settings()
- from .models import (
+ from tutorial.models import (
get_engine,
get_session_factory,
get_tm_session,
@@ -28,11 +29,11 @@ class BaseTest(unittest.TestCase):
self.session = get_tm_session(session_factory, transaction.manager)
def init_database(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
Base.metadata.create_all(self.engine)
def tearDown(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
testing.tearDown()
transaction.abort()
@@ -45,13 +46,13 @@ class TestMyViewSuccessCondition(BaseTest):
super(TestMyViewSuccessCondition, self).setUp()
self.init_database()
- from .models import MyModel
+ from tutorial.models import MyModel
model = MyModel(name='one', value=55)
self.session.add(model)
def test_passing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info['one'].name, 'one')
self.assertEqual(info['project'], 'myproj')
@@ -60,6 +61,6 @@ class TestMyViewSuccessCondition(BaseTest):
class TestMyViewFailureCondition(BaseTest):
def test_failing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py b/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
index 5d4bae3d7..ce2e9f12a 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.include('.security')
config.scan()
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/authorization/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/authorization/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/pshell.py b/docs/tutorials/wiki2/src/authorization/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/authorization/tutorial/templates/404.jinja2
index 37b0a16b6..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid tutorial wiki</span> <span class="smaller">(based on TurboGears 20-Minute Wiki)</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/views/auth.py b/docs/tutorials/wiki2/src/authorization/tutorial/views/auth.py
index 2b993b430..16fa616e5 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/views/auth.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/views/auth.py
@@ -11,7 +11,7 @@ from pyramid.view import (
from ..models import User
-@view_config(route_name='login', renderer='../templates/login.jinja2')
+@view_config(route_name='login', renderer='tutorial:templates/login.jinja2')
def login(request):
next_url = request.params.get('next', request.referrer)
if not next_url:
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py b/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
index ad8491b7b..de0bcd816 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/views/default.py
@@ -15,7 +15,7 @@ def view_wiki(request):
next_url = request.route_url('view_page', pagename='FrontPage')
return HTTPFound(location=next_url)
-@view_config(route_name='view_page', renderer='../templates/view.jinja2',
+@view_config(route_name='view_page', renderer='tutorial:templates/view.jinja2',
permission='view')
def view_page(request):
page = request.context.page
@@ -35,7 +35,7 @@ def view_page(request):
edit_url = request.route_url('edit_page', pagename=page.name)
return dict(page=page, content=content, edit_url=edit_url)
-@view_config(route_name='edit_page', renderer='../templates/edit.jinja2',
+@view_config(route_name='edit_page', renderer='tutorial:templates/edit.jinja2',
permission='edit')
def edit_page(request):
page = request.context.page
@@ -49,7 +49,7 @@ def edit_page(request):
save_url=request.route_url('edit_page', pagename=page.name),
)
-@view_config(route_name='add_page', renderer='../templates/edit.jinja2',
+@view_config(route_name='add_page', renderer='tutorial:templates/edit.jinja2',
permission='create')
def add_page(request):
pagename = request.context.pagename
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/authorization/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/basiclayout/.coveragerc b/docs/tutorials/wiki2/src/basiclayout/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/basiclayout/.coveragerc
+++ b/docs/tutorials/wiki2/src/basiclayout/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/basiclayout/MANIFEST.in b/docs/tutorials/wiki2/src/basiclayout/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/basiclayout/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/basiclayout/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/basiclayout/development.ini b/docs/tutorials/wiki2/src/basiclayout/development.ini
index 564aefb56..f02c4b1b6 100644
--- a/docs/tutorials/wiki2/src/basiclayout/development.ini
+++ b/docs/tutorials/wiki2/src/basiclayout/development.ini
@@ -45,7 +45,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -70,6 +70,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/basiclayout/production.ini b/docs/tutorials/wiki2/src/basiclayout/production.ini
index 29cdda1e1..f8e83f21f 100644
--- a/docs/tutorials/wiki2/src/basiclayout/production.ini
+++ b/docs/tutorials/wiki2/src/basiclayout/production.ini
@@ -39,7 +39,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -64,6 +64,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/basiclayout/pytest.ini b/docs/tutorials/wiki2/src/basiclayout/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/basiclayout/pytest.ini
+++ b/docs/tutorials/wiki2/src/basiclayout/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/basiclayout/setup.py b/docs/tutorials/wiki2/src/basiclayout/setup.py
index 746012a74..5e7a0111d 100644
--- a/docs/tutorials/wiki2/src/basiclayout/setup.py
+++ b/docs/tutorials/wiki2/src/basiclayout/setup.py
@@ -9,17 +9,17 @@ with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
requires = [
- 'alembic',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
- 'pyramid_debugtoolbar',
+ 'pyramid',
'pyramid_jinja2',
+ 'pyramid_debugtoolbar',
+ 'waitress',
+ 'alembic',
'pyramid_retry',
'pyramid_tm',
'SQLAlchemy',
'transaction',
'zope.sqlalchemy',
- 'waitress',
]
tests_require = [
@@ -43,7 +43,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -55,7 +55,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/basiclayout/tests/__init__.py b/docs/tutorials/wiki2/src/basiclayout/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/basiclayout/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py b/docs/tutorials/wiki2/src/basiclayout/tests/test_it.py
index ce650ca7c..ea16534fc 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/tests.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tests/test_it.py
@@ -1,8 +1,9 @@
import unittest
-import transaction
from pyramid import testing
+import transaction
+
def dummy_request(dbsession):
return testing.DummyRequest(dbsession=dbsession)
@@ -13,10 +14,10 @@ class BaseTest(unittest.TestCase):
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('.models')
+ self.config.include('tutorial.models')
settings = self.config.get_settings()
- from .models import (
+ from tutorial.models import (
get_engine,
get_session_factory,
get_tm_session,
@@ -28,11 +29,11 @@ class BaseTest(unittest.TestCase):
self.session = get_tm_session(session_factory, transaction.manager)
def init_database(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
Base.metadata.create_all(self.engine)
def tearDown(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
testing.tearDown()
transaction.abort()
@@ -45,13 +46,13 @@ class TestMyViewSuccessCondition(BaseTest):
super(TestMyViewSuccessCondition, self).setUp()
self.init_database()
- from .models import MyModel
+ from tutorial.models import MyModel
model = MyModel(name='one', value=55)
self.session.add(model)
def test_passing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info['one'].name, 'one')
self.assertEqual(info['project'], 'myproj')
@@ -60,6 +61,6 @@ class TestMyViewSuccessCondition(BaseTest):
class TestMyViewFailureCondition(BaseTest):
def test_failing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py
index 28bd1f80d..5c2ba5cc0 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.scan()
return config.make_wsgi_app()
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/pshell.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/404.jinja2
index 1917f83c7..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy scaffold</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2 b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2
index 5d4313fe2..f5a086f0e 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2
@@ -8,7 +8,7 @@
<meta name="author" content="Pylons Project">
<link rel="shortcut icon" href="{{request.static_url('tutorial:static/pyramid-16x16.png')}}">
- <title>Cookiecutter Alchemy project for the Pyramid Web Framework</title>
+ <title>Cookiecutter Starter project for the Pyramid Web Framework</title>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.jinja2 b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.jinja2
index d8b0a4232..f2e7283f8 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.jinja2
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/mytemplate.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy project</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead">Welcome to <span class="font-normal">{{project}}</span>, a&nbsp;Pyramid application generated&nbsp;by<br><span class="font-normal">Cookiecutter</span>.</p>
</div>
-{% endblock content %} \ No newline at end of file
+{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py
index ef69ff895..094b2f303 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py
@@ -1,12 +1,12 @@
-from pyramid.response import Response
from pyramid.view import view_config
+from pyramid.response import Response
from sqlalchemy.exc import DBAPIError
from .. import models
-@view_config(route_name='home', renderer='../templates/mytemplate.jinja2')
+@view_config(route_name='home', renderer='tutorial:templates/mytemplate.jinja2')
def my_view(request):
try:
query = request.dbsession.query(models.MyModel)
@@ -21,7 +21,7 @@ Pyramid is having a problem using your SQL database. The problem
might be caused by one of the following things:
1. You may need to initialize your database tables with `alembic`.
- Check your README.txt for description and try to run it.
+ Check your README.txt for descriptions and try to run it.
2. Your database server may not be running. Check that the
database server referred to by the "sqlalchemy.url" setting in
diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/installation/.coveragerc b/docs/tutorials/wiki2/src/installation/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/installation/.coveragerc
+++ b/docs/tutorials/wiki2/src/installation/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/installation/MANIFEST.in b/docs/tutorials/wiki2/src/installation/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/installation/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/installation/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/installation/development.ini b/docs/tutorials/wiki2/src/installation/development.ini
index 564aefb56..f02c4b1b6 100644
--- a/docs/tutorials/wiki2/src/installation/development.ini
+++ b/docs/tutorials/wiki2/src/installation/development.ini
@@ -45,7 +45,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -70,6 +70,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/installation/production.ini b/docs/tutorials/wiki2/src/installation/production.ini
index 29cdda1e1..f8e83f21f 100644
--- a/docs/tutorials/wiki2/src/installation/production.ini
+++ b/docs/tutorials/wiki2/src/installation/production.ini
@@ -39,7 +39,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -64,6 +64,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/installation/pytest.ini b/docs/tutorials/wiki2/src/installation/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/installation/pytest.ini
+++ b/docs/tutorials/wiki2/src/installation/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/installation/setup.py b/docs/tutorials/wiki2/src/installation/setup.py
index 746012a74..5e7a0111d 100644
--- a/docs/tutorials/wiki2/src/installation/setup.py
+++ b/docs/tutorials/wiki2/src/installation/setup.py
@@ -9,17 +9,17 @@ with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
requires = [
- 'alembic',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
- 'pyramid_debugtoolbar',
+ 'pyramid',
'pyramid_jinja2',
+ 'pyramid_debugtoolbar',
+ 'waitress',
+ 'alembic',
'pyramid_retry',
'pyramid_tm',
'SQLAlchemy',
'transaction',
'zope.sqlalchemy',
- 'waitress',
]
tests_require = [
@@ -43,7 +43,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -55,7 +55,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/installation/tests/__init__.py b/docs/tutorials/wiki2/src/installation/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/installation/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/tests.py b/docs/tutorials/wiki2/src/installation/tests/test_it.py
index ce650ca7c..ea16534fc 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/tests.py
+++ b/docs/tutorials/wiki2/src/installation/tests/test_it.py
@@ -1,8 +1,9 @@
import unittest
-import transaction
from pyramid import testing
+import transaction
+
def dummy_request(dbsession):
return testing.DummyRequest(dbsession=dbsession)
@@ -13,10 +14,10 @@ class BaseTest(unittest.TestCase):
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('.models')
+ self.config.include('tutorial.models')
settings = self.config.get_settings()
- from .models import (
+ from tutorial.models import (
get_engine,
get_session_factory,
get_tm_session,
@@ -28,11 +29,11 @@ class BaseTest(unittest.TestCase):
self.session = get_tm_session(session_factory, transaction.manager)
def init_database(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
Base.metadata.create_all(self.engine)
def tearDown(self):
- from .models.meta import Base
+ from tutorial.models.meta import Base
testing.tearDown()
transaction.abort()
@@ -45,13 +46,13 @@ class TestMyViewSuccessCondition(BaseTest):
super(TestMyViewSuccessCondition, self).setUp()
self.init_database()
- from .models import MyModel
+ from tutorial.models import MyModel
model = MyModel(name='one', value=55)
self.session.add(model)
def test_passing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info['one'].name, 'one')
self.assertEqual(info['project'], 'myproj')
@@ -60,6 +61,6 @@ class TestMyViewSuccessCondition(BaseTest):
class TestMyViewFailureCondition(BaseTest):
def test_failing_view(self):
- from .views.default import my_view
+ from tutorial.views.default import my_view
info = my_view(dummy_request(self.session))
self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/__init__.py b/docs/tutorials/wiki2/src/installation/tutorial/__init__.py
index 28bd1f80d..5c2ba5cc0 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/installation/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.scan()
return config.make_wsgi_app()
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/pshell.py b/docs/tutorials/wiki2/src/installation/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/installation/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/installation/tutorial/templates/404.jinja2
index 1917f83c7..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/installation/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy scaffold</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/templates/layout.jinja2 b/docs/tutorials/wiki2/src/installation/tutorial/templates/layout.jinja2
index 5d4313fe2..f5a086f0e 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/templates/layout.jinja2
+++ b/docs/tutorials/wiki2/src/installation/tutorial/templates/layout.jinja2
@@ -8,7 +8,7 @@
<meta name="author" content="Pylons Project">
<link rel="shortcut icon" href="{{request.static_url('tutorial:static/pyramid-16x16.png')}}">
- <title>Cookiecutter Alchemy project for the Pyramid Web Framework</title>
+ <title>Cookiecutter Starter project for the Pyramid Web Framework</title>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2
index d8b0a4232..f2e7283f8 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2
+++ b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy project</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead">Welcome to <span class="font-normal">{{project}}</span>, a&nbsp;Pyramid application generated&nbsp;by<br><span class="font-normal">Cookiecutter</span>.</p>
</div>
-{% endblock content %} \ No newline at end of file
+{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/views/default.py b/docs/tutorials/wiki2/src/installation/tutorial/views/default.py
index ef69ff895..094b2f303 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/installation/tutorial/views/default.py
@@ -1,12 +1,12 @@
-from pyramid.response import Response
from pyramid.view import view_config
+from pyramid.response import Response
from sqlalchemy.exc import DBAPIError
from .. import models
-@view_config(route_name='home', renderer='../templates/mytemplate.jinja2')
+@view_config(route_name='home', renderer='tutorial:templates/mytemplate.jinja2')
def my_view(request):
try:
query = request.dbsession.query(models.MyModel)
@@ -21,7 +21,7 @@ Pyramid is having a problem using your SQL database. The problem
might be caused by one of the following things:
1. You may need to initialize your database tables with `alembic`.
- Check your README.txt for description and try to run it.
+ Check your README.txt for descriptions and try to run it.
2. Your database server may not be running. Check that the
database server referred to by the "sqlalchemy.url" setting in
diff --git a/docs/tutorials/wiki2/src/installation/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/installation/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/installation/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/installation/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/models/.coveragerc b/docs/tutorials/wiki2/src/models/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/models/.coveragerc
+++ b/docs/tutorials/wiki2/src/models/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/models/MANIFEST.in b/docs/tutorials/wiki2/src/models/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/models/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/models/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/models/development.ini b/docs/tutorials/wiki2/src/models/development.ini
index 564aefb56..f02c4b1b6 100644
--- a/docs/tutorials/wiki2/src/models/development.ini
+++ b/docs/tutorials/wiki2/src/models/development.ini
@@ -45,7 +45,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -70,6 +70,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/models/production.ini b/docs/tutorials/wiki2/src/models/production.ini
index 29cdda1e1..f8e83f21f 100644
--- a/docs/tutorials/wiki2/src/models/production.ini
+++ b/docs/tutorials/wiki2/src/models/production.ini
@@ -39,7 +39,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -64,6 +64,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/models/pytest.ini b/docs/tutorials/wiki2/src/models/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/models/pytest.ini
+++ b/docs/tutorials/wiki2/src/models/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/models/setup.py b/docs/tutorials/wiki2/src/models/setup.py
index b9dc9d93f..60234751a 100644
--- a/docs/tutorials/wiki2/src/models/setup.py
+++ b/docs/tutorials/wiki2/src/models/setup.py
@@ -12,7 +12,7 @@ requires = [
'alembic',
'bcrypt',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
+ 'pyramid',
'pyramid_debugtoolbar',
'pyramid_jinja2',
'pyramid_retry',
@@ -44,7 +44,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -56,7 +56,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/models/tests/__init__.py b/docs/tutorials/wiki2/src/models/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/models/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/models/tests/test_it.py b/docs/tutorials/wiki2/src/models/tests/test_it.py
new file mode 100644
index 000000000..ea16534fc
--- /dev/null
+++ b/docs/tutorials/wiki2/src/models/tests/test_it.py
@@ -0,0 +1,66 @@
+import unittest
+
+from pyramid import testing
+
+import transaction
+
+
+def dummy_request(dbsession):
+ return testing.DummyRequest(dbsession=dbsession)
+
+
+class BaseTest(unittest.TestCase):
+ def setUp(self):
+ self.config = testing.setUp(settings={
+ 'sqlalchemy.url': 'sqlite:///:memory:'
+ })
+ self.config.include('tutorial.models')
+ settings = self.config.get_settings()
+
+ from tutorial.models import (
+ get_engine,
+ get_session_factory,
+ get_tm_session,
+ )
+
+ self.engine = get_engine(settings)
+ session_factory = get_session_factory(self.engine)
+
+ self.session = get_tm_session(session_factory, transaction.manager)
+
+ def init_database(self):
+ from tutorial.models.meta import Base
+ Base.metadata.create_all(self.engine)
+
+ def tearDown(self):
+ from tutorial.models.meta import Base
+
+ testing.tearDown()
+ transaction.abort()
+ Base.metadata.drop_all(self.engine)
+
+
+class TestMyViewSuccessCondition(BaseTest):
+
+ def setUp(self):
+ super(TestMyViewSuccessCondition, self).setUp()
+ self.init_database()
+
+ from tutorial.models import MyModel
+
+ model = MyModel(name='one', value=55)
+ self.session.add(model)
+
+ def test_passing_view(self):
+ from tutorial.views.default import my_view
+ info = my_view(dummy_request(self.session))
+ self.assertEqual(info['one'].name, 'one')
+ self.assertEqual(info['project'], 'myproj')
+
+
+class TestMyViewFailureCondition(BaseTest):
+
+ def test_failing_view(self):
+ from tutorial.views.default import my_view
+ info = my_view(dummy_request(self.session))
+ self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/models/tutorial/__init__.py b/docs/tutorials/wiki2/src/models/tutorial/__init__.py
index 28bd1f80d..5c2ba5cc0 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.scan()
return config.make_wsgi_app()
diff --git a/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/models/tutorial/pshell.py b/docs/tutorials/wiki2/src/models/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/models/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/models/tutorial/templates/404.jinja2
index 1917f83c7..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/models/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy scaffold</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/models/tutorial/templates/layout.jinja2 b/docs/tutorials/wiki2/src/models/tutorial/templates/layout.jinja2
index 5d4313fe2..f5a086f0e 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/templates/layout.jinja2
+++ b/docs/tutorials/wiki2/src/models/tutorial/templates/layout.jinja2
@@ -8,7 +8,7 @@
<meta name="author" content="Pylons Project">
<link rel="shortcut icon" href="{{request.static_url('tutorial:static/pyramid-16x16.png')}}">
- <title>Cookiecutter Alchemy project for the Pyramid Web Framework</title>
+ <title>Cookiecutter Starter project for the Pyramid Web Framework</title>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
diff --git a/docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.jinja2 b/docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.jinja2
index d8b0a4232..f2e7283f8 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.jinja2
+++ b/docs/tutorials/wiki2/src/models/tutorial/templates/mytemplate.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy project</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead">Welcome to <span class="font-normal">{{project}}</span>, a&nbsp;Pyramid application generated&nbsp;by<br><span class="font-normal">Cookiecutter</span>.</p>
</div>
-{% endblock content %} \ No newline at end of file
+{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/models/tutorial/tests.py b/docs/tutorials/wiki2/src/models/tutorial/tests.py
deleted file mode 100644
index ce650ca7c..000000000
--- a/docs/tutorials/wiki2/src/models/tutorial/tests.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import unittest
-import transaction
-
-from pyramid import testing
-
-
-def dummy_request(dbsession):
- return testing.DummyRequest(dbsession=dbsession)
-
-
-class BaseTest(unittest.TestCase):
- def setUp(self):
- self.config = testing.setUp(settings={
- 'sqlalchemy.url': 'sqlite:///:memory:'
- })
- self.config.include('.models')
- settings = self.config.get_settings()
-
- from .models import (
- get_engine,
- get_session_factory,
- get_tm_session,
- )
-
- self.engine = get_engine(settings)
- session_factory = get_session_factory(self.engine)
-
- self.session = get_tm_session(session_factory, transaction.manager)
-
- def init_database(self):
- from .models.meta import Base
- Base.metadata.create_all(self.engine)
-
- def tearDown(self):
- from .models.meta import Base
-
- testing.tearDown()
- transaction.abort()
- Base.metadata.drop_all(self.engine)
-
-
-class TestMyViewSuccessCondition(BaseTest):
-
- def setUp(self):
- super(TestMyViewSuccessCondition, self).setUp()
- self.init_database()
-
- from .models import MyModel
-
- model = MyModel(name='one', value=55)
- self.session.add(model)
-
- def test_passing_view(self):
- from .views.default import my_view
- info = my_view(dummy_request(self.session))
- self.assertEqual(info['one'].name, 'one')
- self.assertEqual(info['project'], 'myproj')
-
-
-class TestMyViewFailureCondition(BaseTest):
-
- def test_failing_view(self):
- from .views.default import my_view
- info = my_view(dummy_request(self.session))
- self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/models/tutorial/views/default.py b/docs/tutorials/wiki2/src/models/tutorial/views/default.py
index ef69ff895..094b2f303 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/views/default.py
@@ -1,12 +1,12 @@
-from pyramid.response import Response
from pyramid.view import view_config
+from pyramid.response import Response
from sqlalchemy.exc import DBAPIError
from .. import models
-@view_config(route_name='home', renderer='../templates/mytemplate.jinja2')
+@view_config(route_name='home', renderer='tutorial:templates/mytemplate.jinja2')
def my_view(request):
try:
query = request.dbsession.query(models.MyModel)
@@ -21,7 +21,7 @@ Pyramid is having a problem using your SQL database. The problem
might be caused by one of the following things:
1. You may need to initialize your database tables with `alembic`.
- Check your README.txt for description and try to run it.
+ Check your README.txt for descriptions and try to run it.
2. Your database server may not be running. Check that the
database server referred to by the "sqlalchemy.url" setting in
diff --git a/docs/tutorials/wiki2/src/models/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/models/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/models/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/models/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/tests/.coveragerc b/docs/tutorials/wiki2/src/tests/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/tests/.coveragerc
+++ b/docs/tutorials/wiki2/src/tests/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/tests/MANIFEST.in b/docs/tutorials/wiki2/src/tests/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/tests/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/tests/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/tests/development.ini b/docs/tutorials/wiki2/src/tests/development.ini
index 8fbb5fd38..7fda4cb7b 100644
--- a/docs/tutorials/wiki2/src/tests/development.ini
+++ b/docs/tutorials/wiki2/src/tests/development.ini
@@ -47,7 +47,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -72,6 +72,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/tests/production.ini b/docs/tutorials/wiki2/src/tests/production.ini
index 9fef64f83..8e878a707 100644
--- a/docs/tutorials/wiki2/src/tests/production.ini
+++ b/docs/tutorials/wiki2/src/tests/production.ini
@@ -41,7 +41,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -66,6 +66,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/tests/pytest.ini b/docs/tutorials/wiki2/src/tests/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/tests/pytest.ini
+++ b/docs/tutorials/wiki2/src/tests/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/tests/setup.py b/docs/tutorials/wiki2/src/tests/setup.py
index f71998afc..500c5e599 100644
--- a/docs/tutorials/wiki2/src/tests/setup.py
+++ b/docs/tutorials/wiki2/src/tests/setup.py
@@ -13,7 +13,7 @@ requires = [
'bcrypt',
'docutils',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
+ 'pyramid',
'pyramid_debugtoolbar',
'pyramid_jinja2',
'pyramid_retry',
@@ -45,7 +45,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -57,7 +57,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/tests/tests/__init__.py b/docs/tutorials/wiki2/src/tests/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/tests/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_functional.py b/docs/tutorials/wiki2/src/tests/tests/test_functional.py
index 0250e71c9..0250e71c9 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_functional.py
+++ b/docs/tutorials/wiki2/src/tests/tests/test_functional.py
diff --git a/docs/tutorials/wiki2/src/tests/tests/test_initdb.py b/docs/tutorials/wiki2/src/tests/tests/test_initdb.py
new file mode 100644
index 000000000..a66945ccc
--- /dev/null
+++ b/docs/tutorials/wiki2/src/tests/tests/test_initdb.py
@@ -0,0 +1,10 @@
+import os
+import unittest
+
+
+class TestInitializeDB(unittest.TestCase):
+
+ def test_usage(self):
+ from tutorial.scripts.initialize_db import main
+ with self.assertRaises(SystemExit):
+ main(argv=['foo'])
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_security.py b/docs/tutorials/wiki2/src/tests/tests/test_security.py
index cbec6420d..9a1455ef9 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_security.py
+++ b/docs/tutorials/wiki2/src/tests/tests/test_security.py
@@ -8,16 +8,16 @@ class TestMyAuthenticationPolicy(unittest.TestCase):
request = DummyRequest()
request.user = None
- from ..security import MyAuthenticationPolicy
+ from tutorial.security import MyAuthenticationPolicy
policy = MyAuthenticationPolicy(None)
self.assertEqual(policy.authenticated_userid(request), None)
def test_authenticated_user(self):
- from ..models import User
+ from tutorial.models import User
request = DummyRequest()
request.user = User()
request.user.id = 'foo'
- from ..security import MyAuthenticationPolicy
+ from tutorial.security import MyAuthenticationPolicy
policy = MyAuthenticationPolicy(None)
self.assertEqual(policy.authenticated_userid(request), 'foo')
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_user_model.py b/docs/tutorials/wiki2/src/tests/tests/test_user_model.py
index 9490ac990..21904da6b 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_user_model.py
+++ b/docs/tutorials/wiki2/src/tests/tests/test_user_model.py
@@ -7,12 +7,12 @@ from pyramid import testing
class BaseTest(unittest.TestCase):
def setUp(self):
- from ..models import get_tm_session
+ from tutorial.models import get_tm_session
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('..models')
- self.config.include('..routes')
+ self.config.include('tutorial.models')
+ self.config.include('tutorial.routes')
session_factory = self.config.registry['dbsession_factory']
self.session = get_tm_session(session_factory, transaction.manager)
@@ -20,7 +20,7 @@ class BaseTest(unittest.TestCase):
self.init_database()
def init_database(self):
- from ..models.meta import Base
+ from tutorial.models.meta import Base
session_factory = self.config.registry['dbsession_factory']
engine = session_factory.kw['bind']
Base.metadata.create_all(engine)
@@ -30,7 +30,7 @@ class BaseTest(unittest.TestCase):
transaction.abort()
def makeUser(self, name, role):
- from ..models import User
+ from tutorial.models import User
return User(name=name, role=role)
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_views.py b/docs/tutorials/wiki2/src/tests/tests/test_views.py
index 2c945ab33..5c17457dd 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_views.py
+++ b/docs/tutorials/wiki2/src/tests/tests/test_views.py
@@ -10,12 +10,12 @@ def dummy_request(dbsession):
class BaseTest(unittest.TestCase):
def setUp(self):
- from ..models import get_tm_session
+ from tutorial.models import get_tm_session
self.config = testing.setUp(settings={
'sqlalchemy.url': 'sqlite:///:memory:'
})
- self.config.include('..models')
- self.config.include('..routes')
+ self.config.include('tutorial.models')
+ self.config.include('tutorial.routes')
session_factory = self.config.registry['dbsession_factory']
self.session = get_tm_session(session_factory, transaction.manager)
@@ -23,7 +23,7 @@ class BaseTest(unittest.TestCase):
self.init_database()
def init_database(self):
- from ..models.meta import Base
+ from tutorial.models.meta import Base
session_factory = self.config.registry['dbsession_factory']
engine = session_factory.kw['bind']
Base.metadata.create_all(engine)
@@ -33,20 +33,20 @@ class BaseTest(unittest.TestCase):
transaction.abort()
def makeUser(self, name, role, password='dummy'):
- from ..models import User
+ from tutorial.models import User
user = User(name=name, role=role)
user.set_password(password)
return user
def makePage(self, name, data, creator):
- from ..models import Page
+ from tutorial.models import Page
return Page(name=name, data=data, creator=creator)
class ViewWikiTests(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
- self.config.include('..routes')
+ self.config.include('tutorial.routes')
def tearDown(self):
testing.tearDown()
@@ -67,7 +67,7 @@ class ViewPageTests(BaseTest):
return view_page(request)
def test_it(self):
- from ..routes import PageResource
+ from tutorial.routes import PageResource
# add a page to the db
user = self.makeUser('foo', 'editor')
@@ -99,8 +99,8 @@ class AddPageTests(BaseTest):
return add_page(request)
def test_it_pageexists(self):
- from ..models import Page
- from ..routes import NewPage
+ from tutorial.models import Page
+ from tutorial.routes import NewPage
request = testing.DummyRequest({'form.submitted': True,
'body': 'Hello yo!'},
dbsession=self.session)
@@ -111,7 +111,7 @@ class AddPageTests(BaseTest):
self.assertGreater(pagecount, 0)
def test_it_notsubmitted(self):
- from ..routes import NewPage
+ from tutorial.routes import NewPage
request = dummy_request(self.session)
request.user = self.makeUser('foo', 'editor')
request.context = NewPage('AnotherPage')
@@ -121,8 +121,8 @@ class AddPageTests(BaseTest):
'http://example.com/add_page/AnotherPage')
def test_it_submitted(self):
- from ..models import Page
- from ..routes import NewPage
+ from tutorial.models import Page
+ from tutorial.routes import NewPage
request = testing.DummyRequest({'form.submitted': True,
'body': 'Hello yo!'},
dbsession=self.session)
@@ -139,7 +139,7 @@ class EditPageTests(BaseTest):
return edit_page(request)
def makeContext(self, page):
- from ..routes import PageResource
+ from tutorial.routes import PageResource
return PageResource(page)
def test_it_notsubmitted(self):
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/__init__.py b/docs/tutorials/wiki2/src/tests/tutorial/__init__.py
index 5d4bae3d7..ce2e9f12a 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.include('.security')
config.scan()
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/tests/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/tests/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/tests/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/tests/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/pshell.py b/docs/tutorials/wiki2/src/tests/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/tests/tutorial/templates/404.jinja2
index 37b0a16b6..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/tests/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid tutorial wiki</span> <span class="smaller">(based on TurboGears 20-Minute Wiki)</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_initdb.py b/docs/tutorials/wiki2/src/tests/tutorial/tests/test_initdb.py
deleted file mode 100644
index 72fbff04b..000000000
--- a/docs/tutorials/wiki2/src/tests/tutorial/tests/test_initdb.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import os
-import unittest
-
-
-class TestInitializeDB(unittest.TestCase):
-
- def test_usage(self):
- from ..scripts.initialize_db import main
- with self.assertRaises(SystemExit):
- main(argv=['foo'])
-
- def test_run(self):
- from ..scripts.initialize_db import main
- main(argv=['foo', 'development.ini'])
- self.assertTrue(os.path.exists('tutorial.sqlite'))
- os.remove('tutorial.sqlite')
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/views/auth.py b/docs/tutorials/wiki2/src/tests/tutorial/views/auth.py
index 2b993b430..16fa616e5 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/views/auth.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/views/auth.py
@@ -11,7 +11,7 @@ from pyramid.view import (
from ..models import User
-@view_config(route_name='login', renderer='../templates/login.jinja2')
+@view_config(route_name='login', renderer='tutorial:templates/login.jinja2')
def login(request):
next_url = request.params.get('next', request.referrer)
if not next_url:
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/views/default.py b/docs/tutorials/wiki2/src/tests/tutorial/views/default.py
index ad8491b7b..de0bcd816 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/views/default.py
@@ -15,7 +15,7 @@ def view_wiki(request):
next_url = request.route_url('view_page', pagename='FrontPage')
return HTTPFound(location=next_url)
-@view_config(route_name='view_page', renderer='../templates/view.jinja2',
+@view_config(route_name='view_page', renderer='tutorial:templates/view.jinja2',
permission='view')
def view_page(request):
page = request.context.page
@@ -35,7 +35,7 @@ def view_page(request):
edit_url = request.route_url('edit_page', pagename=page.name)
return dict(page=page, content=content, edit_url=edit_url)
-@view_config(route_name='edit_page', renderer='../templates/edit.jinja2',
+@view_config(route_name='edit_page', renderer='tutorial:templates/edit.jinja2',
permission='edit')
def edit_page(request):
page = request.context.page
@@ -49,7 +49,7 @@ def edit_page(request):
save_url=request.route_url('edit_page', pagename=page.name),
)
-@view_config(route_name='add_page', renderer='../templates/edit.jinja2',
+@view_config(route_name='add_page', renderer='tutorial:templates/edit.jinja2',
permission='create')
def add_page(request):
pagename = request.context.pagename
diff --git a/docs/tutorials/wiki2/src/tests/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/tests/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/tests/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/tests/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/src/views/.coveragerc b/docs/tutorials/wiki2/src/views/.coveragerc
index a1d87d03d..5db0e79cf 100644
--- a/docs/tutorials/wiki2/src/views/.coveragerc
+++ b/docs/tutorials/wiki2/src/views/.coveragerc
@@ -1,3 +1,2 @@
[run]
source = tutorial
-omit = tutorial/test*
diff --git a/docs/tutorials/wiki2/src/views/MANIFEST.in b/docs/tutorials/wiki2/src/views/MANIFEST.in
index 05cc195d9..b4624fd1c 100644
--- a/docs/tutorials/wiki2/src/views/MANIFEST.in
+++ b/docs/tutorials/wiki2/src/views/MANIFEST.in
@@ -1,2 +1,5 @@
include *.txt *.ini *.cfg *.rst
recursive-include tutorial *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2
+recursive-include tests *
+recursive-exclude * __pycache__
+recursive-exclude * *.py[co]
diff --git a/docs/tutorials/wiki2/src/views/development.ini b/docs/tutorials/wiki2/src/views/development.ini
index 564aefb56..f02c4b1b6 100644
--- a/docs/tutorials/wiki2/src/views/development.ini
+++ b/docs/tutorials/wiki2/src/views/development.ini
@@ -45,7 +45,7 @@ listen = localhost:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -70,6 +70,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/views/production.ini b/docs/tutorials/wiki2/src/views/production.ini
index 29cdda1e1..f8e83f21f 100644
--- a/docs/tutorials/wiki2/src/views/production.ini
+++ b/docs/tutorials/wiki2/src/views/production.ini
@@ -39,7 +39,7 @@ listen = *:6543
###
[loggers]
-keys = root, tutorial, sqlalchemy
+keys = root, tutorial, sqlalchemy, alembic
[handlers]
keys = console
@@ -64,6 +64,11 @@ qualname = sqlalchemy.engine
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
+[logger_alembic]
+level = WARN
+handlers =
+qualname = alembic
+
[handler_console]
class = StreamHandler
args = (sys.stderr,)
diff --git a/docs/tutorials/wiki2/src/views/pytest.ini b/docs/tutorials/wiki2/src/views/pytest.ini
index a3489cdf8..42c3259f9 100644
--- a/docs/tutorials/wiki2/src/views/pytest.ini
+++ b/docs/tutorials/wiki2/src/views/pytest.ini
@@ -1,3 +1,6 @@
[pytest]
-testpaths = tutorial
-python_files = test*.py
+addopts = --strict
+
+testpaths =
+ tutorial
+ tests
diff --git a/docs/tutorials/wiki2/src/views/setup.py b/docs/tutorials/wiki2/src/views/setup.py
index f71998afc..500c5e599 100644
--- a/docs/tutorials/wiki2/src/views/setup.py
+++ b/docs/tutorials/wiki2/src/views/setup.py
@@ -13,7 +13,7 @@ requires = [
'bcrypt',
'docutils',
'plaster_pastedeploy',
- 'pyramid >= 1.9',
+ 'pyramid',
'pyramid_debugtoolbar',
'pyramid_jinja2',
'pyramid_retry',
@@ -45,7 +45,7 @@ setup(
author_email='',
url='',
keywords='web pyramid pylons',
- packages=find_packages(),
+ packages=find_packages(exclude=['tests']),
include_package_data=True,
zip_safe=False,
extras_require={
@@ -57,7 +57,7 @@ setup(
'main = tutorial:main',
],
'console_scripts': [
- 'initialize_tutorial_db = tutorial.scripts.initialize_db:main',
+ 'initialize_tutorial_db=tutorial.scripts.initialize_db:main',
],
},
)
diff --git a/docs/tutorials/wiki2/src/views/tests/__init__.py b/docs/tutorials/wiki2/src/views/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/tutorials/wiki2/src/views/tests/__init__.py
diff --git a/docs/tutorials/wiki2/src/views/tests/test_it.py b/docs/tutorials/wiki2/src/views/tests/test_it.py
new file mode 100644
index 000000000..ea16534fc
--- /dev/null
+++ b/docs/tutorials/wiki2/src/views/tests/test_it.py
@@ -0,0 +1,66 @@
+import unittest
+
+from pyramid import testing
+
+import transaction
+
+
+def dummy_request(dbsession):
+ return testing.DummyRequest(dbsession=dbsession)
+
+
+class BaseTest(unittest.TestCase):
+ def setUp(self):
+ self.config = testing.setUp(settings={
+ 'sqlalchemy.url': 'sqlite:///:memory:'
+ })
+ self.config.include('tutorial.models')
+ settings = self.config.get_settings()
+
+ from tutorial.models import (
+ get_engine,
+ get_session_factory,
+ get_tm_session,
+ )
+
+ self.engine = get_engine(settings)
+ session_factory = get_session_factory(self.engine)
+
+ self.session = get_tm_session(session_factory, transaction.manager)
+
+ def init_database(self):
+ from tutorial.models.meta import Base
+ Base.metadata.create_all(self.engine)
+
+ def tearDown(self):
+ from tutorial.models.meta import Base
+
+ testing.tearDown()
+ transaction.abort()
+ Base.metadata.drop_all(self.engine)
+
+
+class TestMyViewSuccessCondition(BaseTest):
+
+ def setUp(self):
+ super(TestMyViewSuccessCondition, self).setUp()
+ self.init_database()
+
+ from tutorial.models import MyModel
+
+ model = MyModel(name='one', value=55)
+ self.session.add(model)
+
+ def test_passing_view(self):
+ from tutorial.views.default import my_view
+ info = my_view(dummy_request(self.session))
+ self.assertEqual(info['one'].name, 'one')
+ self.assertEqual(info['project'], 'myproj')
+
+
+class TestMyViewFailureCondition(BaseTest):
+
+ def test_failing_view(self):
+ from tutorial.views.default import my_view
+ info = my_view(dummy_request(self.session))
+ self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/views/tutorial/__init__.py b/docs/tutorials/wiki2/src/views/tutorial/__init__.py
index 28bd1f80d..5c2ba5cc0 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/views/tutorial/__init__.py
@@ -5,8 +5,8 @@ def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
with Configurator(settings=settings) as config:
- config.include('pyramid_jinja2')
config.include('.models')
+ config.include('pyramid_jinja2')
config.include('.routes')
config.scan()
return config.make_wsgi_app()
diff --git a/docs/tutorials/wiki2/src/views/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/views/tutorial/alembic/script.py.mako
index 2c0156303..535780d13 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/alembic/script.py.mako
+++ b/docs/tutorials/wiki2/src/views/tutorial/alembic/script.py.mako
@@ -15,10 +15,8 @@ down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
-
def upgrade():
${upgrades if upgrades else "pass"}
-
def downgrade():
${downgrades if downgrades else "pass"}
diff --git a/docs/tutorials/wiki2/src/views/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/views/tutorial/alembic/versions/README.txt
index 09ed32c8d..b0d704d6a 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/alembic/versions/README.txt
+++ b/docs/tutorials/wiki2/src/views/tutorial/alembic/versions/README.txt
@@ -1 +1 @@
-Placeholder for alembic versions \ No newline at end of file
+Placeholder for alembic versions
diff --git a/docs/tutorials/wiki2/src/views/tutorial/pshell.py b/docs/tutorials/wiki2/src/views/tutorial/pshell.py
index 108c04d5e..b0847ee90 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/pshell.py
+++ b/docs/tutorials/wiki2/src/views/tutorial/pshell.py
@@ -1,5 +1,6 @@
from . import models
+
def setup(env):
request = env['request']
diff --git a/docs/tutorials/wiki2/src/views/tutorial/templates/404.jinja2 b/docs/tutorials/wiki2/src/views/tutorial/templates/404.jinja2
index 37b0a16b6..aaf12413f 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/templates/404.jinja2
+++ b/docs/tutorials/wiki2/src/views/tutorial/templates/404.jinja2
@@ -2,7 +2,7 @@
{% block content %}
<div class="content">
- <h1><span class="font-semi-bold">Pyramid tutorial wiki</span> <span class="smaller">(based on TurboGears 20-Minute Wiki)</span></h1>
+ <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1>
<p class="lead"><span class="font-semi-bold">404</span> Page Not Found</p>
</div>
{% endblock content %}
diff --git a/docs/tutorials/wiki2/src/views/tutorial/tests.py b/docs/tutorials/wiki2/src/views/tutorial/tests.py
deleted file mode 100644
index ce650ca7c..000000000
--- a/docs/tutorials/wiki2/src/views/tutorial/tests.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import unittest
-import transaction
-
-from pyramid import testing
-
-
-def dummy_request(dbsession):
- return testing.DummyRequest(dbsession=dbsession)
-
-
-class BaseTest(unittest.TestCase):
- def setUp(self):
- self.config = testing.setUp(settings={
- 'sqlalchemy.url': 'sqlite:///:memory:'
- })
- self.config.include('.models')
- settings = self.config.get_settings()
-
- from .models import (
- get_engine,
- get_session_factory,
- get_tm_session,
- )
-
- self.engine = get_engine(settings)
- session_factory = get_session_factory(self.engine)
-
- self.session = get_tm_session(session_factory, transaction.manager)
-
- def init_database(self):
- from .models.meta import Base
- Base.metadata.create_all(self.engine)
-
- def tearDown(self):
- from .models.meta import Base
-
- testing.tearDown()
- transaction.abort()
- Base.metadata.drop_all(self.engine)
-
-
-class TestMyViewSuccessCondition(BaseTest):
-
- def setUp(self):
- super(TestMyViewSuccessCondition, self).setUp()
- self.init_database()
-
- from .models import MyModel
-
- model = MyModel(name='one', value=55)
- self.session.add(model)
-
- def test_passing_view(self):
- from .views.default import my_view
- info = my_view(dummy_request(self.session))
- self.assertEqual(info['one'].name, 'one')
- self.assertEqual(info['project'], 'myproj')
-
-
-class TestMyViewFailureCondition(BaseTest):
-
- def test_failing_view(self):
- from .views.default import my_view
- info = my_view(dummy_request(self.session))
- self.assertEqual(info.status_int, 500)
diff --git a/docs/tutorials/wiki2/src/views/tutorial/views/default.py b/docs/tutorials/wiki2/src/views/tutorial/views/default.py
index 5e28b64fd..867ba3f6c 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/views/default.py
+++ b/docs/tutorials/wiki2/src/views/tutorial/views/default.py
@@ -19,7 +19,7 @@ def view_wiki(request):
next_url = request.route_url('view_page', pagename='FrontPage')
return HTTPFound(location=next_url)
-@view_config(route_name='view_page', renderer='../templates/view.jinja2')
+@view_config(route_name='view_page', renderer='tutorial:templates/view.jinja2')
def view_page(request):
pagename = request.matchdict['pagename']
page = request.dbsession.query(models.Page).filter_by(name=pagename).first()
@@ -41,7 +41,7 @@ def view_page(request):
edit_url = request.route_url('edit_page', pagename=page.name)
return dict(page=page, content=content, edit_url=edit_url)
-@view_config(route_name='edit_page', renderer='../templates/edit.jinja2')
+@view_config(route_name='edit_page', renderer='tutorial:templates/edit.jinja2')
def edit_page(request):
pagename = request.matchdict['pagename']
page = request.dbsession.query(models.Page).filter_by(name=pagename).one()
@@ -55,7 +55,7 @@ def edit_page(request):
save_url=request.route_url('edit_page', pagename=page.name),
)
-@view_config(route_name='add_page', renderer='../templates/edit.jinja2')
+@view_config(route_name='add_page', renderer='tutorial:templates/edit.jinja2')
def add_page(request):
pagename = request.matchdict['pagename']
if request.dbsession.query(models.Page).filter_by(name=pagename).count() > 0:
diff --git a/docs/tutorials/wiki2/src/views/tutorial/views/notfound.py b/docs/tutorials/wiki2/src/views/tutorial/views/notfound.py
index 69d6e2804..740712d9f 100644
--- a/docs/tutorials/wiki2/src/views/tutorial/views/notfound.py
+++ b/docs/tutorials/wiki2/src/views/tutorial/views/notfound.py
@@ -1,7 +1,7 @@
from pyramid.view import notfound_view_config
-@notfound_view_config(renderer='../templates/404.jinja2')
+@notfound_view_config(renderer='tutorial:templates/404.jinja2')
def notfound_view(request):
request.response.status = 404
return {}
diff --git a/docs/tutorials/wiki2/tests.rst b/docs/tutorials/wiki2/tests.rst
index 941a50928..c7d1a0f31 100644
--- a/docs/tutorials/wiki2/tests.rst
+++ b/docs/tutorials/wiki2/tests.rst
@@ -5,18 +5,15 @@ Adding Tests
============
We will now add tests for the models and views as well as a few functional
-tests in a new ``tests`` subpackage. Tests ensure that an application works,
+tests in a new ``tests`` package. Tests ensure that an application works,
and that it continues to work when changes are made in the future.
-The file ``tests.py`` was generated from choosing the ``sqlalchemy`` backend
-option, but it is a common practice to put tests into a ``tests``
-subpackage, especially as projects grow in size and complexity. Each module in
-the test subpackage should contain tests for its corresponding module in our
-application. Each corresponding pair of modules should have the same names,
-except the test module should have the prefix ``test_``.
+The file ``tests/test_it.py`` at the root of our project directory was generated from choosing the ``sqlalchemy`` backend option.
+It is a common practice to put tests into a ``tests`` package alongside the application package, especially as projects grow in size and complexity.
+Each module in the test package should contain tests for its corresponding module in our application.
+Each corresponding pair of modules should have the same names, except the test module should have the prefix ``test_``.
-Start by deleting ``tests.py``, then create a new directory to contain our new
-tests as well as a new empty file ``tests/__init__.py``.
+Start by deleting ``tests/test_it.py``.
.. warning::
@@ -47,36 +44,36 @@ user cannot edit pages that it didn't create but the ``editor`` user can, and
so on.
-View the results of all our edits to ``tests`` subpackage
-=========================================================
+View the results of all our edits to ``tests`` package
+======================================================
-Create ``tutorial/tests/test_views.py`` such that it appears as follows:
+Create ``tests/test_views.py`` such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests/test_views.py
+.. literalinclude:: src/tests/tests/test_views.py
:linenos:
:language: python
-Create ``tutorial/tests/test_functional.py`` such that it appears as follows:
+Create ``tests/test_functional.py`` such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests/test_functional.py
+.. literalinclude:: src/tests/tests/test_functional.py
:linenos:
:language: python
-Create ``tutorial/tests/test_initdb.py`` such that it appears as follows:
+Create ``tests/test_initdb.py`` such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests/test_initdb.py
+.. literalinclude:: src/tests/tests/test_initdb.py
:linenos:
:language: python
-Create ``tutorial/tests/test_security.py`` such that it appears as follows:
+Create ``tests/test_security.py`` such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests/test_security.py
+.. literalinclude:: src/tests/tests/test_security.py
:linenos:
:language: python
-Create ``tutorial/tests/test_user_model.py`` such that it appears as follows:
+Create ``tests/test_user_model.py`` such that it appears as follows:
-.. literalinclude:: src/tests/tutorial/tests/test_user_model.py
+.. literalinclude:: src/tests/tests/test_user_model.py
:linenos:
:language: python
@@ -112,7 +109,7 @@ The expected result should look like the following:
.. code-block:: text
- ................................
- 32 passed in 9.90 seconds
+ ...............................
+ 31 passed in 8.85 seconds
.. _webtest: https://docs.pylonsproject.org/projects/webtest/en/latest/