Replaced app_factory with new Datasette class

This should make it easier to add unit tests.
pull/81/head
Simon Willison 2017-11-10 11:05:57 -08:00
rodzic 03c58fb350
commit 1c57bd202f
2 zmienionych plików z 47 dodań i 40 usunięć

Wyświetl plik

@ -69,10 +69,10 @@ def ensure_build_metadata(files, regenerate=False):
class BaseView(HTTPMethodView): class BaseView(HTTPMethodView):
template = None template = None
def __init__(self, files, jinja, executor): def __init__(self, datasette):
self.files = files self.files = datasette.files
self.jinja = jinja self.jinja = datasette.jinja
self.executor = executor self.executor = datasette.executor
def redirect(self, request, path): def redirect(self, request, path):
if request.query_string: if request.query_string:
@ -185,10 +185,10 @@ class BaseView(HTTPMethodView):
class IndexView(HTTPMethodView): class IndexView(HTTPMethodView):
def __init__(self, files, jinja, executor): def __init__(self, datasette):
self.files = files self.files = datasette.files
self.jinja = jinja self.jinja = datasette.jinja
self.executor = executor self.executor = datasette.executor
async def get(self, request): async def get(self, request):
databases = [] databases = []
@ -460,36 +460,43 @@ def sqlite_timelimit(conn, ms):
conn.set_progress_handler(None, 10000) conn.set_progress_handler(None, 10000)
def app_factory(files, num_threads=3): class Datasette:
app = Sanic(__name__) def __init__(self, files, num_threads=3):
executor = futures.ThreadPoolExecutor(max_workers=num_threads) self.files = files
jinja = SanicJinja2( self.num_threads = num_threads
app, self.executor = futures.ThreadPoolExecutor(
loader=FileSystemLoader([ max_workers=num_threads
str(app_root / 'datasette' / 'templates') )
])
) def app(self):
app.add_route(IndexView.as_view(files, jinja, executor), '/') app = Sanic(__name__)
# TODO: /favicon.ico and /-/static/ deserve far-future cache expires self.jinja = SanicJinja2(
app.add_route(favicon, '/favicon.ico') app,
app.static('/-/static/', str(app_root / 'datasette' / 'static')) loader=FileSystemLoader([
app.add_route( str(app_root / 'datasette' / 'templates')
DatabaseView.as_view(files, jinja, executor), ])
'/<db_name:[^/\.]+?><as_json:(.jsono?)?$>' )
) app.add_route(IndexView.as_view(self), '/')
app.add_route( # TODO: /favicon.ico and /-/static/ deserve far-future cache expires
DatabaseDownload.as_view(files, jinja, executor), app.add_route(favicon, '/favicon.ico')
'/<db_name:[^/]+?><as_db:(\.db)$>' app.static('/-/static/', str(app_root / 'datasette' / 'static'))
) app.add_route(
app.add_route( DatabaseView.as_view(self),
TableView.as_view(files, jinja, executor), '/<db_name:[^/\.]+?><as_json:(.jsono?)?$>'
'/<db_name:[^/]+>/<table:[^/]+?><as_json:(.jsono?)?$>' )
) app.add_route(
app.add_route( DatabaseDownload.as_view(self),
RowView.as_view(files, jinja, executor), '/<db_name:[^/]+?><as_db:(\.db)$>'
'/<db_name:[^/]+>/<table:[^/]+?>/<pk_path:[^/]+?><as_json:(.jsono?)?$>' )
) app.add_route(
return app TableView.as_view(self),
'/<db_name:[^/]+>/<table:[^/]+?><as_json:(.jsono?)?$>'
)
app.add_route(
RowView.as_view(self),
'/<db_name:[^/]+>/<table:[^/]+?>/<pk_path:[^/]+?><as_json:(.jsono?)?$>'
)
return app
class InvalidSql(Exception): class InvalidSql(Exception):

Wyświetl plik

@ -1,6 +1,6 @@
import click import click
from click_default_group import DefaultGroup from click_default_group import DefaultGroup
from .app import app_factory, ensure_build_metadata from .app import Datasette, ensure_build_metadata
@click.group(cls=DefaultGroup, default='serve', default_if_no_args=True) @click.group(cls=DefaultGroup, default='serve', default_if_no_args=True)
@ -29,5 +29,5 @@ def serve(files, host, port, debug, reload):
hupper.start_reloader('datasette.cli.serve') hupper.start_reloader('datasette.cli.serve')
click.echo('Serve! files={} on port {}'.format(files, port)) click.echo('Serve! files={} on port {}'.format(files, port))
app = app_factory(files) app = Datasette(files).app()
app.run(host=host, port=port, debug=debug) app.run(host=host, port=port, debug=debug)