diff options
Diffstat (limited to 'docs/tutorials/wiki2')
| -rw-r--r-- | docs/tutorials/wiki2/background.rst | 4 | ||||
| -rw-r--r-- | docs/tutorials/wiki2/basiclayout.rst | 118 | ||||
| -rw-r--r-- | docs/tutorials/wiki2/definingmodels.rst | 48 | ||||
| -rw-r--r-- | docs/tutorials/wiki2/distributing.rst | 16 | ||||
| -rw-r--r-- | docs/tutorials/wiki2/installation.rst | 222 | ||||
| -rw-r--r-- | docs/tutorials/wiki2/tests.rst | 35 |
6 files changed, 221 insertions, 222 deletions
diff --git a/docs/tutorials/wiki2/background.rst b/docs/tutorials/wiki2/background.rst index ee7dfe36f..c14d3cb7d 100644 --- a/docs/tutorials/wiki2/background.rst +++ b/docs/tutorials/wiki2/background.rst @@ -11,8 +11,8 @@ familiar to someone with SQL database experience. It uses URLs to code. It can also be followed by people without any prior Python web framework experience. -To code along with this tutorial, the developer will need a UNIX -machine with development tools (Mac OS X with XCode, any Linux or BSD +To code along with this tutorial, the developer will need a Unix +machine with development tools (macOS with XCode, any Linux or BSD variant, etc.) *or* a Windows system of any kind. .. note:: diff --git a/docs/tutorials/wiki2/basiclayout.rst b/docs/tutorials/wiki2/basiclayout.rst index 233231f8d..313b5998e 100644 --- a/docs/tutorials/wiki2/basiclayout.rst +++ b/docs/tutorials/wiki2/basiclayout.rst @@ -21,24 +21,24 @@ code. Open ``tutorial/__init__.py``. It should already contain the following: .. literalinclude:: src/basiclayout/tutorial/__init__.py - :linenos: - :language: py + :linenos: + :language: py Let's go over this piece-by-piece. First we need some imports to support later code: .. literalinclude:: src/basiclayout/tutorial/__init__.py - :end-before: main - :lineno-match: - :language: py + :end-before: main + :lineno-match: + :language: py ``__init__.py`` defines a function named ``main``. Here is the entirety of the ``main`` function we've defined in our ``__init__.py``: .. literalinclude:: src/basiclayout/tutorial/__init__.py - :pyobject: main - :lineno-match: - :language: py + :pyobject: main + :lineno-match: + :language: py When you invoke the ``pserve development.ini`` command, the ``main`` function above is executed. It accepts some settings and returns a :term:`WSGI` @@ -47,9 +47,9 @@ application. (See :ref:`startup_chapter` for more about ``pserve``.) Next in ``main``, construct a :term:`Configurator` object: .. literalinclude:: src/basiclayout/tutorial/__init__.py - :lines: 7 - :lineno-match: - :language: py + :lines: 7 + :lineno-match: + :language: py ``settings`` is passed to the ``Configurator`` as a keyword argument with the dictionary values passed as the ``**settings`` argument. This will be a @@ -61,25 +61,25 @@ 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: 8 - :lineno-match: - :language: py + :lines: 8 + :lineno-match: + :language: py Next include the 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: 9 - :lineno-match: - :language: py + :lines: 9 + :lineno-match: + :language: py Next include the ``routes`` module using a dotted Python path. This module will be explained in the next section. .. literalinclude:: src/basiclayout/tutorial/__init__.py - :lines: 10 - :lineno-match: - :language: py + :lines: 10 + :lineno-match: + :language: py .. note:: @@ -95,18 +95,18 @@ will be registered, allowing one of our application URLs to be mapped to some code. .. literalinclude:: src/basiclayout/tutorial/__init__.py - :lines: 11 - :lineno-match: - :language: py + :lines: 11 + :lineno-match: + :language: py Finally ``main`` is finished configuring things, so it uses the :meth:`pyramid.config.Configurator.make_wsgi_app` method to return a :term:`WSGI` application: .. literalinclude:: src/basiclayout/tutorial/__init__.py - :lines: 12 - :lineno-match: - :language: py + :lines: 12 + :lineno-match: + :language: py Route declarations @@ -115,8 +115,8 @@ Route declarations Open the ``tutorial/routes.py`` file. It should already contain the following: .. literalinclude:: src/basiclayout/tutorial/routes.py - :linenos: - :language: py + :linenos: + :language: py On line 2, we call :meth:`pyramid.config.Configurator.add_static_view` with three arguments: ``static`` (the name), ``static`` (the path), and @@ -151,8 +151,8 @@ Open ``tutorial/views/default.py`` in the ``views`` package. It should already contain the following: .. literalinclude:: src/basiclayout/tutorial/views/default.py - :linenos: - :language: py + :linenos: + :language: py The important part here is that the ``@view_config`` decorator associates the function it decorates (``my_view``) with a :term:`view configuration`, @@ -195,17 +195,17 @@ First, open ``tutorial/models/meta.py``, which should already contain the following: .. literalinclude:: src/basiclayout/tutorial/models/meta.py - :linenos: - :language: py + :linenos: + :language: py ``meta.py`` contains imports and support code for defining the models. We create a dictionary ``NAMING_CONVENTION`` as well for consistent naming of support objects like indices and constraints. .. literalinclude:: src/basiclayout/tutorial/models/meta.py - :end-before: metadata - :linenos: - :language: py + :end-before: metadata + :linenos: + :language: py Next we create a ``metadata`` object from the class :class:`sqlalchemy.schema.MetaData`, using ``NAMING_CONVENTION`` as the value @@ -218,25 +218,25 @@ will attach the tables to the ``metadata`` we created, and define our application's database schema. .. literalinclude:: src/basiclayout/tutorial/models/meta.py - :lines: 15-16 - :lineno-match: - :language: py + :lines: 15-16 + :lineno-match: + :language: py Next open ``tutorial/models/mymodel.py``, which should already contain the following: .. literalinclude:: src/basiclayout/tutorial/models/mymodel.py - :linenos: - :language: py + :linenos: + :language: py Notice we've defined the ``models`` as a package to make it straightforward for defining models in separate modules. To give a simple example of a model class, we have defined one named ``MyModel`` in ``mymodel.py``: .. literalinclude:: src/basiclayout/tutorial/models/mymodel.py - :pyobject: MyModel - :lineno-match: - :language: py + :pyobject: MyModel + :lineno-match: + :language: py Our example model does not require an ``__init__`` method because SQLAlchemy supplies for us a default constructor, if one is not already present, which @@ -244,9 +244,9 @@ accepts keyword arguments of the same name as that of the mapped attributes. .. note:: Example usage of MyModel: - .. code-block:: python + .. code-block:: python - johnny = MyModel(name="John Doe", value=10) + johnny = MyModel(name="John Doe", value=10) The ``MyModel`` class has a ``__tablename__`` attribute. This informs SQLAlchemy which table to use to store the data representing instances of this @@ -256,8 +256,8 @@ Finally, open ``tutorial/models/__init__.py``, which should already contain the following: .. literalinclude:: src/basiclayout/tutorial/models/__init__.py - :linenos: - :language: py + :linenos: + :language: py Our ``models/__init__.py`` module defines the primary API we will use for configuring the database connections within our application, and it contains @@ -286,9 +286,9 @@ database engine using :func:`sqlalchemy.engine_from_config` from the ``[app:main]`` section. This setting is a URI (something like ``sqlite://``). .. literalinclude:: src/basiclayout/tutorial/models/__init__.py - :pyobject: get_engine - :lineno-match: - :language: py + :pyobject: get_engine + :lineno-match: + :language: py The function ``get_session_factory`` accepts an :term:`SQLAlchemy` database engine, and creates a ``session_factory`` from the :term:`SQLAlchemy` class @@ -296,9 +296,9 @@ engine, and creates a ``session_factory`` from the :term:`SQLAlchemy` class used for creating sessions bound to the database engine. .. literalinclude:: src/basiclayout/tutorial/models/__init__.py - :pyobject: get_session_factory - :lineno-match: - :language: py + :pyobject: get_session_factory + :lineno-match: + :language: py The function ``get_tm_session`` registers a database session with a transaction manager, and returns a ``dbsession`` object. With the transaction manager, our @@ -306,9 +306,9 @@ application will automatically issue a transaction commit after every request, unless an exception is raised, in which case the transaction will be aborted. .. literalinclude:: src/basiclayout/tutorial/models/__init__.py - :pyobject: get_tm_session - :lineno-match: - :language: py + :pyobject: get_tm_session + :lineno-match: + :language: py Finally, we define an ``includeme`` function, which is a hook for use with :meth:`pyramid.config.Configurator.include` to activate code in a Pyramid @@ -319,9 +319,9 @@ define a ``request.dbsession`` property, which we can use to do work on behalf of an incoming request to our application. .. literalinclude:: src/basiclayout/tutorial/models/__init__.py - :pyobject: includeme - :lineno-match: - :language: py + :pyobject: includeme + :lineno-match: + :language: py That's about all there is to it regarding models, views, and initialization code in our stock application. diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index c22fd2b61..9159027c4 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -32,9 +32,9 @@ parameter in the ``setup()`` function. Open ``tutorial/setup.py`` and edit it to look like the following: .. literalinclude:: src/models/setup.py - :linenos: - :emphasize-lines: 13 - :language: python + :linenos: + :emphasize-lines: 13 + :language: python Only the highlighted line needs to be added. @@ -53,17 +53,17 @@ the newly added dependency distribution. Make sure your current working directory is the root of the project (the directory in which ``setup.py`` lives) and execute the following command. -On UNIX: +On Unix: .. code-block:: bash - $ $VENV/bin/pip install -e . + $VENV/bin/pip install -e . On Windows: .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\pip install -e . + %VENV%\Scripts\pip install -e . Success executing this command will end with a line to the console something like the following. @@ -86,8 +86,8 @@ Add ``user.py`` Create a new file ``tutorial/models/user.py`` with the following contents: .. literalinclude:: src/models/tutorial/models/user.py - :linenos: - :language: py + :linenos: + :language: py This is a very basic model for a user who can authenticate with our wiki. @@ -125,8 +125,8 @@ Add ``page.py`` Create a new file ``tutorial/models/page.py`` with the following contents: .. literalinclude:: src/models/tutorial/models/page.py - :linenos: - :language: py + :linenos: + :language: py As you can see, our ``Page`` class is very similar to the ``User`` defined above, except with attributes focused on storing information about a wiki page, @@ -151,9 +151,9 @@ Open the ``tutorial/models/__init__.py`` file and edit it to look like the following: .. literalinclude:: src/models/tutorial/models/__init__.py - :linenos: - :language: py - :emphasize-lines: 8,9 + :linenos: + :language: py + :emphasize-lines: 8,9 Here we align our imports with the names of the models, ``Page`` and ``User``. @@ -165,21 +165,21 @@ Migrate the database with Alembic Now that we have written our models, we need to modify the database schema to reflect the changes to our code. Let's generate a new revision, then upgrade the database to the latest revision (head). -On UNIX: +On Unix: .. code-block:: bash - $ $VENV/bin/alembic -c development.ini revision --autogenerate \ - -m "use new models Page and User" - $ $VENV/bin/alembic -c development.ini upgrade head + $VENV/bin/alembic -c development.ini revision --autogenerate \ + -m "use new models Page and User" + $VENV/bin/alembic -c development.ini upgrade head On Windows: .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\alembic -c development.ini revision \ - --autogenerate -m "use new models Page and User" - c:\tutorial> %VENV%\Scripts\alembic -c development.ini upgrade head + %VENV%\Scripts\alembic -c development.ini revision \ + --autogenerate -m "use new models Page and User" + %VENV%\Scripts\alembic -c development.ini upgrade head Success executing these commands will generate output similar to the following. @@ -308,9 +308,9 @@ Open ``tutorial/scripts/initialize_db.py`` and edit it to look like the following: .. literalinclude:: src/models/tutorial/scripts/initialize_db.py - :linenos: - :language: python - :emphasize-lines: 11-24 + :linenos: + :language: python + :emphasize-lines: 11-24 Only the highlighted lines need to be changed. @@ -351,6 +351,6 @@ your console that ends with this exception: .. code-block:: text - AttributeError: module 'tutorial.models' has no attribute 'MyModel' + AttributeError: module 'tutorial.models' has no attribute 'MyModel' This will also happen if you attempt to run the tests. diff --git a/docs/tutorials/wiki2/distributing.rst b/docs/tutorials/wiki2/distributing.rst index d296363ed..0eff63461 100644 --- a/docs/tutorials/wiki2/distributing.rst +++ b/docs/tutorials/wiki2/distributing.rst @@ -9,27 +9,27 @@ using the ``setup.py sdist`` command. The following commands assume your current working directory contains the ``tutorial`` package and the ``setup.py`` file. -On UNIX: +On Unix: .. code-block:: bash - $ $VENV/bin/python setup.py sdist + $VENV/bin/python setup.py sdist On Windows: .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\python setup.py sdist + %VENV%\Scripts\python setup.py sdist The output of such a command will be something like: .. code-block:: text - running sdist - # more output - creating dist - Creating tar archive - removing 'tutorial-0.0' (and everything under it) + running sdist + # more output + creating dist + Creating tar archive + removing 'tutorial-0.0' (and everything under it) Note that this command creates a tarball in the ``dist`` subdirectory named ``tutorial-0.0.tar.gz``. You can send this file to your friends to show them diff --git a/docs/tutorials/wiki2/installation.rst b/docs/tutorials/wiki2/installation.rst index 9b89327cb..1fa7e21d7 100644 --- a/docs/tutorials/wiki2/installation.rst +++ b/docs/tutorials/wiki2/installation.rst @@ -24,7 +24,7 @@ If you need to install the SQLite3 packages, then, for example, using the Debian .. code-block:: bash - $ sudo apt-get install libsqlite3-dev + sudo apt-get install libsqlite3-dev Install cookiecutter @@ -35,23 +35,23 @@ We will use a :term:`cookiecutter` to create a Python package project from a Pyt Generate a Pyramid project from a cookiecutter ---------------------------------------------- -We will create a Pyramid project in your home directory for UNIX or at the root for Windows. It is assumed you know the path to where you installed ``cookiecutter``. Issue the following commands and override the defaults in the prompts as follows. +We will create a Pyramid project in your home directory for Unix or at the root for Windows. It is assumed you know the path to where you installed ``cookiecutter``. Issue the following commands and override the defaults in the prompts as follows. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ cd ~ - $ cookiecutter gh:Pylons/pyramid-cookiecutter-alchemy --checkout master + cd ~ + cookiecutter gh:Pylons/pyramid-cookiecutter-alchemy --checkout master On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\> cd \ - c:\> cookiecutter gh:Pylons/pyramid-cookiecutter-alchemy --checkout master + cd \ + cookiecutter gh:Pylons/pyramid-cookiecutter-alchemy --checkout master On all operating systems ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -67,19 +67,19 @@ If prompted for the first item, accept the default ``yes`` by hitting return. Change directory into your newly created project ------------------------------------------------ -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ cd tutorial + cd tutorial On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\> cd tutorial + cd tutorial Set and use a ``VENV`` environment variable @@ -87,30 +87,30 @@ Set and use a ``VENV`` environment variable We will set the ``VENV`` environment variable to the absolute path of the virtual environment, and use it going forward. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ export VENV=~/tutorial + export VENV=~/tutorial On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> set VENV=c:\tutorial + set VENV=c:\tutorial Create a virtual environment ---------------------------- -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ python3 -m venv $VENV + python3 -m venv $VENV On Windows ^^^^^^^^^^ @@ -121,31 +121,31 @@ Python 2.7: .. code-block:: doscon - c:\tutorial> c:\Python27\Scripts\virtualenv %VENV% + c:\Python27\Scripts\virtualenv %VENV% Python 3.6: .. code-block:: doscon - c:\tutorial> python -m venv %VENV% + python -m venv %VENV% Upgrade packaging tools in the virtual environment -------------------------------------------------- -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/pip install --upgrade pip setuptools + $VENV/bin/pip install --upgrade pip setuptools On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\pip install --upgrade pip setuptools + %VENV%\Scripts\pip install --upgrade pip setuptools .. _installing_project_in_dev_mode: @@ -155,19 +155,19 @@ Installing the project in development mode In order to do development on the project easily, you must "register" the project as a development egg in your workspace. We will install testing requirements at the same time. We do so with the following command. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/pip install -e ".[testing]" + $VENV/bin/pip install -e ".[testing]" On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\pip install -e ".[testing]" + %VENV%\Scripts\pip install -e ".[testing]" On all operating systems ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -188,14 +188,14 @@ The console will show ``pip`` checking for packages and installing missing packa 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 + :language: python + :lineno-match: + :lines: 24-28 .. literalinclude:: src/installation/setup.py - :language: python - :lineno-match: - :lines: 48-50 + :language: python + :lineno-match: + :lines: 48-50 .. _initialize_db_wiki2: @@ -207,93 +207,93 @@ We use :term:`Alembic` to manage our database initialization and migrations. Generate your first revision. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/alembic -c development.ini revision --autogenerate -m "init" + $VENV/bin/alembic -c development.ini revision --autogenerate -m "init" On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\alembic -c development.ini revision --autogenerate -m "init" + %VENV%\Scripts\alembic -c development.ini revision --autogenerate -m "init" 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 ( + 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] () + 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 Upgrade to that revision. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/alembic -c development.ini upgrade head + $VENV/bin/alembic -c development.ini upgrade head On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\alembic -c development.ini upgrade head + %VENV%\Scripts\alembic -c development.ini upgrade head 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 ( + 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 + 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 .. _load_data_wiki2: @@ -303,32 +303,32 @@ Load default data Load default data into the database using a :term:`console script`. Type the following command, making sure you are still in the ``tutorial`` directory (the directory with a ``development.ini`` in it): -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/initialize_tutorial_db development.ini + $VENV/bin/initialize_tutorial_db development.ini On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\initialize_tutorial_db development.ini + %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 + 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 @@ -345,26 +345,26 @@ requirements, you may run the tests for the project. The following commands provide options to py.test that specify the module for which its tests shall be run, and to run py.test in quiet mode. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/py.test -q + $VENV/bin/py.test -q On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\py.test -q + %VENV%\Scripts\py.test -q For a successful test run, you should see output that ends like this: .. code-block:: bash - .. - 2 passed in 0.44 seconds + .. + 2 passed in 0.44 seconds Expose test coverage information @@ -378,19 +378,19 @@ tests. We've already installed the ``pytest-cov`` package into our virtual environment, so we can run the tests with coverage. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/py.test --cov --cov-report=term-missing + $VENV/bin/py.test --cov --cov-report=term-missing On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\py.test --cov --cov-report=term-missing + c:\tutorial> %VENV%\Scripts\py.test --cov --cov-report=term-missing If successful, you will see output something like this: @@ -404,20 +404,20 @@ If successful, you will see output something like this: tutorial/tests.py .. ------------------ coverage: platform Python 3.6.5 ------------------ - 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/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/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% + 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/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/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% ===================== 2 passed in 0.57 seconds ====================== @@ -434,19 +434,19 @@ These configuration files are ``pytest.ini`` and ``.coveragerc``, located at the root of your package. Without these defaults, we would need to specify the path to the module on which we want to run tests and coverage. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/py.test --cov=tutorial tutorial/tests.py -q + $VENV/bin/py.test --cov=tutorial tutorial/tests.py -q On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\py.test --cov=tutorial tutorial\tests.py -q + %VENV%\Scripts\py.test --cov=tutorial tutorial\tests.py -q py.test follows :ref:`conventions for Python test discovery <pytest:test discovery>`, and the configuration defaults from the cookiecutter @@ -465,19 +465,19 @@ Start the application Start the application. See :ref:`what_is_this_pserve_thing` for more information on ``pserve``. -On UNIX +On Unix ^^^^^^^ .. code-block:: bash - $ $VENV/bin/pserve development.ini --reload + $VENV/bin/pserve development.ini --reload On Windows ^^^^^^^^^^ .. code-block:: doscon - c:\tutorial> %VENV%\Scripts\pserve development.ini --reload + %VENV%\Scripts\pserve development.ini --reload .. note:: diff --git a/docs/tutorials/wiki2/tests.rst b/docs/tutorials/wiki2/tests.rst index 84b123df1..f3f89fe9c 100644 --- a/docs/tutorials/wiki2/tests.rst +++ b/docs/tutorials/wiki2/tests.rst @@ -53,33 +53,32 @@ View the results of all our edits to ``tests`` subpackage Create ``tutorial/tests/test_views.py`` such that it appears as follows: .. literalinclude:: src/tests/tutorial/tests/test_views.py - :linenos: - :language: python + :linenos: + :language: python Create ``tutorial/tests/test_functional.py`` such that it appears as follows: .. literalinclude:: src/tests/tutorial/tests/test_functional.py - :linenos: - :language: python + :linenos: + :language: python Create ``tutorial/tests/test_initdb.py`` such that it appears as follows: .. literalinclude:: src/tests/tutorial/tests/test_initdb.py - :linenos: - :language: python + :linenos: + :language: python Create ``tutorial/tests/test_security.py`` such that it appears as follows: .. literalinclude:: src/tests/tutorial/tests/test_security.py - :linenos: - :language: python + :linenos: + :language: python Create ``tutorial/tests/test_user_model.py`` such that it appears as follows: .. literalinclude:: src/tests/tutorial/tests/test_user_model.py - :linenos: - :language: python - + :linenos: + :language: python .. note:: @@ -95,25 +94,25 @@ Running the tests We can run these tests similarly to how we did in :ref:`running_tests`, but first delete the SQLite database ``tutorial.sqlite``. If you do not delete the database, then you will see an integrity error when running the tests. -On UNIX: +On Unix: .. code-block:: bash - $ rm tutorial.sqlite - $ $VENV/bin/py.test -q + rm tutorial.sqlite + $VENV/bin/py.test -q On Windows: .. code-block:: doscon - c:\tutorial> del tutorial.sqlite - c:\tutorial> %VENV%\Scripts\py.test -q + del tutorial.sqlite + %VENV%\Scripts\py.test -q The expected result should look like the following: .. code-block:: text - ................................ - 32 passed in 9.90 seconds + ................................ + 32 passed in 9.90 seconds .. _webtest: https://docs.pylonsproject.org/projects/webtest/en/latest/ |
