Fix: tests

This commit is contained in:
Pieter Vander Vennet 2024-12-17 04:39:38 +01:00
parent 01cc2f4170
commit 5b43316f10
7 changed files with 205 additions and 46 deletions

View file

@ -20,6 +20,6 @@
{"type": "perf", "hidden": true}, {"type": "perf", "hidden": true},
{"type": "test", "hidden": true} {"type": "test", "hidden": true}
], ],
"commitUrlFormat": "https://github.com/pietervdvn/mapcomplete/commits{{hash}}", "commitUrlFormat": "https://github.com/pietervdvn/mapcomplete/commits/{{hash}}",
"compareUrlFormat": "https://github.com/pietervdvn/mapcomplete/compare/{{previousTag}}...{{currentTag}}" "compareUrlFormat": "https://github.com/pietervdvn/mapcomplete/compare/{{previousTag}}...{{currentTag}}"
} }

View file

@ -2036,6 +2036,9 @@
}, },
"title": { "title": {
"mappings": { "mappings": {
"0": {
"then": "{name}"
},
"1": { "1": {
"then": "Vogelkijkhut {name}" "then": "Vogelkijkhut {name}"
}, },
@ -6340,6 +6343,11 @@
} }
}, },
"title": { "title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Natuurgebied" "render": "Natuurgebied"
} }
}, },
@ -6871,6 +6879,21 @@
"render": "Picknicktafel" "render": "Picknicktafel"
} }
}, },
"play_forest": {
"description": "Een speelbos is een vrij toegankelijke zone in een bos",
"name": "Speelbossen",
"title": {
"mappings": {
"0": {
"then": "{name}"
},
"1": {
"then": "Speelbos {name}"
}
},
"render": "Speelbos"
}
},
"playground": { "playground": {
"deletion": { "deletion": {
"nonDeleteMappings": { "nonDeleteMappings": {
@ -8428,6 +8451,9 @@
}, },
"title": { "title": {
"mappings": { "mappings": {
"0": {
"then": "{name}"
},
"1": { "1": {
"then": "Voetpad" "then": "Voetpad"
}, },
@ -10580,13 +10606,25 @@
} }
}, },
"village_green": { "village_green": {
"description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)" "description": "Een laag die dorpsgroen toont (gemeenschapsgroen, maar niet echt een park)",
"name": "Speelweide",
"title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Speelweide"
}
}, },
"visitor_information_centre": { "visitor_information_centre": {
"description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.", "description": "Een bezoekerscentrum biedt informatie over een specifieke attractie of bezienswaardigheid waar het is gevestigd.",
"name": "Bezoekerscentrum", "name": "Bezoekerscentrum",
"title": { "title": {
"mappings": { "mappings": {
"0": {
"then": "{name:nl}"
},
"1": { "1": {
"then": "{name}" "then": "{name}"
} }

View file

@ -653,8 +653,37 @@
"building type": { "building type": {
"question": "Wat voor soort gebouw is dit?" "question": "Wat voor soort gebouw is dit?"
}, },
"grb-fixme": {
"mappings": {
"0": {
"then": "Geen fixme"
}
},
"question": "Wat zegt de fixme?",
"render": "De fixme is <b>{fixme}</b>"
},
"grb-housenumber": {
"mappings": {
"0": {
"then": "Geen huisnummer"
}
},
"question": "Wat is het huisnummer?",
"render": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"grb-min-level": {
"question": "Hoeveel verdiepingen ontbreken?",
"render": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"grb-reference": { "grb-reference": {
"render": "Werd geïmporteerd vanuit GRB, het referentienummer is {source:geometry:ref}" "render": "Werd geïmporteerd vanuit GRB, het referentienummer is {source:geometry:ref}"
},
"grb-street": {
"question": "Wat is de straat?",
"render": "De straat is <b>{addr:street}</b>"
},
"grb-unit": {
"render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
} }
} }
}, },
@ -671,9 +700,36 @@
} }
} }
} }
},
"5": {
"override": {
"tagRenderings+": {
"0": {
"mappings": {
"0": {
"then": "Geen omliggend OSM-gebouw gevonden"
} }
} }
}, },
"3": {
"mappings": {
"0": {
"then": "Geen omliggend OSM-gebouw gevonden. Een omliggend gebouw is nodig om dit punt als adres punt toe te voegen. <div class=subtle>Importeer eerst de gebouwen. Vernieuw dan de pagina om losse adressen toe te voegen</div>"
}
},
"render": {
"special": {
"text": "Voeg dit adres als een nieuw adrespunt toe"
}
}
}
}
}
}
},
"shortDescription": "Grb import helper tool",
"title": "GRB import helper"
},
"guideposts": { "guideposts": {
"description": "Wegwijzers (ook wel handwijzer genoemd) zijn vaak te vinden langs officiële wandel-, fiets-, ski- of paardrijroutes om de richtingen naar verschillende bestemmingen aan te geven. Vaak zijn ze vernoemd naar een regio of plaats en geven ze de hoogte aan.\n\nDe positie van een wegwijzer kan door een wandelaar/fietser/renner/skiër worden gebruikt als bevestiging van de huidige positie, vooral als ze een gedrukte kaart zonder GPS-ontvanger gebruiken. ", "description": "Wegwijzers (ook wel handwijzer genoemd) zijn vaak te vinden langs officiële wandel-, fiets-, ski- of paardrijroutes om de richtingen naar verschillende bestemmingen aan te geven. Vaak zijn ze vernoemd naar een regio of plaats en geven ze de hoogte aan.\n\nDe positie van een wegwijzer kan door een wandelaar/fietser/renner/skiër worden gebruikt als bevestiging van de huidige positie, vooral als ze een gedrukte kaart zonder GPS-ontvanger gebruiken. ",
"title": "Wegwijzers" "title": "Wegwijzers"
@ -1108,6 +1164,11 @@
}, },
"title": "Dierenartsen, hondenloopzones en andere huisdiervriendelijke plaatsen" "title": "Dierenartsen, hondenloopzones en andere huisdiervriendelijke plaatsen"
}, },
"play_forests": {
"description": "Een speelbos is een zone in een bos die vrij toegankelijk is voor spelende kinderen. Deze wordt in bossen van het Agentschap Natuur en bos altijd aangeduid met het overeenkomstige bord.",
"shortDescription": "Deze kaart toont speelbossen",
"title": "Speelbossen"
},
"playgrounds": { "playgrounds": {
"description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen", "description": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen",
"shortDescription": "Een kaart met speeltuinen", "shortDescription": "Een kaart met speeltuinen",
@ -1181,6 +1242,47 @@
"description": "Alles om te skiën", "description": "Alles om te skiën",
"title": "Skipistes en kabelbanen" "title": "Skipistes en kabelbanen"
}, },
"speelplekken": {
"description": "<h3>Welkom bij de Groendoener!</h3>De Zuidrand dat is spelen, ravotten, chillen, wandelen,… in het groen. Meer dan <b>200 grote en kleine speelplekken</b> liggen er in parken, in bossen en op pleintjes te wachten om ontdekt te worden. De verschillende speelplekken werden getest én goedgekeurd door kinder- en jongerenreporters uit de Zuidrand. Met leuke challenges dagen de reporters jou uit om ook op ontdekking te gaan. Klik op een speelplek op de kaart, bekijk het filmpje en ga op verkenning!<br/><br/>Het project groendoener kadert binnen het strategisch project <a href='https://www.provincieantwerpen.be/aanbod/dlm/samenwerkingsverbanden/zuidrand/projecten/strategisch-project-beleefbare-open-ruimte.html' target='_blank'>Beleefbare Open Ruimte in de Antwerpse Zuidrand</a> en is een samenwerking tussen het departement Leefmilieu van provincie Antwerpen, Sportpret vzw, een OpenStreetMap-België Consultent en Createlli vzw. Het project kwam tot stand met steun van Departement Omgeving van de Vlaamse Overheid.<br/><img class='w-full md:w-1/2' src='./assets/themes/speelplekken/provincie_antwerpen.jpg'/><img class='w-full md:w-1/2' src='./assets/themes/speelplekken/Departement_Omgeving_Vlaanderen.png'/>",
"layers": {
"6": {
"name": "Wandelroutes van provincie Antwerpen",
"tagRenderings": {
"walk-description": {
"render": "<h3>Korte beschrijving:</h3>{description}"
},
"walk-length": {
"render": "Deze wandeling is <b>{_length:km}km</b> lang"
},
"walk-operator": {
"question": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?"
},
"walk-operator-email": {
"question": "Naar wie kan men emailen bij problemen rond signalisatie?",
"render": "Bij problemen met signalisatie kan men emailen naar <a href='mailto:{operator:email}'>{operator:email}</a>"
},
"walk-type": {
"mappings": {
"0": {
"then": "Dit is een internationale wandelroute"
},
"1": {
"then": "Dit is een nationale wandelroute"
},
"2": {
"then": "Dit is een regionale wandelroute"
},
"3": {
"then": "Dit is een lokale wandelroute"
}
}
}
}
}
},
"shortDescription": "Speelplekken in de Antwerpse Zuidrand",
"title": "Welkom bij de groendoener!"
},
"sport_pitches": { "sport_pitches": {
"description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen", "description": "Een sportveld is een ingerichte plaats met infrastructuur om een sport te beoefenen",
"shortDescription": "Deze kaart toont sportvelden", "shortDescription": "Deze kaart toont sportvelden",
@ -1301,6 +1403,10 @@
}, },
"title": "Straatverlichting" "title": "Straatverlichting"
}, },
"street_lighting_assen": {
"description": "Op deze kaart vind je alles over straatlantaarns + een dataset van Assen",
"title": "Straatverlichting - Assen"
},
"surveillance": { "surveillance": {
"description": "Op deze open kaart kan je bewakingscamera's vinden.", "description": "Op deze open kaart kan je bewakingscamera's vinden.",
"shortDescription": "Bewakingscameras en dergelijke", "shortDescription": "Bewakingscameras en dergelijke",
@ -1414,6 +1520,10 @@
"description": "Kaart met afvalbakken en recyclingfaciliteiten.", "description": "Kaart met afvalbakken en recyclingfaciliteiten.",
"title": "Afval" "title": "Afval"
}, },
"waste_assen": {
"description": "Kaart met afvalbakken en recyclingfaciliteiten + een dataset voor Assen.",
"title": "Afval - Assen"
},
"waste_basket": { "waste_basket": {
"description": "Op deze kaart vind je afvalbakken bij jou in de buurt. Als er een afvalbak ontbreekt op deze kaart, kun je deze zelf toevoegen", "description": "Op deze kaart vind je afvalbakken bij jou in de buurt. Als er een afvalbak ontbreekt op deze kaart, kun je deze zelf toevoegen",
"shortDescription": "Een kaart met vuilnisbakken", "shortDescription": "Een kaart met vuilnisbakken",

12
package-lock.json generated
View file

@ -8020,9 +8020,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001687", "version": "1.0.30001689",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz",
"integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -26969,9 +26969,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001687", "version": "1.0.30001689",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz",
"integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==",
"dev": true "dev": true
}, },
"canonicalize": { "canonicalize": {

View file

@ -13,7 +13,7 @@ import { MaprouletteStatus } from "../../src/Logic/Maproulette"
class VeloParkToGeojson extends Script { class VeloParkToGeojson extends Script {
constructor() { constructor() {
super( super(
"Downloads the latest Velopark data and converts it to a geojson, which will be saved at the current directory", "Downloads the latest Velopark data and converts it to a geojson, which will be saved at the current directory"
) )
} }
@ -29,8 +29,8 @@ class VeloParkToGeojson extends Script {
} }
: features, : features,
null, null,
" ", " "
), )
) )
console.log("Written", file, "(" + features.length, " features)") console.log("Written", file, "(" + features.length, " features)")
} }
@ -66,7 +66,7 @@ class VeloParkToGeojson extends Script {
console.log("Downloading velopark data") console.log("Downloading velopark data")
// Download data for NIS-code 1000. 1000 means: all of belgium // Download data for NIS-code 1000. 1000 means: all of belgium
const url = "https://www.velopark.be/api/parkings/1000" const url = "https://www.velopark.be/api/parkings/1000"
const allVeloparkRaw= (await Utils.downloadJson<{ url: string }[]>(url)) const allVeloparkRaw = await Utils.downloadJson<{ url: string }[]>(url)
// Example multi-entry: https://data.velopark.be/data/Stad-Izegem_IZE_015 // Example multi-entry: https://data.velopark.be/data/Stad-Izegem_IZE_015
let failed = 0 let failed = 0
console.log("Got", allVeloparkRaw.length, "items") console.log("Got", allVeloparkRaw.length, "items")
@ -86,7 +86,7 @@ class VeloParkToGeojson extends Script {
console.error("Loading ", f.url, " failed due to", e) console.error("Loading ", f.url, " failed due to", e)
failed++ failed++
} }
}), })
) )
console.log("Batch complete:", i) console.log("Batch complete:", i)
} }
@ -94,7 +94,7 @@ class VeloParkToGeojson extends Script {
"Fetching data done, got ", "Fetching data done, got ",
allVelopark.length + "/" + allVeloparkRaw.length, allVelopark.length + "/" + allVeloparkRaw.length,
"failed:", "failed:",
failed, failed
) )
VeloParkToGeojson.exportGeojsonTo("velopark_all", allVelopark) VeloParkToGeojson.exportGeojsonTo("velopark_all", allVelopark)
@ -142,24 +142,34 @@ class VeloParkToGeojson extends Script {
private static async fetchMapRouletteClosedItems() { private static async fetchMapRouletteClosedItems() {
const challenges = ["https://maproulette.org/api/v2/challenge/view/43282"] const challenges = ["https://maproulette.org/api/v2/challenge/view/43282"]
const solvedRefs: Set<string> = new Set<string>(); const solvedRefs: Set<string> = new Set<string>()
for (const url of challenges) { for (const url of challenges) {
const data = await Utils.downloadJson<FeatureCollection<Point, { const data = await Utils.downloadJson<
"mr_taskId": string, FeatureCollection<
"ref:velopark": string, Point,
mr_taskStatus: MaprouletteStatus, {
mr_taskId: string
"ref:velopark": string
mr_taskStatus: MaprouletteStatus
mr_responses: string | undefined mr_responses: string | undefined
}>>(url) }
>
>(url)
for (const challenge of data.features) { for (const challenge of data.features) {
const status = challenge.properties.mr_taskStatus const status = challenge.properties.mr_taskStatus
const isClosed = status === "Fixed" || status === "False_positive" || status === "Already fixed" || status === "Too_Hard" || status === "Deleted" const isClosed =
if(isClosed){ status === "Fixed" ||
status === "False_positive" ||
status === "Already fixed" ||
status === "Too_Hard" ||
status === "Deleted"
if (isClosed) {
const ref = challenge.properties["ref:velopark"] const ref = challenge.properties["ref:velopark"]
solvedRefs .add(ref) solvedRefs.add(ref)
} }
} }
} }
console.log("Detected", solvedRefs,"as closed on mapRoulette") console.log("Detected", solvedRefs, "as closed on mapRoulette")
return solvedRefs return solvedRefs
} }
@ -181,32 +191,33 @@ class VeloParkToGeojson extends Script {
[], [],
Constants.defaultOverpassUrls[0], Constants.defaultOverpassUrls[0],
new ImmutableStore(60 * 5), new ImmutableStore(60 * 5),
false, false
) )
const alreadyLinkedFeatures = (await alreadyLinkedQuery.queryGeoJson(bboxBelgium))[0] const alreadyLinkedFeatures = (await alreadyLinkedQuery.queryGeoJson(bboxBelgium))[0]
const seenIds = new Set<string>( const seenIds = new Set<string>(
alreadyLinkedFeatures.features.map((f) => f.properties?.["ref:velopark"]), alreadyLinkedFeatures.features.map((f) => f.properties?.["ref:velopark"])
) )
this.exportGeojsonTo("osm_with_velopark_link", <Feature[]>alreadyLinkedFeatures.features) this.exportGeojsonTo("osm_with_velopark_link", <Feature[]>alreadyLinkedFeatures.features)
console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref") console.log("OpenStreetMap contains", seenIds.size, "bicycle parkings with a velopark ref")
const features: Feature[] = allVelopark.filter( const features: Feature[] = allVelopark.filter(
(f) => !seenIds.has(f.properties["ref:velopark"]), (f) => !seenIds.has(f.properties["ref:velopark"])
) )
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced", features) VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced", features)
const synced =await this.fetchMapRouletteClosedItems() const synced = await this.fetchMapRouletteClosedItems()
const featuresMoreFiltered = features.filter( const featuresMoreFiltered = features.filter(
(f) => !synced.has(f.properties["ref:velopark"]) (f) => !synced.has(f.properties["ref:velopark"])
) )
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced_nonclosed", featuresMoreFiltered) VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced_nonclosed", featuresMoreFiltered)
const featuresMoreFilteredFailed = features.filter((f) =>
synced.has(f.properties["ref:velopark"])
const featuresMoreFilteredFailed = features.filter( )
(f) => synced.has(f.properties["ref:velopark"]) VeloParkToGeojson.exportGeojsonTo(
"velopark_nonsynced_human_import_failed",
featuresMoreFilteredFailed
) )
VeloParkToGeojson.exportGeojsonTo("velopark_nonsynced_human_import_failed", featuresMoreFilteredFailed)
const allProperties = new Set<string>() const allProperties = new Set<string>()
for (const feature of featuresMoreFiltered) { for (const feature of featuresMoreFiltered) {
@ -215,7 +226,7 @@ class VeloParkToGeojson extends Script {
allProperties.delete("ref:velopark") allProperties.delete("ref:velopark")
for (const feature of featuresMoreFiltered) { for (const feature of featuresMoreFiltered) {
allProperties.forEach((k) => { allProperties.forEach((k) => {
if(k === "ref:velopark"){ if (k === "ref:velopark") {
return return
} }
delete feature.properties[k] delete feature.properties[k]
@ -227,10 +238,10 @@ class VeloParkToGeojson extends Script {
public static async findMultiSection(): Promise<string[]> { public static async findMultiSection(): Promise<string[]> {
const url = "https://www.velopark.be/api/parkings/1000" const url = "https://www.velopark.be/api/parkings/1000"
const raw = await Utils.downloadJson<{"@graph": {}[], url: string}[]>(url) const raw = await Utils.downloadJson<{ "@graph": {}[]; url: string }[]>(url)
const multiEntries: string[] = [] const multiEntries: string[] = []
for (const entry of raw) { for (const entry of raw) {
if(entry["@graph"].length > 1){ if (entry["@graph"].length > 1) {
multiEntries.push(entry.url) multiEntries.push(entry.url)
} }
} }
@ -245,7 +256,7 @@ class VeloParkToGeojson extends Script {
VeloParkToGeojson.exportExtraAmenities(allVelopark) VeloParkToGeojson.exportExtraAmenities(allVelopark)
await VeloParkToGeojson.createDiff(allVelopark) await VeloParkToGeojson.createDiff(allVelopark)
console.log( console.log(
"Use vite-node scripts/velopark/compare.ts to compare the results and generate a diff file", "Use vite-node scripts/velopark/compare.ts to compare the results and generate a diff file"
) )
} }
} }

View file

@ -64,7 +64,7 @@ export default class Maproulette {
if (code === "Created") { if (code === "Created") {
return Maproulette.STATUS_OPEN return Maproulette.STATUS_OPEN
} }
const i = maprouletteStatus.findIndex(<any>code) const i = maprouletteStatus.indexOf(<any>code)
if (i < 0) { if (i < 0) {
return undefined return undefined
} }

View file

@ -128,7 +128,7 @@ describe("RewriteSpecial", function () {
expect(r).toEqual({ expect(r).toEqual({
id: "uk_addresses_import_button", id: "uk_addresses_import_button",
render: { render: {
"*": "{import_button(address,urpn_count=$urpn_count;ref:GB:uprn=$ref:GB:uprn$,Add this address,./assets/themes/uk_addresses/housenumber_add.svg,,,,)}", "*": "{import_button(address,urpn_count=$urpn_count;ref:GB:uprn=$ref:GB:uprn$,Add this address,./assets/themes/uk_addresses/housenumber_add.svg,,,,,)}",
}, },
}) })
}) })