| | |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ sudo apt-get install libsqlite3-dev |
| | | sudo apt-get install libsqlite3-dev |
| | | |
| | | |
| | | Install cookiecutter |
| | |
| | | |
| | | .. 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 |
| | | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| | |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ cd tutorial |
| | | cd tutorial |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\> cd tutorial |
| | | cd tutorial |
| | | |
| | | |
| | | Set and use a ``VENV`` environment variable |
| | |
| | | |
| | | .. 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 |
| | |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ python3 -m venv $VENV |
| | | python3 -m venv $VENV |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | |
| | | |
| | | .. 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 |
| | |
| | | |
| | | .. 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: |
| | |
| | | |
| | | .. 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 |
| | | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| | |
| | | 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: |
| | |
| | | |
| | | .. 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. |
| | |
| | | |
| | | .. 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: |
| | |
| | | |
| | | .. 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 |
| | |
| | | |
| | | .. 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 |
| | |
| | | |
| | | .. 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: |
| | | |
| | |
| | | |
| | | 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 ====================== |
| | | |
| | |
| | | |
| | | .. 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 |
| | |
| | | |
| | | .. 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:: |
| | | |