summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/quick_tour.rst8
-rw-r--r--docs/quick_tour/logging/.gitignore21
-rw-r--r--docs/quick_tour/logging/hello_world/__init__.py9
-rw-r--r--docs/quick_tour/logging/hello_world/routes.py3
-rw-r--r--docs/quick_tour/logging/hello_world/templates/404.jinja28
-rw-r--r--docs/quick_tour/logging/hello_world/tests.py2
-rw-r--r--docs/quick_tour/logging/hello_world/views/__init__.py0
-rw-r--r--docs/quick_tour/logging/hello_world/views/default.py (renamed from docs/quick_tour/logging/hello_world/views.py)2
-rw-r--r--docs/quick_tour/logging/hello_world/views/notfound.py7
-rw-r--r--docs/quick_tour/logging/setup.py2
-rw-r--r--docs/quick_tour/package/.gitignore21
-rw-r--r--docs/quick_tour/package/hello_world/__init__.py9
-rw-r--r--docs/quick_tour/package/hello_world/routes.py3
-rw-r--r--docs/quick_tour/package/hello_world/templates/404.jinja28
-rw-r--r--docs/quick_tour/package/hello_world/tests.py2
-rw-r--r--docs/quick_tour/package/hello_world/views/__init__.py0
-rw-r--r--docs/quick_tour/package/hello_world/views/default.py (renamed from docs/quick_tour/package/hello_world/views.py)2
-rw-r--r--docs/quick_tour/package/hello_world/views/notfound.py7
-rw-r--r--docs/quick_tour/package/setup.py2
-rw-r--r--docs/quick_tour/sessions/.gitignore21
-rw-r--r--docs/quick_tour/sessions/hello_world/__init__.py13
-rw-r--r--docs/quick_tour/sessions/hello_world/routes.py3
-rw-r--r--docs/quick_tour/sessions/hello_world/templates/404.jinja28
-rw-r--r--docs/quick_tour/sessions/hello_world/tests.py2
-rw-r--r--docs/quick_tour/sessions/hello_world/views/__init__.py0
-rw-r--r--docs/quick_tour/sessions/hello_world/views/default.py (renamed from docs/quick_tour/sessions/hello_world/views.py)2
-rw-r--r--docs/quick_tour/sessions/hello_world/views/notfound.py7
-rw-r--r--docs/quick_tour/sessions/setup.py2
-rw-r--r--docs/quick_tour/sqla_demo/.gitignore21
-rw-r--r--docs/quick_tour/sqla_demo/README.txt12
-rw-r--r--docs/quick_tour/sqla_demo/development.ini11
-rw-r--r--docs/quick_tour/sqla_demo/production.ini9
-rw-r--r--docs/quick_tour/sqla_demo/pytest.ini2
-rw-r--r--docs/quick_tour/sqla_demo/setup.py7
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/__init__.py10
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/alembic/env.py58
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/alembic/script.py.mako24
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/alembic/versions/README.txt1
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/pshell.py12
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/scripts/initialize_db.py48
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/scripts/initializedb.py45
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/templates/mytemplate.jinja22
-rw-r--r--docs/quick_tour/sqla_demo/sqla_demo/views/default.py11
43 files changed, 354 insertions, 93 deletions
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 %}
+<div class="content">
+ <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/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/__init__.py b/docs/quick_tour/logging/hello_world/views/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/quick_tour/logging/hello_world/views/__init__.py
diff --git a/docs/quick_tour/logging/hello_world/views.py b/docs/quick_tour/logging/hello_world/views/default.py
index a648d6ba3..bbb99d78c 100644
--- a/docs/quick_tour/logging/hello_world/views.py
+++ b/docs/quick_tour/logging/hello_world/views/default.py
@@ -3,7 +3,7 @@ from pyramid.view import view_config
import logging
log = logging.getLogger(__name__)
-@view_config(route_name='home', renderer='templates/mytemplate.jinja2')
+@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 %}
+<div class="content">
+ <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/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/__init__.py b/docs/quick_tour/package/hello_world/views/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/quick_tour/package/hello_world/views/__init__.py
diff --git a/docs/quick_tour/package/hello_world/views.py b/docs/quick_tour/package/hello_world/views/default.py
index 67f78dad7..7458da006 100644
--- a/docs/quick_tour/package/hello_world/views.py
+++ b/docs/quick_tour/package/hello_world/views/default.py
@@ -1,6 +1,6 @@
from pyramid.view import view_config
-@view_config(route_name='home', renderer='templates/mytemplate.jinja2')
+@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 %}
+<div class="content">
+ <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/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/__init__.py b/docs/quick_tour/sessions/hello_world/views/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docs/quick_tour/sessions/hello_world/views/__init__.py
diff --git a/docs/quick_tour/sessions/hello_world/views.py b/docs/quick_tour/sessions/hello_world/views/default.py
index 9716f854e..33b8d8ded 100644
--- a/docs/quick_tour/sessions/hello_world/views.py
+++ b/docs/quick_tour/sessions/hello_world/views/default.py
@@ -3,7 +3,7 @@ from pyramid.view import view_config
import logging
log = logging.getLogger(__name__)
-@view_config(route_name='home', renderer='templates/mytemplate.jinja2')
+@view_config(route_name='home', renderer='../templates/mytemplate.jinja2')
def my_view(request):
log.debug('Some Message')
session = request.session
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 <config_uri> [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 @@
<h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Alchemy 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 %}
+{% 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