diff --git a/README.md b/README.md index ba9f59b9..f70d4e02 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,7 @@ This will create a docker image containing both the datasette application and th files --install TEXT Additional packages (e.g. plugins) to install --spatialite Enable SpatialLite extension + --version-note TEXT Additional note to show on /-/versions --title TEXT Title for metadata --license TEXT License label for metadata --license_url TEXT License URL for metadata @@ -209,6 +210,7 @@ If you have docker installed you can use `datasette package` to create a new Doc files --install TEXT Additional packages (e.g. plugins) to install --spatialite Enable SpatialLite extension + --version-note TEXT Additional note to show on /-/versions --title TEXT Title for metadata --license TEXT License label for metadata --license_url TEXT License URL for metadata diff --git a/datasette/app.py b/datasette/app.py index 871a4bf1..70f2a93f 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -119,6 +119,7 @@ class Datasette: plugins_dir=None, static_mounts=None, config=None, + version_note=None, ): self.files = files self.cache_headers = cache_headers @@ -131,6 +132,7 @@ class Datasette: self.plugins_dir = plugins_dir self.static_mounts = static_mounts or [] self.config = dict(DEFAULT_CONFIG, **(config or {})) + self.version_note = version_note self.executor = futures.ThreadPoolExecutor( max_workers=self.config["num_sql_threads"] ) @@ -298,12 +300,14 @@ class Datasette: fts_versions.append(fts) except sqlite3.OperationalError: continue - + datasette_version = {"version": __version__} + if self.version_note: + datasette_version["note"] = self.version_note return { "python": { "version": ".".join(map(str, sys.version_info[:3])), "full": sys.version }, - "datasette": {"version": __version__}, + "datasette": datasette_version, "sqlite": { "version": sqlite_version, "fts_versions": fts_versions, diff --git a/datasette/cli.py b/datasette/cli.py index 04bf2dfa..ebba0244 100644 --- a/datasette/cli.py +++ b/datasette/cli.py @@ -136,6 +136,7 @@ def inspect(files, inspect_file, sqlite_extensions): @click.option( "--spatialite", is_flag=True, help="Enable SpatialLite extension" ) +@click.option("--version-note", help="Additional note to show on /-/versions") @click.option("--title", help="Title for metadata") @click.option("--license", help="License label for metadata") @click.option("--license_url", help="License URL for metadata") @@ -155,6 +156,7 @@ def publish( static, install, spatialite, + version_note, **extra_metadata ): """ @@ -200,6 +202,7 @@ def publish( static, install, spatialite, + version_note, extra_metadata, ): args = [] @@ -373,6 +376,7 @@ def skeleton(files, metadata, sqlite_extensions): @click.option( "--spatialite", is_flag=True, help="Enable SpatialLite extension" ) +@click.option("--version-note", help="Additional note to show on /-/versions") @click.option("--title", help="Title for metadata") @click.option("--license", help="License label for metadata") @click.option("--license_url", help="License URL for metadata") @@ -389,6 +393,7 @@ def package( static, install, spatialite, + version_note, **extra_metadata ): "Package specified SQLite files into a new datasette Docker container" @@ -412,6 +417,7 @@ def package( static, install, spatialite, + version_note, extra_metadata, ): args = ["docker", "build"] @@ -478,6 +484,7 @@ def package( help="Set config option using configname:value datasette.readthedocs.io/en/latest/config.html", multiple=True, ) +@click.option("--version-note", help="Additional note to show on /-/versions") @click.option( "--help-config", is_flag=True, @@ -497,6 +504,7 @@ def serve( plugins_dir, static, config, + version_note, help_config, ): """Serve up specified SQLite database files with a web UI""" @@ -538,6 +546,7 @@ def serve( plugins_dir=plugins_dir, static_mounts=static, config=dict(config), + version_note=version_note, ) # Force initial hashing/table counting ds.inspect() diff --git a/datasette/utils.py b/datasette/utils.py index 033f2c22..a179eddf 100644 --- a/datasette/utils.py +++ b/datasette/utils.py @@ -241,7 +241,7 @@ def escape_sqlite(s): return '[{}]'.format(s) -def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, plugins_dir, static, install, spatialite): +def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, plugins_dir, static, install, spatialite, version_note): cmd = ['"datasette"', '"serve"', '"--host"', '"0.0.0.0"'] cmd.append('"' + '", "'.join(files) + '"') cmd.extend(['"--cors"', '"--port"', '"8001"', '"--inspect-file"', '"inspect-data.json"']) @@ -251,6 +251,8 @@ def make_dockerfile(files, metadata_file, extra_options, branch, template_dir, p cmd.extend(['"--template-dir"', '"templates/"']) if plugins_dir: cmd.extend(['"--plugins-dir"', '"plugins/"']) + if version_note: + cmd.extend(['"--version-note"', '"{}"'.format(version_note)]) if static: for mount_point, _ in static: cmd.extend(['"--static"', '"{}:{}"'.format(mount_point, mount_point)]) @@ -293,6 +295,7 @@ def temporary_docker_directory( static, install, spatialite, + version_note, extra_metadata=None ): extra_metadata = extra_metadata or {} @@ -324,6 +327,7 @@ def temporary_docker_directory( static, install, spatialite, + version_note, ) os.chdir(datasette_dir) if metadata_content: diff --git a/tests/test_utils.py b/tests/test_utils.py index d12bf927..e168c3f2 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -252,6 +252,7 @@ def test_temporary_docker_directory_uses_hard_link(): static=[], install=[], spatialite=False, + version_note=None, ) as temp_docker: hello = os.path.join(temp_docker, 'hello') assert 'world' == open(hello).read() @@ -278,6 +279,7 @@ def test_temporary_docker_directory_uses_copy_if_hard_link_fails(mock_link): static=[], install=[], spatialite=False, + version_note=None, ) as temp_docker: hello = os.path.join(temp_docker, 'hello') assert 'world' == open(hello).read()