datasette publish/package --spatialite, closes #243

New command-line argument which causes SpatiaLite to be installed and
configured for the published Datasette.

	datasette publish now --spatialite mydb.db
custom-router
Simon Willison 2018-05-31 07:16:50 -07:00
rodzic 969771770f
commit b18e451585
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 17E2DEA2588B7F52
3 zmienionych plików z 25 dodań i 2 usunięć

Wyświetl plik

@ -179,6 +179,7 @@ This will create a docker image containing both the datasette application and th
--static STATIC MOUNT mountpoint:path-to-directory for serving static --static STATIC MOUNT mountpoint:path-to-directory for serving static
files files
--install TEXT Additional packages (e.g. plugins) to install --install TEXT Additional packages (e.g. plugins) to install
--spatialite Enable SpatialLite extension
--title TEXT Title for metadata --title TEXT Title for metadata
--license TEXT License label for metadata --license TEXT License label for metadata
--license_url TEXT License URL for metadata --license_url TEXT License URL for metadata
@ -206,6 +207,7 @@ If you have docker installed you can use `datasette package` to create a new Doc
--static STATIC MOUNT mountpoint:path-to-directory for serving static --static STATIC MOUNT mountpoint:path-to-directory for serving static
files files
--install TEXT Additional packages (e.g. plugins) to install --install TEXT Additional packages (e.g. plugins) to install
--spatialite Enable SpatialLite extension
--title TEXT Title for metadata --title TEXT Title for metadata
--license TEXT License label for metadata --license TEXT License label for metadata
--license_url TEXT License URL for metadata --license_url TEXT License URL for metadata

Wyświetl plik

@ -122,6 +122,9 @@ def inspect(files, inspect_file, sqlite_extensions):
help="Additional packages (e.g. plugins) to install", help="Additional packages (e.g. plugins) to install",
multiple=True, multiple=True,
) )
@click.option(
"--spatialite", is_flag=True, help="Enable SpatialLite extension"
)
@click.option("--title", help="Title for metadata") @click.option("--title", help="Title for metadata")
@click.option("--license", help="License label for metadata") @click.option("--license", help="License label for metadata")
@click.option("--license_url", help="License URL for metadata") @click.option("--license_url", help="License URL for metadata")
@ -139,6 +142,7 @@ def publish(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
**extra_metadata **extra_metadata
): ):
""" """
@ -183,6 +187,7 @@ def publish(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
extra_metadata, extra_metadata,
): ):
if force: if force:
@ -335,6 +340,9 @@ def skeleton(files, metadata, sqlite_extensions):
help="Additional packages (e.g. plugins) to install", help="Additional packages (e.g. plugins) to install",
multiple=True, multiple=True,
) )
@click.option(
"--spatialite", is_flag=True, help="Enable SpatialLite extension"
)
@click.option("--title", help="Title for metadata") @click.option("--title", help="Title for metadata")
@click.option("--license", help="License label for metadata") @click.option("--license", help="License label for metadata")
@click.option("--license_url", help="License URL for metadata") @click.option("--license_url", help="License URL for metadata")
@ -350,6 +358,7 @@ def package(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
**extra_metadata **extra_metadata
): ):
"Package specified SQLite files into a new datasette Docker container" "Package specified SQLite files into a new datasette Docker container"
@ -372,6 +381,7 @@ def package(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
extra_metadata, extra_metadata,
): ):
args = ["docker", "build"] args = ["docker", "build"]

Wyświetl plik

@ -31,6 +31,13 @@ reserved_words = set((
'vacuum values view virtual when where with without' 'vacuum values view virtual when where with without'
).split()) ).split())
SPATIALITE_DOCKERFILE_EXTRAS = r'''
RUN apt-get update && \
apt-get install -y python3-dev gcc libsqlite3-mod-spatialite && \
rm -rf /var/lib/apt/lists/*
ENV SQLITE_EXTENSIONS /usr/lib/x86_64-linux-gnu/mod_spatialite.so
'''
class InterruptedError(Exception): class InterruptedError(Exception):
pass pass
@ -241,7 +248,7 @@ def escape_sqlite(s):
return '[{}]'.format(s) return '[{}]'.format(s)
def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, plugins_dir, static, install): def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, plugins_dir, static, install, spatialite):
cmd = ['"datasette"', '"serve"', '"--host"', '"0.0.0.0"'] cmd = ['"datasette"', '"serve"', '"--host"', '"0.0.0.0"']
cmd.append('"' + '", "'.join(files) + '"') cmd.append('"' + '", "'.join(files) + '"')
cmd.extend(['"--cors"', '"--port"', '"8001"', '"--inspect-file"', '"inspect-data.json"']) cmd.extend(['"--cors"', '"--port"', '"8001"', '"--inspect-file"', '"inspect-data.json"'])
@ -266,9 +273,10 @@ def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, p
install = ['datasette'] + list(install) install = ['datasette'] + list(install)
return ''' return '''
FROM python:3 FROM python:3.6-slim-stretch
COPY . /app COPY . /app
WORKDIR /app WORKDIR /app
{spatialite_extras}
RUN pip install {install_from} RUN pip install {install_from}
RUN datasette inspect {files} --inspect-file inspect-data.json RUN datasette inspect {files} --inspect-file inspect-data.json
EXPOSE 8001 EXPOSE 8001
@ -276,6 +284,7 @@ CMD [{cmd}]'''.format(
files=' '.join(files), files=' '.join(files),
cmd=', '.join(cmd), cmd=', '.join(cmd),
install_from=' '.join(install), install_from=' '.join(install),
spatialite_extras=SPATIALITE_DOCKERFILE_EXTRAS if spatialite else '',
).strip() ).strip()
@ -290,6 +299,7 @@ def temporary_docker_directory(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
extra_metadata=None extra_metadata=None
): ):
extra_metadata = extra_metadata or {} extra_metadata = extra_metadata or {}
@ -320,6 +330,7 @@ def temporary_docker_directory(
plugins_dir, plugins_dir,
static, static,
install, install,
spatialite,
) )
os.chdir(datasette_dir) os.chdir(datasette_dir)
if metadata_content: if metadata_content: