Add an import plugin system, with the Overpass POI query as its first plugin
A plugin is a directory under plugins/ with a plugin.json manifest
({"label": "...", "command": "./run.sh"}) plus a script that reads
--south/--west/--north/--east and prints a GeoJSON FeatureCollection
to stdout (lib/maptool/plugins.rb) — that's the entire interface a
plugin needs to know about this app. The sidebar's new import icon
(logged in only, GET /api/plugins + POST /api/plugins/:name/run) lists
whatever's found and runs one for the current map viewport, saving its
output as a new .geojson file the same way an upload would be.
The point: a scraper for a site whose ToS forbids that (Park4Night,
iOverlander, Freecampsites) doesn't need to live in this public repo
to work here — its own directory just goes under plugins/ locally and
is never git add'ed, no special-casing needed anywhere.
plugins/overpass-pois wraps the existing rake overpass:pois query as
the first, in-repo, reference example of the contract.
Also fills in four modules (auth.js, locate.js, measure.js, notes.js)
missing from layout.erb's cache-busting importmap alongside adding
plugins.js's own entry — a pre-existing gap that meant they could keep
serving a stale cached copy across a deploy despite the importmap
existing specifically to prevent that.
This commit is contained in:
1 parent
2b49eda7cb
commit
72ffd0ef18
17 files changed
+434
-14
No files matched your search
@@ -49,6 +49,7 @@ class AppTest < Minitest::Test
|
||||
assert_equal 401, request.delete("/api/gpx/file/x.gpx").status
|
||||
assert_equal 401, request.delete("/api/gpx/folder/x").status
|
||||
assert_equal 401, request.post("/api/gpx/move").status
|
||||
assert_equal 401, request.post("/api/plugins/test-plugin/run").status
|
||||
end
|
||||
|
||||
# --- GPX/FIT upload and the tree ---
|
||||
@@ -290,6 +291,42 @@ class AppTest < Minitest::Test
|
||||
assert_equal 404, response.status
|
||||
end
|
||||
|
||||
# --- Import plugins (lib/maptool/plugins.rb) ---
|
||||
|
||||
def test_plugins_lists_whatever_is_on_disk
|
||||
response = request.get("/api/plugins")
|
||||
assert_equal 200, response.status
|
||||
assert_equal [{ "name" => "test-plugin", "label" => "Test plugin" }], json_body(response)
|
||||
end
|
||||
|
||||
def test_plugins_run_saves_the_output_as_a_new_geojson_file
|
||||
response = request.post(
|
||||
"/api/plugins/test-plugin/run",
|
||||
params: { south: "48.0", west: "17.0", north: "48.1", east: "17.1" },
|
||||
**logged_in_env,
|
||||
)
|
||||
assert_equal 200, response.status
|
||||
body = json_body(response)
|
||||
assert_equal "test-plugin.geojson", body["path"]
|
||||
|
||||
saved = json_body(request.get("/api/gpx/file/#{body["path"]}"))
|
||||
assert_equal "Test POI", saved["features"][0]["properties"]["name"]
|
||||
end
|
||||
|
||||
def test_plugins_run_requires_a_bbox
|
||||
response = request.post("/api/plugins/test-plugin/run", **logged_in_env)
|
||||
assert_equal 400, response.status
|
||||
end
|
||||
|
||||
def test_plugins_run_unknown_plugin_is_502
|
||||
response = request.post(
|
||||
"/api/plugins/nope/run",
|
||||
params: { south: "48.0", west: "17.0", north: "48.1", east: "17.1" },
|
||||
**logged_in_env,
|
||||
)
|
||||
assert_equal 502, response.status
|
||||
end
|
||||
|
||||
# --- LiveTrack webhook ---
|
||||
|
||||
def test_livetrack_webhook_requires_the_configured_secret
|
||||
|
||||
Reference in new issue
Block a user