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

Wyświetl plik

@ -1,6 +1,6 @@
import click
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)
@ -29,5 +29,5 @@ def serve(files, host, port, debug, reload):
hupper.start_reloader('datasette.cli.serve')
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)