diff --git a/datasette/utils/__init__.py b/datasette/utils/__init__.py index e110891119..6eefc2dc5f 100644 --- a/datasette/utils/__init__.py +++ b/datasette/utils/__init__.py @@ -873,6 +873,15 @@ class LoadExtension(click.ParamType): name = "path:entrypoint?" def convert(self, value, param, ctx): + #:\ indicates we're on a Windows machine study the argument a bit more + if ":\\" in r"%r" % value: + path_entry = value.split(":", 2) + if len(path_entry) < 3: + return value + # argument contains a Windows/DOS path and an entry point + path = path_entry[0] + ":" + path_entry[1] + entrypoint = path_entry[-1] + return path, entrypoint if ":" not in value: return value path, entrypoint = value.split(":", 1) diff --git a/docs/spatialite.rst b/docs/spatialite.rst index fbe0d75f46..61a4a893bd 100644 --- a/docs/spatialite.rst +++ b/docs/spatialite.rst @@ -70,6 +70,11 @@ Depending on your distribution, you should be able to run Datasette something li If you are unsure of the location of the module, try running ``locate mod_spatialite`` and see what comes back. +Installing SpatiaLite on Windows +----------------------------- + +For Windows, you may find binaries on the `Gaia-SINS `_ home page. + Spatial indexing latitude/longitude columns =========================================== diff --git a/tests/test_loadextension.py b/tests/test_loadextension.py new file mode 100644 index 0000000000..3ceb372e4d --- /dev/null +++ b/tests/test_loadextension.py @@ -0,0 +1,31 @@ +from datasette.utils import LoadExtension + + +def test_dos_path(): + path_string = "C:\Windows\System32\mod_spatialite.dll" + le = LoadExtension() + path = le.convert(path_string, None, None) + assert path == "C:\Windows\System32\mod_spatialite.dll" + + +def test_dos_pathentry(): + path_entry = "C:\Windows\System32\mod_spatialite.dll:testentry" + le = LoadExtension() + pathen, entry = le.convert(path_entry, None, None) + assert pathen == "C:\Windows\System32\mod_spatialite.dll" + assert entry == "testentry" + + +def test_linux_path(): + path_string = "/base/test/test2" + le = LoadExtension() + path = le.convert(path_string, None, None) + assert path == path_string + + +def test_linux_path_entry(): + path_string = "/base/test/test2:testentry" + le = LoadExtension() + path, entry = le.convert(path_string, None, None) + assert path == "/base/test/test2" + assert entry == "testentry"