59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
|
# coding: utf-8
|
||
|
"""
|
||
|
This module contains a Bottle plugin to pass the database argument to any route
|
||
|
which needs it.
|
||
|
"""
|
||
|
from __future__ import (
|
||
|
absolute_import, division, print_function, unicode_literals
|
||
|
)
|
||
|
|
||
|
import functools
|
||
|
import inspect
|
||
|
|
||
|
import bottle
|
||
|
|
||
|
|
||
|
class DatabasePlugin(object):
|
||
|
name = 'database'
|
||
|
api = 2
|
||
|
KEYWORD = "db"
|
||
|
|
||
|
def __init__(self, get_session):
|
||
|
"""
|
||
|
:param keyword: Keyword used to inject session database in a route
|
||
|
:param create_session: SQLAlchemy session maker created with the
|
||
|
'sessionmaker' function. Will create its own if undefined.
|
||
|
"""
|
||
|
self.get_session = get_session
|
||
|
|
||
|
def setup(self, app):
|
||
|
"""
|
||
|
Make sure that other installed plugins don't affect the same
|
||
|
keyword argument and check if metadata is available.
|
||
|
"""
|
||
|
for other in app.plugins:
|
||
|
if not isinstance(other, DatabasePlugin):
|
||
|
continue
|
||
|
else:
|
||
|
raise bottle.PluginError(
|
||
|
"Found another conflicting Database plugin."
|
||
|
)
|
||
|
|
||
|
def apply(self, callback, route):
|
||
|
try:
|
||
|
callback_args = inspect.signature(route.callback).parameters
|
||
|
except AttributeError:
|
||
|
# inspect.signature does not exist on older Python
|
||
|
callback_args = inspect.getargspec(route.callback).args
|
||
|
|
||
|
if self.KEYWORD not in callback_args:
|
||
|
return callback
|
||
|
else:
|
||
|
with self.get_session() as session:
|
||
|
kwargs = {}
|
||
|
kwargs[self.KEYWORD] = session
|
||
|
return functools.partial(callback, **kwargs)
|
||
|
|
||
|
|
||
|
Plugin = DatabasePlugin
|