kopia lustrzana https://github.com/simonw/datasette
Replaced app_factory with new Datasette class
This should make it easier to add unit tests.pull/81/head
rodzic
03c58fb350
commit
1c57bd202f
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Ładowanie…
Reference in New Issue