From 8f30e87698ea2041d3baec080417167c3d2f3674 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Thu, 30 Aug 2018 03:40:56 -0700 Subject: Update quick_tour with starter and alchemy cookiecutters source files --- docs/quick_tour.rst | 8 +-- docs/quick_tour/logging/.gitignore | 21 ++++++++ docs/quick_tour/logging/hello_world/__init__.py | 9 ++-- docs/quick_tour/logging/hello_world/routes.py | 3 ++ .../logging/hello_world/templates/404.jinja2 | 8 +++ docs/quick_tour/logging/hello_world/tests.py | 2 +- docs/quick_tour/logging/hello_world/views.py | 9 ---- .../logging/hello_world/views/__init__.py | 0 .../logging/hello_world/views/default.py | 9 ++++ .../logging/hello_world/views/notfound.py | 7 +++ docs/quick_tour/logging/setup.py | 2 +- docs/quick_tour/package/.gitignore | 21 ++++++++ docs/quick_tour/package/hello_world/__init__.py | 9 ++-- docs/quick_tour/package/hello_world/routes.py | 3 ++ .../package/hello_world/templates/404.jinja2 | 8 +++ docs/quick_tour/package/hello_world/tests.py | 2 +- docs/quick_tour/package/hello_world/views.py | 6 --- .../package/hello_world/views/__init__.py | 0 .../package/hello_world/views/default.py | 6 +++ .../package/hello_world/views/notfound.py | 7 +++ docs/quick_tour/package/setup.py | 2 +- docs/quick_tour/sessions/.gitignore | 21 ++++++++ docs/quick_tour/sessions/hello_world/__init__.py | 13 +++-- docs/quick_tour/sessions/hello_world/routes.py | 3 ++ .../sessions/hello_world/templates/404.jinja2 | 8 +++ docs/quick_tour/sessions/hello_world/tests.py | 2 +- docs/quick_tour/sessions/hello_world/views.py | 14 ------ .../sessions/hello_world/views/__init__.py | 0 .../sessions/hello_world/views/default.py | 14 ++++++ .../sessions/hello_world/views/notfound.py | 7 +++ docs/quick_tour/sessions/setup.py | 2 +- docs/quick_tour/sqla_demo/.gitignore | 21 ++++++++ docs/quick_tour/sqla_demo/README.txt | 12 ++++- docs/quick_tour/sqla_demo/development.ini | 11 +++- docs/quick_tour/sqla_demo/production.ini | 9 ++++ docs/quick_tour/sqla_demo/pytest.ini | 2 +- docs/quick_tour/sqla_demo/setup.py | 7 +-- docs/quick_tour/sqla_demo/sqla_demo/__init__.py | 10 ++-- docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py | 58 ++++++++++++++++++++++ .../sqla_demo/sqla_demo/alembic/script.py.mako | 24 +++++++++ .../sqla_demo/alembic/versions/README.txt | 1 + docs/quick_tour/sqla_demo/sqla_demo/pshell.py | 12 +++++ .../sqla_demo/sqla_demo/scripts/initialize_db.py | 48 ++++++++++++++++++ .../sqla_demo/sqla_demo/scripts/initializedb.py | 45 ----------------- .../sqla_demo/templates/mytemplate.jinja2 | 2 +- .../sqla_demo/sqla_demo/views/default.py | 11 ++-- 46 files changed, 380 insertions(+), 119 deletions(-) create mode 100644 docs/quick_tour/logging/.gitignore create mode 100644 docs/quick_tour/logging/hello_world/routes.py create mode 100644 docs/quick_tour/logging/hello_world/templates/404.jinja2 delete mode 100644 docs/quick_tour/logging/hello_world/views.py create mode 100644 docs/quick_tour/logging/hello_world/views/__init__.py create mode 100644 docs/quick_tour/logging/hello_world/views/default.py create mode 100644 docs/quick_tour/logging/hello_world/views/notfound.py create mode 100644 docs/quick_tour/package/.gitignore create mode 100644 docs/quick_tour/package/hello_world/routes.py create mode 100644 docs/quick_tour/package/hello_world/templates/404.jinja2 delete mode 100644 docs/quick_tour/package/hello_world/views.py create mode 100644 docs/quick_tour/package/hello_world/views/__init__.py create mode 100644 docs/quick_tour/package/hello_world/views/default.py create mode 100644 docs/quick_tour/package/hello_world/views/notfound.py create mode 100644 docs/quick_tour/sessions/.gitignore create mode 100644 docs/quick_tour/sessions/hello_world/routes.py create mode 100644 docs/quick_tour/sessions/hello_world/templates/404.jinja2 delete mode 100644 docs/quick_tour/sessions/hello_world/views.py create mode 100644 docs/quick_tour/sessions/hello_world/views/__init__.py create mode 100644 docs/quick_tour/sessions/hello_world/views/default.py create mode 100644 docs/quick_tour/sessions/hello_world/views/notfound.py create mode 100644 docs/quick_tour/sqla_demo/.gitignore create mode 100644 docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py create mode 100644 docs/quick_tour/sqla_demo/sqla_demo/alembic/script.py.mako create mode 100644 docs/quick_tour/sqla_demo/sqla_demo/alembic/versions/README.txt create mode 100644 docs/quick_tour/sqla_demo/sqla_demo/pshell.py create mode 100644 docs/quick_tour/sqla_demo/sqla_demo/scripts/initialize_db.py delete mode 100644 docs/quick_tour/sqla_demo/sqla_demo/scripts/initializedb.py (limited to 'docs') diff --git a/docs/quick_tour.rst b/docs/quick_tour.rst index c61cbfdfd..26195a701 100644 --- a/docs/quick_tour.rst +++ b/docs/quick_tour.rst @@ -755,14 +755,14 @@ Pyramid (for example, when a new request comes in). Maybe you would like to log messages in your code? In your Python module, import and set up the logging in your ``views.py``: -.. literalinclude:: quick_tour/logging/hello_world/views.py +.. literalinclude:: quick_tour/logging/hello_world/views/default.py :language: python :lineno-match: :lines: 3-4 You can now, in your code, log messages: -.. literalinclude:: quick_tour/logging/hello_world/views.py +.. literalinclude:: quick_tour/logging/hello_world/views/default.py :language: python :lineno-match: :lines: 7-8 @@ -819,13 +819,13 @@ Now make a "factory" and pass it to the :term:`configurator`'s .. literalinclude:: quick_tour/sessions/hello_world/__init__.py :language: python :lineno-match: - :lines: 10-13 + :lines: 9-12 :emphasize-lines: 2-3 Pyramid's :term:`request` object now has a ``session`` attribute that we can use in our view code in ``views.py``: -.. literalinclude:: quick_tour/sessions/hello_world/views.py +.. literalinclude:: quick_tour/sessions/hello_world/views/default.py :language: python :lineno-match: :lines: 7- diff --git a/docs/quick_tour/logging/.gitignore b/docs/quick_tour/logging/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/quick_tour/logging/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test diff --git a/docs/quick_tour/logging/hello_world/__init__.py b/docs/quick_tour/logging/hello_world/__init__.py index 49dde36d4..a3d5a6469 100644 --- a/docs/quick_tour/logging/hello_world/__init__.py +++ b/docs/quick_tour/logging/hello_world/__init__.py @@ -4,9 +4,8 @@ from pyramid.config import Configurator def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ - config = Configurator(settings=settings) - config.include('pyramid_jinja2') - config.add_static_view('static', 'static', cache_max_age=3600) - config.add_route('home', '/') - config.scan() + with Configurator(settings=settings) as config: + config.include('pyramid_jinja2') + config.include('.routes') + config.scan() return config.make_wsgi_app() diff --git a/docs/quick_tour/logging/hello_world/routes.py b/docs/quick_tour/logging/hello_world/routes.py new file mode 100644 index 000000000..25504ad4d --- /dev/null +++ b/docs/quick_tour/logging/hello_world/routes.py @@ -0,0 +1,3 @@ +def includeme(config): + config.add_static_view('static', 'static', cache_max_age=3600) + config.add_route('home', '/') diff --git a/docs/quick_tour/logging/hello_world/templates/404.jinja2 b/docs/quick_tour/logging/hello_world/templates/404.jinja2 new file mode 100644 index 000000000..aaf12413f --- /dev/null +++ b/docs/quick_tour/logging/hello_world/templates/404.jinja2 @@ -0,0 +1,8 @@ +{% extends "layout.jinja2" %} + +{% block content %} +
+

Pyramid Starter project

+

404 Page Not Found

+
+{% endblock content %} diff --git a/docs/quick_tour/logging/hello_world/tests.py b/docs/quick_tour/logging/hello_world/tests.py index ee9745685..f01ae2a3c 100644 --- a/docs/quick_tour/logging/hello_world/tests.py +++ b/docs/quick_tour/logging/hello_world/tests.py @@ -11,7 +11,7 @@ class ViewTests(unittest.TestCase): testing.tearDown() def test_my_view(self): - from .views import my_view + from .views.default import my_view request = testing.DummyRequest() info = my_view(request) self.assertEqual(info['project'], 'hello_world') diff --git a/docs/quick_tour/logging/hello_world/views.py b/docs/quick_tour/logging/hello_world/views.py deleted file mode 100644 index a648d6ba3..000000000 --- a/docs/quick_tour/logging/hello_world/views.py +++ /dev/null @@ -1,9 +0,0 @@ -from pyramid.view import view_config - -import logging -log = logging.getLogger(__name__) - -@view_config(route_name='home', renderer='templates/mytemplate.jinja2') -def my_view(request): - log.debug('Some Message') - return {'project': 'hello_world'} diff --git a/docs/quick_tour/logging/hello_world/views/__init__.py b/docs/quick_tour/logging/hello_world/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/quick_tour/logging/hello_world/views/default.py b/docs/quick_tour/logging/hello_world/views/default.py new file mode 100644 index 000000000..bbb99d78c --- /dev/null +++ b/docs/quick_tour/logging/hello_world/views/default.py @@ -0,0 +1,9 @@ +from pyramid.view import view_config + +import logging +log = logging.getLogger(__name__) + +@view_config(route_name='home', renderer='../templates/mytemplate.jinja2') +def my_view(request): + log.debug('Some Message') + return {'project': 'hello_world'} diff --git a/docs/quick_tour/logging/hello_world/views/notfound.py b/docs/quick_tour/logging/hello_world/views/notfound.py new file mode 100644 index 000000000..69d6e2804 --- /dev/null +++ b/docs/quick_tour/logging/hello_world/views/notfound.py @@ -0,0 +1,7 @@ +from pyramid.view import notfound_view_config + + +@notfound_view_config(renderer='../templates/404.jinja2') +def notfound_view(request): + request.response.status = 404 + return {} diff --git a/docs/quick_tour/logging/setup.py b/docs/quick_tour/logging/setup.py index 44d90b990..27b025384 100644 --- a/docs/quick_tour/logging/setup.py +++ b/docs/quick_tour/logging/setup.py @@ -18,7 +18,7 @@ requires = [ tests_require = [ 'WebTest >= 1.3.1', # py3 compat - 'pytest', + 'pytest>=3.7.4', 'pytest-cov', ] diff --git a/docs/quick_tour/package/.gitignore b/docs/quick_tour/package/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/quick_tour/package/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test diff --git a/docs/quick_tour/package/hello_world/__init__.py b/docs/quick_tour/package/hello_world/__init__.py index 49dde36d4..a3d5a6469 100644 --- a/docs/quick_tour/package/hello_world/__init__.py +++ b/docs/quick_tour/package/hello_world/__init__.py @@ -4,9 +4,8 @@ from pyramid.config import Configurator def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ - config = Configurator(settings=settings) - config.include('pyramid_jinja2') - config.add_static_view('static', 'static', cache_max_age=3600) - config.add_route('home', '/') - config.scan() + with Configurator(settings=settings) as config: + config.include('pyramid_jinja2') + config.include('.routes') + config.scan() return config.make_wsgi_app() diff --git a/docs/quick_tour/package/hello_world/routes.py b/docs/quick_tour/package/hello_world/routes.py new file mode 100644 index 000000000..25504ad4d --- /dev/null +++ b/docs/quick_tour/package/hello_world/routes.py @@ -0,0 +1,3 @@ +def includeme(config): + config.add_static_view('static', 'static', cache_max_age=3600) + config.add_route('home', '/') diff --git a/docs/quick_tour/package/hello_world/templates/404.jinja2 b/docs/quick_tour/package/hello_world/templates/404.jinja2 new file mode 100644 index 000000000..aaf12413f --- /dev/null +++ b/docs/quick_tour/package/hello_world/templates/404.jinja2 @@ -0,0 +1,8 @@ +{% extends "layout.jinja2" %} + +{% block content %} +
+

Pyramid Starter project

+

404 Page Not Found

+
+{% endblock content %} diff --git a/docs/quick_tour/package/hello_world/tests.py b/docs/quick_tour/package/hello_world/tests.py index ee9745685..f01ae2a3c 100644 --- a/docs/quick_tour/package/hello_world/tests.py +++ b/docs/quick_tour/package/hello_world/tests.py @@ -11,7 +11,7 @@ class ViewTests(unittest.TestCase): testing.tearDown() def test_my_view(self): - from .views import my_view + from .views.default import my_view request = testing.DummyRequest() info = my_view(request) self.assertEqual(info['project'], 'hello_world') diff --git a/docs/quick_tour/package/hello_world/views.py b/docs/quick_tour/package/hello_world/views.py deleted file mode 100644 index 67f78dad7..000000000 --- a/docs/quick_tour/package/hello_world/views.py +++ /dev/null @@ -1,6 +0,0 @@ -from pyramid.view import view_config - - -@view_config(route_name='home', renderer='templates/mytemplate.jinja2') -def my_view(request): - return {'project': 'hello_world'} diff --git a/docs/quick_tour/package/hello_world/views/__init__.py b/docs/quick_tour/package/hello_world/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/quick_tour/package/hello_world/views/default.py b/docs/quick_tour/package/hello_world/views/default.py new file mode 100644 index 000000000..7458da006 --- /dev/null +++ b/docs/quick_tour/package/hello_world/views/default.py @@ -0,0 +1,6 @@ +from pyramid.view import view_config + + +@view_config(route_name='home', renderer='../templates/mytemplate.jinja2') +def my_view(request): + return {'project': 'hello_world'} diff --git a/docs/quick_tour/package/hello_world/views/notfound.py b/docs/quick_tour/package/hello_world/views/notfound.py new file mode 100644 index 000000000..69d6e2804 --- /dev/null +++ b/docs/quick_tour/package/hello_world/views/notfound.py @@ -0,0 +1,7 @@ +from pyramid.view import notfound_view_config + + +@notfound_view_config(renderer='../templates/404.jinja2') +def notfound_view(request): + request.response.status = 404 + return {} diff --git a/docs/quick_tour/package/setup.py b/docs/quick_tour/package/setup.py index 44d90b990..27b025384 100644 --- a/docs/quick_tour/package/setup.py +++ b/docs/quick_tour/package/setup.py @@ -18,7 +18,7 @@ requires = [ tests_require = [ 'WebTest >= 1.3.1', # py3 compat - 'pytest', + 'pytest>=3.7.4', 'pytest-cov', ] diff --git a/docs/quick_tour/sessions/.gitignore b/docs/quick_tour/sessions/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/quick_tour/sessions/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test diff --git a/docs/quick_tour/sessions/hello_world/__init__.py b/docs/quick_tour/sessions/hello_world/__init__.py index 7cdc55ebe..c2b9f68c7 100644 --- a/docs/quick_tour/sessions/hello_world/__init__.py +++ b/docs/quick_tour/sessions/hello_world/__init__.py @@ -4,11 +4,10 @@ from pyramid.session import SignedCookieSessionFactory def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ - config = Configurator(settings=settings) - config.include('pyramid_jinja2') - config.add_static_view('static', 'static', cache_max_age=3600) - config.add_route('home', '/') - my_session_factory = SignedCookieSessionFactory('itsaseekreet') - config.set_session_factory(my_session_factory) - config.scan() + with Configurator(settings=settings) as config: + config.include('pyramid_jinja2') + config.include('.routes') + my_session_factory = SignedCookieSessionFactory('itsaseekreet') + config.set_session_factory(my_session_factory) + config.scan() return config.make_wsgi_app() diff --git a/docs/quick_tour/sessions/hello_world/routes.py b/docs/quick_tour/sessions/hello_world/routes.py new file mode 100644 index 000000000..25504ad4d --- /dev/null +++ b/docs/quick_tour/sessions/hello_world/routes.py @@ -0,0 +1,3 @@ +def includeme(config): + config.add_static_view('static', 'static', cache_max_age=3600) + config.add_route('home', '/') diff --git a/docs/quick_tour/sessions/hello_world/templates/404.jinja2 b/docs/quick_tour/sessions/hello_world/templates/404.jinja2 new file mode 100644 index 000000000..aaf12413f --- /dev/null +++ b/docs/quick_tour/sessions/hello_world/templates/404.jinja2 @@ -0,0 +1,8 @@ +{% extends "layout.jinja2" %} + +{% block content %} +
+

Pyramid Starter project

+

404 Page Not Found

+
+{% endblock content %} diff --git a/docs/quick_tour/sessions/hello_world/tests.py b/docs/quick_tour/sessions/hello_world/tests.py index ee9745685..f01ae2a3c 100644 --- a/docs/quick_tour/sessions/hello_world/tests.py +++ b/docs/quick_tour/sessions/hello_world/tests.py @@ -11,7 +11,7 @@ class ViewTests(unittest.TestCase): testing.tearDown() def test_my_view(self): - from .views import my_view + from .views.default import my_view request = testing.DummyRequest() info = my_view(request) self.assertEqual(info['project'], 'hello_world') diff --git a/docs/quick_tour/sessions/hello_world/views.py b/docs/quick_tour/sessions/hello_world/views.py deleted file mode 100644 index 9716f854e..000000000 --- a/docs/quick_tour/sessions/hello_world/views.py +++ /dev/null @@ -1,14 +0,0 @@ -from pyramid.view import view_config - -import logging -log = logging.getLogger(__name__) - -@view_config(route_name='home', renderer='templates/mytemplate.jinja2') -def my_view(request): - log.debug('Some Message') - session = request.session - if 'counter' in session: - session['counter'] += 1 - else: - session['counter'] = 0 - return {'project': 'hello_world'} diff --git a/docs/quick_tour/sessions/hello_world/views/__init__.py b/docs/quick_tour/sessions/hello_world/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/quick_tour/sessions/hello_world/views/default.py b/docs/quick_tour/sessions/hello_world/views/default.py new file mode 100644 index 000000000..33b8d8ded --- /dev/null +++ b/docs/quick_tour/sessions/hello_world/views/default.py @@ -0,0 +1,14 @@ +from pyramid.view import view_config + +import logging +log = logging.getLogger(__name__) + +@view_config(route_name='home', renderer='../templates/mytemplate.jinja2') +def my_view(request): + log.debug('Some Message') + session = request.session + if 'counter' in session: + session['counter'] += 1 + else: + session['counter'] = 0 + return {'project': 'hello_world'} diff --git a/docs/quick_tour/sessions/hello_world/views/notfound.py b/docs/quick_tour/sessions/hello_world/views/notfound.py new file mode 100644 index 000000000..69d6e2804 --- /dev/null +++ b/docs/quick_tour/sessions/hello_world/views/notfound.py @@ -0,0 +1,7 @@ +from pyramid.view import notfound_view_config + + +@notfound_view_config(renderer='../templates/404.jinja2') +def notfound_view(request): + request.response.status = 404 + return {} diff --git a/docs/quick_tour/sessions/setup.py b/docs/quick_tour/sessions/setup.py index 44d90b990..27b025384 100644 --- a/docs/quick_tour/sessions/setup.py +++ b/docs/quick_tour/sessions/setup.py @@ -18,7 +18,7 @@ requires = [ tests_require = [ 'WebTest >= 1.3.1', # py3 compat - 'pytest', + 'pytest>=3.7.4', 'pytest-cov', ] diff --git a/docs/quick_tour/sqla_demo/.gitignore b/docs/quick_tour/sqla_demo/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/quick_tour/sqla_demo/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test diff --git a/docs/quick_tour/sqla_demo/README.txt b/docs/quick_tour/sqla_demo/README.txt index 27bbff5a7..d00790492 100644 --- a/docs/quick_tour/sqla_demo/README.txt +++ b/docs/quick_tour/sqla_demo/README.txt @@ -20,7 +20,17 @@ Getting Started env/bin/pip install -e ".[testing]" -- Configure the database. +- Initialize and upgrade the database using Alembic. + + - Generate your first revision. + + env/bin/alembic -c development.ini revision --autogenerate -m "init" + + - Upgrade to that revision. + + env/bin/alembic -c development.ini upgrade head + +- Load default data into the database using a script. env/bin/initialize_sqla_demo_db development.ini diff --git a/docs/quick_tour/sqla_demo/development.ini b/docs/quick_tour/sqla_demo/development.ini index 8836a846e..056a672e4 100644 --- a/docs/quick_tour/sqla_demo/development.ini +++ b/docs/quick_tour/sqla_demo/development.ini @@ -22,10 +22,19 @@ retry.attempts = 3 # '127.0.0.1' and '::1'. # debugtoolbar.hosts = 127.0.0.1 ::1 +[pshell] +setup = sqla_demo.pshell.setup + ### # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = sqla_demo/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = localhost:6543 @@ -54,7 +63,7 @@ handlers = qualname = sqla_demo [logger_sqlalchemy] -level = INFO +level = WARN handlers = qualname = sqlalchemy.engine # "level = INFO" logs SQL queries. diff --git a/docs/quick_tour/sqla_demo/production.ini b/docs/quick_tour/sqla_demo/production.ini index 4566e02a0..fe7f946bd 100644 --- a/docs/quick_tour/sqla_demo/production.ini +++ b/docs/quick_tour/sqla_demo/production.ini @@ -16,10 +16,19 @@ sqlalchemy.url = sqlite:///%(here)s/sqla_demo.sqlite retry.attempts = 3 +[pshell] +setup = sqla_demo.pshell.setup + ### # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = sqla_demo/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = *:6543 diff --git a/docs/quick_tour/sqla_demo/pytest.ini b/docs/quick_tour/sqla_demo/pytest.ini index 2d7535841..b4b690a0f 100644 --- a/docs/quick_tour/sqla_demo/pytest.ini +++ b/docs/quick_tour/sqla_demo/pytest.ini @@ -1,3 +1,3 @@ [pytest] testpaths = sqla_demo -python_files = *.py +python_files = test*.py diff --git a/docs/quick_tour/sqla_demo/setup.py b/docs/quick_tour/sqla_demo/setup.py index 855a15d58..76cd518ca 100644 --- a/docs/quick_tour/sqla_demo/setup.py +++ b/docs/quick_tour/sqla_demo/setup.py @@ -9,8 +9,9 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: CHANGES = f.read() requires = [ + 'alembic', 'plaster_pastedeploy', - 'pyramid >= 1.9a', + 'pyramid >= 1.9', 'pyramid_debugtoolbar', 'pyramid_jinja2', 'pyramid_retry', @@ -23,7 +24,7 @@ requires = [ tests_require = [ 'WebTest >= 1.3.1', # py3 compat - 'pytest', + 'pytest>=3.7.4', 'pytest-cov', ] @@ -54,7 +55,7 @@ setup( 'main = sqla_demo:main', ], 'console_scripts': [ - 'initialize_sqla_demo_db = sqla_demo.scripts.initializedb:main', + 'initialize_sqla_demo_db = sqla_demo.scripts.initialize_db:main', ], }, ) diff --git a/docs/quick_tour/sqla_demo/sqla_demo/__init__.py b/docs/quick_tour/sqla_demo/sqla_demo/__init__.py index 4dab44823..28bd1f80d 100644 --- a/docs/quick_tour/sqla_demo/sqla_demo/__init__.py +++ b/docs/quick_tour/sqla_demo/sqla_demo/__init__.py @@ -4,9 +4,9 @@ from pyramid.config import Configurator def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ - config = Configurator(settings=settings) - config.include('pyramid_jinja2') - config.include('.models') - config.include('.routes') - config.scan() + with Configurator(settings=settings) as config: + config.include('pyramid_jinja2') + config.include('.models') + config.include('.routes') + config.scan() return config.make_wsgi_app() diff --git a/docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py b/docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py new file mode 100644 index 000000000..46ce86a4e --- /dev/null +++ b/docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py @@ -0,0 +1,58 @@ +"""Pyramid bootstrap environment. """ +from alembic import context +from pyramid.paster import get_appsettings, setup_logging +from sqlalchemy import engine_from_config + +from sqla_demo.models.meta import Base + +config = context.config + +setup_logging(config.config_file_name) + +settings = get_appsettings(config.config_file_name) +target_metadata = Base.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + context.configure(url=settings['sqlalchemy.url']) + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + engine = engine_from_config(settings, prefix='sqlalchemy.') + + connection = engine.connect() + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + try: + with context.begin_transaction(): + context.run_migrations() + finally: + connection.close() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/docs/quick_tour/sqla_demo/sqla_demo/alembic/script.py.mako b/docs/quick_tour/sqla_demo/sqla_demo/alembic/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/docs/quick_tour/sqla_demo/sqla_demo/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +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/quick_tour/sqla_demo/sqla_demo/alembic/versions/README.txt b/docs/quick_tour/sqla_demo/sqla_demo/alembic/versions/README.txt new file mode 100644 index 000000000..09ed32c8d --- /dev/null +++ b/docs/quick_tour/sqla_demo/sqla_demo/alembic/versions/README.txt @@ -0,0 +1 @@ +Placeholder for alembic versions \ No newline at end of file diff --git a/docs/quick_tour/sqla_demo/sqla_demo/pshell.py b/docs/quick_tour/sqla_demo/sqla_demo/pshell.py new file mode 100644 index 000000000..108c04d5e --- /dev/null +++ b/docs/quick_tour/sqla_demo/sqla_demo/pshell.py @@ -0,0 +1,12 @@ +from . import models + +def setup(env): + request = env['request'] + + # start a transaction + request.tm.begin() + + # inject some vars into the shell builtins + env['tm'] = request.tm + env['dbsession'] = request.dbsession + env['models'] = models diff --git a/docs/quick_tour/sqla_demo/sqla_demo/scripts/initialize_db.py b/docs/quick_tour/sqla_demo/sqla_demo/scripts/initialize_db.py new file mode 100644 index 000000000..c629d1780 --- /dev/null +++ b/docs/quick_tour/sqla_demo/sqla_demo/scripts/initialize_db.py @@ -0,0 +1,48 @@ +import argparse +import sys + +from pyramid.paster import bootstrap, setup_logging +from sqlalchemy.exc import OperationalError + +from .. import models + + +def setup_models(dbsession): + """ + Add or update models / fixtures in the database. + + """ + model = models.mymodel.MyModel(name='one', value=1) + dbsession.add(model) + + +def parse_args(argv): + parser = argparse.ArgumentParser() + parser.add_argument( + 'config_uri', + help='Configuration file, e.g., development.ini', + ) + return parser.parse_args(argv[1:]) + + +def main(argv=sys.argv): + args = parse_args(argv) + setup_logging(args.config_uri) + env = bootstrap(args.config_uri) + + try: + with env['request'].tm: + dbsession = env['request'].dbsession + setup_models(dbsession) + except OperationalError: + print(''' +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. + +2. Your database server may not be running. Check that the + database server referred to by the "sqlalchemy.url" setting in + your "development.ini" file is running. + ''') diff --git a/docs/quick_tour/sqla_demo/sqla_demo/scripts/initializedb.py b/docs/quick_tour/sqla_demo/sqla_demo/scripts/initializedb.py deleted file mode 100644 index 7307ecc5c..000000000 --- a/docs/quick_tour/sqla_demo/sqla_demo/scripts/initializedb.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import sys -import transaction - -from pyramid.paster import ( - get_appsettings, - setup_logging, - ) - -from pyramid.scripts.common import parse_vars - -from ..models.meta import Base -from ..models import ( - get_engine, - get_session_factory, - get_tm_session, - ) -from ..models import MyModel - - -def usage(argv): - cmd = os.path.basename(argv[0]) - print('usage: %s [var=value]\n' - '(example: "%s development.ini")' % (cmd, cmd)) - sys.exit(1) - - -def main(argv=sys.argv): - if len(argv) < 2: - usage(argv) - config_uri = argv[1] - options = parse_vars(argv[2:]) - setup_logging(config_uri) - settings = get_appsettings(config_uri, options=options) - - engine = get_engine(settings) - Base.metadata.create_all(engine) - - session_factory = get_session_factory(engine) - - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - model = MyModel(name='one', value=1) - dbsession.add(model) diff --git a/docs/quick_tour/sqla_demo/sqla_demo/templates/mytemplate.jinja2 b/docs/quick_tour/sqla_demo/sqla_demo/templates/mytemplate.jinja2 index 26d72c0a6..d8b0a4232 100644 --- a/docs/quick_tour/sqla_demo/sqla_demo/templates/mytemplate.jinja2 +++ b/docs/quick_tour/sqla_demo/sqla_demo/templates/mytemplate.jinja2 @@ -5,4 +5,4 @@

Pyramid Alchemy project

Welcome to {{project}}, a Pyramid application generated by
Cookiecutter.

-{% endblock content %} +{% endblock content %} \ No newline at end of file diff --git a/docs/quick_tour/sqla_demo/sqla_demo/views/default.py b/docs/quick_tour/sqla_demo/sqla_demo/views/default.py index d4afb1b0b..f7ad4c8f2 100644 --- a/docs/quick_tour/sqla_demo/sqla_demo/views/default.py +++ b/docs/quick_tour/sqla_demo/sqla_demo/views/default.py @@ -3,14 +3,14 @@ from pyramid.view import view_config from sqlalchemy.exc import DBAPIError -from ..models import MyModel +from .. import models @view_config(route_name='home', renderer='../templates/mytemplate.jinja2') def my_view(request): try: - query = request.dbsession.query(MyModel) - one = query.filter(MyModel.name == 'one').first() + query = request.dbsession.query(models.MyModel) + one = query.filter(models.MyModel.name == 'one').first() except DBAPIError: return Response(db_err_msg, content_type='text/plain', status=500) return {'one': one, 'project': 'sqla_demo'} @@ -20,9 +20,8 @@ db_err_msg = """\ 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 run the "initialize_sqla_demo_db" script - to initialize your database tables. Check your virtual - environment's "bin" directory for this script and try to run it. +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description 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 -- cgit v1.2.3